JDBC应用的性能涉及到数据库、服务器、数据库驱动、系统的代码书写。这里谈论第4个方面。
一. Statement还是PreparedStatement
PreparedStatement的开销比Statement大,所以PreparedStatement的速度会比Statement慢,但是PreparedStatement会缓存预编译的SQL语句,而Statement则每次都重新编译SQL语句,所以对于多次使用的SQL来说PreparedStatement的效果会好点,但是对于只使用一次的SQL语句,则Statement效果更佳。
二. 批量操作
批量操作会把SQL语句一次性发给数据库,从而减少应用于数据库服务器的交互次数提高性能,但并不减少数据库服务器的I/O次数。在使用。在使用批量操作时应该设置每批数据的大小,否则可能内存溢出,在每批执行完毕后应该先关闭Statement或PreparedStatement释放内存。
三. 使用适当的setter跟getter
使用PreparedStatement设置数据用对应的SetXxx,ResultSet用对应的getXxx,而用get/setObject性能则比较差。
四. 使用适当的ResultSet
ResultSet有:
参数 int type
ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。
ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
ResultSet.TYPE_SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
参数 int concurrency
ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。
ResultSet.CONCUR_UPDATETABLE 能用结果集更新数据库中的表。
默认为:TYPE_FORWORD_ONLY跟CONCUR_READ_ONLY 此时效率最高。
五. 设置FectchSize
此参数每次从数据库查询的数据行数,默认各个数据库不一样。如果太小可能引起过多的网络交互。
六. 设置合适的事务级别
事务的隔离级别越高,所消耗的代价越到。所以设置合适的事务级别将提供性能。
七. 使用连接池
一般操作数据库时都要获取一个连接用完后再关闭,如何将一个连接放到连接池里,用的时候拿出来,用完了放回。这样将大大提高性能。