从架构上讲,使用多线程处理 JDBC 的最佳方法是什么?我有许多线程同时访问数据库。使用单个连接和语句,我收到以下错误消息:
org.postgresql.util.PSQLException:此结果集已关闭。
我应该使用多个连接、多个语句还是有更好的方法?我的初步想法是每个线程使用一个语句,这将保证每个语句有一个结果集。
最佳答案
您应该为每个任务使用一个连接。如果您使用连接池,则不能使用由其他连接准备的准备好的语句。连接创建的所有对象(ResultSet、PreparedStatements)在连接返回池后均无效。
所以,很像
public void getSomeData() {
Connection conn = datasource.getConnection();
PreparedStatement st;
try {
st = conn.prepareStatement(...);
st.execute();
} finally {
close(st);
close(conn);
}
}
所以在这种情况下,你所有的 DAO 对象都不是 Connection,而是 DataSource 对象(java.sql.DataSource),它确实是可池化的连接工厂。在每种方法中,您首先获得连接,完成所有工作并关闭连接。您应该尽快将连接返回到池。连接返回后,它可能不会物理关闭,而是重新初始化(所有事件事务关闭,所有 session 变量销毁等)
关于multithreading - 多线程JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1182163/