2010-08-22 41 views
2

我正在创建一个多线程应用程序。但是,当我有一个连接对象服务于所有线程时,我遇到了很多来自我的应用程序的意外行为。通过每个线程的新连接实例的连接池(JDBC)

我现在处于两难的境地。我应该让每个线程创建,使用和处理自己的连接对象,还是应该使用连接池?

我已尝试连接池,这使应用程序痛苦淋浴。然而,我的直觉是,如果我让每个线程创建自己的连接对象,我可能会得到一个“太多的连接”错误。

请让我知道是否有任何方法可以帮助。

问候。

回答

5

不管线程问题,你应该肯定去一个连接池。这将大大提高连接性能。然后到线程问题,这确实是一个主要问题。正常的JDBC习惯用法是获取关闭所有资源的最短可能范围。即都应该发生在同一个方法块中。您所描述的问题症状确认您没有正确关闭这些资源。

无论连接是否来自池,总是应该发生关闭。关闭非共享连接将防止数据库在打开时间过长时超时。关闭联合连接将实际释放它回到池并使其可用于下一个租约。

下面是在INSERT的情况下正常JDBC成语的外观。

public void create(Entity entity) throws SQLException { 
    // Declare. 
    Connection connection = null; 
    PreparedStatement statement = null; 

    try { 
     // Acquire. 
     connection = database.getConnection(); 
     statement = connection.prepareStatement(SQL_CREATE); 

     // Use. 
     statement.setSomeObject(1, entity.getSomeProperty()); 
     // ... 
     statement.executeUpdate(); 
    } finally { 
     // Close. 
     if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
    } 
} 
+0

Hi BalusC,谢谢你的回应。我的线程现在正在处理他们自己的连接对象,关闭他们定义的ResultSet和Statement对象。 这解决了“连接太多”的问题。 – mwangi 2010-08-24 07:01:19

+0

不客气。不要忘记标记接受的答案。另请参阅http://stackoverflow.com/faq :) – BalusC 2010-08-24 11:08:22

+0

我还通过引入锁定机制来解决线程问题。我在我的所有线程中引入了自定义启动,停止,暂停和恢复方法。三个线程只能在给定的时间激活。 - 主要的,“制片人”和“工作人员”。我有很多工人,但有一个“生产者” 这是算法的伪代码 1.启动主线程 2.启动生产者线程 3.开始while-true循环 4.虽然生产者尚未暂停,但主线程睡眠x时间 5.启动一个工作人员,他将挑选与他/她有关的数据:) 6.工作人员工作时,主线程睡x时间 7.结束while-true循环 – mwangi 2010-09-17 08:39:39