本帖最后由 u011688498 于 2015-01-04 17:50:16 编辑

解决方案 »

  1.   

    主要是性能方面的问题,其他的没什么!!!就怕性能不足!!!但是又不想让BLL层接触数据库的东西,达到分层效果。
      

  2.   

    不要这么做,我在 CSDN 强调过不下 10 次了,不要把 Connection 等 JDBC 对象弄成静态的,这会产生非常严重的问题。JDBC connection 讨论
    http://bbs.csdn.net/topics/360027520#post-361821072Connection能设置成静态的吗
    http://bbs.csdn.net/topics/350052222#post-351357361
      

  3.   


    还是不是很懂,连接泄漏这方面的问题,那应该怎么做?
    在三层架构里面,我不想DAL和BAL耦合太大,求支招!
      

  4.   


    一个Connection 的开启和关闭一般用于代表一个事务,对于Connection ,设置为一个成员变量的时候,当出现多线程调用这个Connection 成员变量,如果不处理同步问题,则可能你在线程1中调用这个Connection成员变量的时候,发现这个是一个空指针,于是就新建了一个Connection,但是如果同时线程2也在跑,也同时发现这个是一个空指针,同样新建了一个Connection(多线程就是这样的,因为你没有处理异步问题) ,这样你的Connection 关闭就很有问题了,并且可能会很快占用完数据库连接(new 了太多Connection)!
    所以最佳的做法就是,每次操作数据库之前都独立获取一个Connection对象,并且操作完之后对其进行关闭!也就很好地保证了事务的一致性以及代码的同步操作。
      

  5.   


    可以把每次单独获取Connection和prepareStatement的代码写到一起提供复用。多次开启和关闭独立的Connection是没有问题的,一般都是这么做的,如果想更加优化,一般推荐使用连接池!
      

  6.   

    你的代码都不是性能问题了,是肯定会出多线程问题。除非你能保证,同一时间SqlHelper只有一个线程被调用。A线程调用了getPreparedStatement,B线程也调用了getPreparedStatement这时候A先调用结束然后调用了closeConnection关掉了Connection,那么等B线程调用结束后如何关掉B线程用的Connection?这个Connection就泄漏了,迟早会达到数据库连接上限。所以建议是除非你能保证,同一时间只有一个线程调用SqlHelper上的方法,不然别这么做。你可以使用DataSource数据源,这都说烂的事了。比如C3P0之类的,你只需要问他拿Connection使用完调用close就可以了。性能由C3P0来保证。当然数据源实现有好多种了。
      

  7.   


    可以把每次单独获取Connection和prepareStatement的代码写到一起提供复用。多次开启和关闭独立的Connection是没有问题的,一般都是这么做的,如果想更加优化,一般推荐使用连接池!
    可以给各小例子吗?谢谢,我不知道怎么复用,是静态还是动态的?!
      

  8.   


    好,后面我把数据库SQLHelper写成动态的了,不知道这样行不行,我也在多线程环境下调用过,在SQL Manager看连接,在程序结束后就没有连接了,应该是没问题了,以后再用C3P0,谢谢