大多数应用程序都需要访问数据库。据统计,在一个应用中,通过JDBC访问数据库的代码会占到30%左右。访问数据库的效率是决定程序的运行性能的关键因素之一。提高程序访问数据库的效率的总的原则是:减少建立数据库连接的次数,减少向数据库提交的SQL语句的数目,及时释放无用的Connection、Statement和ResultSet对象。下面总结了用于优化访问数据库代码的一些细节。
1.选择合适的JDBC驱动器
一般说来,应该优先考虑使用第3类和第4类驱动器,它们具有更高的运行性能,只有当这两类驱动器不存在的情况下,才考虑用第1类和第2类驱动器作为替代品。
2.优化数据库连接
采用连接池来重用有限的连接,减少连接数据库的次数。
3.控制事务
如果事务中包含多个操作,应该在手工提交模式下提交事务。此外,可通过Connection接口的setTransactionIsolation(int level)方法设置合适的事务隔离级别,如果希望应用程序有较好的并发性能,就要设置低一点的隔离级别。
4.优化Statement
如果一个SQL语句会被多次重复执行,应该使用PreparedStatement,而不是Statement。此外,对于大批量的更新数据库的操作,可以用Statement或者PreparedStatement来进行批量更新,与此相关的方法为:
addBatch(String):加入一个操作。
executeBatch():执行批量更新操作。
5.优化ResultSet
优化ResultSet体现在以下几个方面:
(1) 通过ResultSet、Statement或者Connection的setFetchSize()方法,来设置合理的批量抓取数据库中数据的数目。
(2) 如果不需要对结果集滚动和更新,那么应该采用默认的不支持滚动和更新的结果集,因为这种类型的结果集占用较少的系统资源,运行速度更快。
(3) 在ResultSet的getXXX()或setXXX()方法中,指定字段的索引位置比指定字段的名字具有更好的性能,例如以下第一段程序代码的性能优于第二段代码:
|
(4) 优化查询语句,运用表连接把多个查询语句合并为一个查询语句,从而减少向数据库提交的查询语句的数目。
6.及时释放无用的资源
及时显式地关闭无用的ResultSet、Statement和Connection对象。
7.合理建立索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。索引的使用要恰到好处,其使用原则如下:
(1) 为经常参与表连接,但是没有指定为外键的字段建立索引。
(2) 为频繁参与排序或分组(即进行“group by”或“order by”操作)的字段建立索引。
(3) 在where条件表达式中,为具有多种取值的字段建立检索,不要为仅有少量取值的字段建立索引。假定CUSTONERS表具有NAME(姓名)字段和SEX(性别)字段,这两个字段都会经常出现在where条件表达式中。NAME字段有多种取值,而SEX字段只有“female”和“male”两种取值,因此只需为NAME字段建立索引,而没有必要为SEX字段建立索引。如果对仅有少量取值的字段建立索引,那么不但不会提高查询效率,还会严重降低更新数据的速度。
(4) 如果待排序的字段有多个,可以为这些字段建立复合索引(Compound Index)。
上文参考孙卫琴的经典Java书籍《Java网络编程核心技术详解》。