取下经,各位在Java项目里是如何管理数据库连接的?
小灰狼 2018-02-07 08:13:26 一个Java EE 项目里的业务逻辑可能会比较复杂,一个业务逻辑处理不往往不会是简单地对一个表进行操作,而是一连串的操作,并且是要形成一个事务
那么在业务逻辑处理过程中,就要求所有的对数据库的处理都是使用同一个连接,这样才能保证事务一致性,并且确保连接被及时关闭回收
如果是在纯Java Web项目中,我一般会把连接的 autocommit 设置为 false,然后使用一个连接工厂类统一管理连接,并且把连接和线程进行绑定(这是借鉴了 Hibernate 的思路,但我在 mybatis 中也是这么封装的)。从工厂类中取到的所有连接全部都是绑定在当前线程上的,以此保证每个业务逻辑子程序中取到的都是同一个连接。然后在 servlet filter 中统一关闭与线程绑定的连接。
如此一来,程序员在得到连接时,只需要调用工厂类中的连接,最后关闭连接的操作就不用关注了,因为它们已经在 servlet filter 中统一做过了,只要不启动新线程、Timer 之类的东西。
如果不使用这种机制,或者项目不是一个 Java Web 项目,没有提供基于线程的监听机制。则上面说的办法就不管用了。
我所想到的是,把Connection 对象或者封装后的对象作为参数,传入到各个数据库访问的子程序中去,或者构建Dao对象是通过构造器参数传进去。
另外就是,如果业务逻辑复杂,在一次业务处理中会调用子程序,子程序会访问数据库,而子程序又会调用它的子程序,子子程序又会访问数据库。如果是这样,我现在形成的想法是,先把要用到的数据一次性读到内存中,逻辑处理过程中如果要写数据库,则先把数据在内存中修改,最后再一次性写入。这样避免在子程序、子子程序中传递Connection,降低数据库处理的复杂性。