JDBC性能小贴
引言
本文翻译自 javarevisited。如需转载本文,请先参见文章末尾处的转载要求。
本文收集了一些用于提升 JDBC 性能的方法。Java 应用或 JavaEE Web 应用的性能至关重要,尤其是数据库后端对整体应用性能的影响显著。你是否经历过 Java 应用响应缓慢的案例(例如处理一个简单的请求都要花费数秒时间用于数据库访问、分页或排序)?下面这些贴士或许能帮助提升 Java 应用的性能。它们非常简单,同时也适用于其他使用数据库作为后端存储的编程语言。
这几个 JDBC 性能贴士虽然基础,但在实践中很多程序员经常忽略它们。当然,你也可以将本文视为数据库性能优化的一般性建议。
贴士一:使用缓存
统计应用中有多少数据库调用,并设法将它们减到最少。不管你信不信,性能问题的罪魁祸首大多数情况下是访问数据库的代码。因为连接到数据库需要建立连接(Connections),涉及往返的网络传输以及数据库系统后端的处理。
如果你可以把数据缓存下来,这是减少数据库调用最好的方式。即使你的应用数据是完全动态的,短暂的缓存也可以节省很大的数据库往返传输开销。加速 Java 应用后,至少能减少 20-50% 的数据库调用。如果想找出数据库调用热点,仅仅把 DAO 层的每个 DB 调用记录到日志中就行;如果记录好每个线程进入和退出数据库访问的时间更好,它能告诉你一个调用究竟花了多少时间。
贴士二:使用数据库索引
检查数据库列(Columns)上是否有索引。如果你正做查询发现所花的时间比预想的要长,那么首先想到的是检查在列上(正在查询的 WHERE 子句中的那列)是否建立了索引。程序员常犯这个错误,有索引和没有索引在做查询时有巨大的差异。
这条贴士在性能上至少能提速 100%,当然合适的索引更重要。太多的索引反而会减慢数据的插入和更新操作,因此使用索引的时候要小心。像 id、类别(category)、类(class)等字段上做索引是经常使用的场景。
贴士三:使用 PreparedStatement
使用 PreparedStatement 或者存储过程(Stored Procedure)执行查询时,PreparedStatement(预处理语句)比普通的 Statement 对象要快。因为数据库可以对查询语句做预处理和查询缓存计划。
因此,总是使用参数化形式的预处理语句,例如:
SELECT * FROM table WHERE id=?而不要使用字符串拼接的方式:
SELECT * FROM table WHERE id='" + id + "'"虽然后者仍是一个预处理语句但不是参数化的,使用第二种查询方式在性能上没有任何优势。更多参考可以查看 JDBC 为什么要使用 PreparedStatement 而不是 Statement。
贴士四:使用数据库连接池
连接池用来存放数据库连接(Connection)。创建数据库连接是个比较慢的过程而且会耗很长时间,所以如果每个请求都要创建一个连接,那么显然响应时间将会更长。
用连接池根据上游的流量及并发请求数创建适当数量的连接。即使连接池在开始的请求中创建连接、缓存连接会比较慢,但总体还是能减少不少开销。
贴士五:使用 JDBC 批量更新
使用 JDBC 批量更新操作能显著提升 Java 数据库应用的性能。你应该始终用批量处理来执行插入和更新操作,通过使用 Statement 或者 PreparedStatement 做批量查询,并用 executeBatch() 方法执行。
贴士六:取消自动提交
查询时设置 setAutoCommit(false)。默认 JDBC 连接自动提交模式是打开的,意味着每个独立的 SQL 语句都将在自己的事务中执行。然而你可以把 SQL 语句按组归到一个逻辑事务中去,这样通过调用 commit() 或 rollback() 要么提交要么回滚。
试着运行相同数量的查询次数,对比一下使用自动提交和不使用自动提交时的性能区别有多大的差异性。
总结
这些 Java 数据库应用性能小提示看起来非常简单,很多高级 Java 程序员能熟练运用在生产级代码中,但我还看到很多 Java 程序员并没有在乎这些,直到他们发现 Java 应用变得很慢时。所以对于新手来说有必要记住并使用它。同时你还可以使用这些 Java 性能小提示作为代码审查机制的一个参考,在你写的 Java 应用是使用数据库作为后端存储的时候。
以上就是关于如何改善 Java 应用程序性能的贴士,如果你有什么更好的提示不妨给我留言。
说明:本文核心观点翻译自 2012 年的技术文章。虽然 JDBC 基础原理至今未变,上述优化策略仍然适用,但具体实现细节可能随 JDK 版本或数据库驱动更新而有所差异。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/jdbc-xing-neng-xiao-tie.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。