解决方案 »

  1.   

    没有什么实质差异,J2EE 的连接池与事务管理之间有绑定关系。
    我们只要设置连接池是共享式的就可以了。1、一个物理连接是不可能同时工作在超过1个事务中的。
    2、在同一个事务内,我们多次打开和关闭连接实际上它背后的物理连接并没有跟着频繁地打开关闭,它们是共享的,在同一个事务中能无条件地共享,也应该共享(否则你刚改一个表的数据再来 select 却被锁定不就成了一个笑话)。在一个事务内多次打开和关闭没有多大性能损失,但代码的条理性更好,这是推荐的。如果每次都自己手工去拿连接,然后当成参数传递在各个方法调用之间就导致程序设计变复杂了,而且有时候还会稿错事务绑定,因为它要求你传递的参数在指定的方法中也确实与它是同一个关联事务,如果这是在 EJB 中就变得复杂了,容易出错,因为这相当于你也像 EJB 容器一样地在跟踪 J2EE 组件的当前事务绑定,而这本来应该是对应用程序透明的部分。
      

  2.   

    是不是说,直接使用C3P0连接池,就能达到你说的这个好处(共享连接)如果只是用裸JDBC,还会有你说的这种效果吗?
      

  3.   

    如果尽量在一个连接内解决所有事情,会不会更快。Magical茏
      

  4.   

    我测试对比了一下
    查询所有用户信息,还需要在其他3个表中查询该用户cityId、provinceId,roldId对应的显示名称
    web服务器在本机+DB服务器在远端
    1.不加数据库连接池+误用的程序逻辑(对每个用户的每个cityId、provinceId,roldId分别建立一次conn,然后关闭)
    大概用时15s,不能忍
    2.用了连接池+误用的程序逻辑
    降到3325ms
    3.用了连接池+正确的程序逻辑(一条sql语句+left join)
    降到了456实验表明:连接池确实可以大幅降低获取连接的时间,但是也不能弥补误用程序逻辑带来的性能问题。优化可以在两个方面进行考虑,数据端和编程端。
      

  5.   

    1.15s的确是执行时间加连接时间(主要数据库和Web服务器不在一台机器,要在公网上跑)
    2.我确定也是执行时间加连接时间
    3.一条sql语句+left join,就只有一次数据库连接。即使不用连接池,也不会有多慢。谢谢大家关注