多线程JDBC

时间:2009-07-25 14:16:25

标签: multithreading jdbc

在架构上,使用多个线程处理JDBC的最佳方法是什么?我有很多线程同时访问数据库。使用单个连接和语句,我收到以下错误消息:

org.postgresql.util.PSQLException:此ResultSet已关闭。

我应该使用多个连接,多个语句还是有更好的方法?我的初步想法是每个线程使用一个语句,这将保证每个语句的单个结果集。

2 个答案:

答案 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)

是,使用连接池的多个连接。打开连接只需要足够长的时间来完成所需的操作,然后在完成后立即关闭它。让连接池处理“物理”连接管理以提高效率。