不管线程问题,你应该肯定去一个连接池。这将大大提高连接性能。然后到线程问题,这确实是一个主要问题。正常的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) {}
}
}
Hi BalusC,谢谢你的回应。我的线程现在正在处理他们自己的连接对象,关闭他们定义的ResultSet和Statement对象。 这解决了“连接太多”的问题。 – mwangi 2010-08-24 07:01:19
不客气。不要忘记标记接受的答案。另请参阅http://stackoverflow.com/faq :) – BalusC 2010-08-24 11:08:22
我还通过引入锁定机制来解决线程问题。我在我的所有线程中引入了自定义启动,停止,暂停和恢复方法。三个线程只能在给定的时间激活。 - 主要的,“制片人”和“工作人员”。我有很多工人,但有一个“生产者” 这是算法的伪代码 1.启动主线程 2.启动生产者线程 3.开始while-true循环 4.虽然生产者尚未暂停,但主线程睡眠x时间 5.启动一个工作人员,他将挑选与他/她有关的数据:) 6.工作人员工作时,主线程睡x时间 7.结束while-true循环 – mwangi 2010-09-17 08:39:39