关于结果集的经验之谈

有人说JDBC一个接口有什么好研究的。错,不管RowSet、JDBC、SQLJ都是上层东西,研究就研究数据库底层算法啊。但是你别忘了,hibernate为什么这么多人用,简单和高效是我们平常使用最需要的。接下来的文字都是我在结果集上的经验之谈。

        一、正确使用close:

        很多人使用了ResultSet、Statement、Connection不关闭,《java核心技术》中这样写:"如果Statement对象上有一个打开的结果集,那么调用close方法将自动关闭该结果集。同样地,调用Connection类的close方法将关闭该连接上的所有语句。"所以正确的关闭循序是1、ResultSet.close(), 2、Statement.close(), 3、Connection.close().

         并且该书还写了“如果所有连接都是短时性的,那么无需考虑关闭语句和结果集。只需将close放在finally块中。”注意这个“短时性”。我们很多数据库操作都不是短时性,一个事务可能拖很长,一个连接或长事务有很多的语句与结果集,那么该养成什么好习惯呢。在使用完一个结果集与语句后马上ResultSet.close(),Statement.close(),事务仍可继续。这样事务再大都能保证资源及时释放。

     二、正确使用事务:

         虽说表锁与行锁因数据库而异与sql语句无必然关系,但是事务在JDBC中非常重要。一个长长的事务操作期间,数据库的锁并不释放,而是等Connection.commit(),或Connection.rollback(),才将资源操作权交出来。所以合理划分自己程序数据库操作事务非常重要。千万不能锁A表时等着B表,而另一个事务锁着B表等A表,那就死锁了。

        养成事务提交和回滚好习惯,不能将commit的工作交给Connection.close去做。并且连接池的Connection.close可不会马上帮你关闭的。

    三、结果集的性能与效率:

        数据库操作速率与数据库数据处理算法、数据库性能配置、数据库锁状态等都有关系。我通过一次数据库操作调优来谈谈我们数据库操作的提高性能经验。

        首先,我们使用了DB2的排序操作,一开始数据量一大就报表空间不足,原来DB2将分页时的数据保存在系统临时表空间里,我们将表空间缓冲池设在驱动上,这样分页效率已经提高到最大。我曾经尝试过在分页sql中rownumber() over(ORDER BY ref_id ASC) AS rn 的over()中加去掉排序字段而放在where后排序,效果一样效率也一样。

      (未完待续)

你可能感兴趣的:(sql,算法,Hibernate,jdbc,db2)