我正在创建一个多线程应用程序。然而,当我有一个连接对象为所有线程提供服务时,我的应用程序出现了许多意外行为。
我陷入了两难的境地。我应该让每个线程创建、使用和处置自己的连接对象还是应该使用连接池?
我尝试过连接池,这使得应用程序痛苦地淋浴。但是,我的直觉是,如果我让每个线程创建自己的连接对象,我可能会收到“连接过多”错误。
如果有任何方法可以帮助我,请告诉我。
问候。
最佳答案
无论线程问题如何,您一定应该选择连接池。它将大大提高连接性能。然后到线程问题,这确实是一个大问题。正常的 JDBC 习惯用法是获取并关闭最短可能范围内的所有资源。 IE。所有这些都应该发生在同一个方法 block 中。您所描述的问题症状证实您没有正确关闭这些资源。
无论连接是否来自池,都应该始终发生关闭。关闭非池连接将防止数据库在其保持打开时间过长时超时。关闭池连接实际上会将其释放回池中,并使其可用于下一次租用。
下面是 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) {}
}
}
关于java - 每个线程的新连接实例上的连接池 (JDBC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540942/