在架构上,使用多个线程处理JDBC的最佳方法是什么?我有很多线程同时访问数据库。使用单个连接和语句,我收到以下错误消息:
org.postgresql.util.PSQLException:此ResultSet已关闭。
我应该使用多个连接,多个语句还是有更好的方法?我的初步想法是每个线程使用一个语句,这将保证每个语句的单个结果集。
答案 0 :(得分:4)
每个任务应该使用一个连接。如果使用连接池,则不能使用由其他连接准备的预准备语句。连接(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),它确实是poolable连接工厂。在每种方法中,首先要获得连接,完成所有工作并关闭连接。您应该尽快返回到池的连接。连接返回后,它可能不是物理关闭,而是重新初始化(所有活动事务关闭,所有会话变量都被销毁等)
答案 1 :(得分:1)
是,使用连接池的多个连接。打开连接只需要足够长的时间来完成所需的操作,然后在完成后立即关闭它。让连接池处理“物理”连接管理以提高效率。