众所都知,数据库事务及联接在java操作中是一个昂贵的开销,一些程序及效率的优化在这里有很大的优化空间,但感觉数据库的开启关闭好像没有统一和最优的方案,
如上图:假设AF为java中一次会话的过程,而bc和de表示java与数据库操作占用的过程(当然在会话中可能存在不止两次的数据库操作),现在可能有下面几种情况:
1),在A之前就开启数据库及事务,在F之后提交或回滚事务和断开数据库(这可能在有些架构中是这样实现的,因为作为程序员不用考虑数据库的联接关闭及事务,统一由公用类完成)。
2),在b之时开启在c之后断开,在d之时又开启,在e之后断开,这也很常见,典型的用时开,用完就断。
3),在b之时开启,在F之后断开,其实这种是跟第一种相同,只是一种改时罢了,因为我们可以确定在一次会话中第一次用数据库,有人可能会说在e之后断开不是更好,节省了ef过程的数据库联接开销,理论上是这样的,但是这是做不到的,因为我们不知道用了这次数据库后在这次会话中就不会再用了,所以我们只能在f点结束后统一断开及处理事务。
4),可能还有其它的方案是我不清楚的。
因此,我们可以看到在4方案没有明确定义之前,只有2和3是可比较的,对于数据库占有的时间来看,2方案是肯定优于3的,但是我们清楚数据库的开启及联接本身也是一个比较大的开销,就像一个电视机,多开些可能会浪费些电,但如果总是一开一关的话,电视机也容易坏。如要有一个统一的转化参考标准:一次开销代表多少,而占用的时间又代表多少,那么我们肯定可以选出一个最优方案来,但这看来是很难做到的(看来软件的设计远没有种田来的实在啊).
个人感觉应该采取第3种方案,因为一些非数据库的处理多半是内存中的处理及运算,应该很快(但话是不能绝对的,java的一些文件处理及远程调用等可能也很慢)。
如在数据库调用方面有何见解,望多探讨,以上属个人愚见,望能抛砖引玉。