使用连接池时,我应该每次查询连接还是每次批次一次?

时间:2013-08-13 12:37:32

标签: java postgresql jdbc connection-pooling c3p0

我一直无法找到这个问题的确切答案。我正在使用C3P0的ComboPooledDataSource。以下哪种方法更好:

dataSource = connectionClass.getDataSource();
conn = dataSource.getConnection;
executeQuery(query1, conn);
executeQuery(query2, conn);
...
executeQuery(finalQuery, conn);
conn.close();

OR

executeQuery(query1);
executeQuery(query2);
...
executeQuery(finalQuery);

其中executeQuery

conn = dataSource.getConnection;
st = conn.createStatement();
rs = executeQuery(query);
conn.closed();

简而言之,我必须经常进行大量的查询。使用第一个设计更好,它为每个批次获取一次连接并将其作为参数传递。或者更好的方法是使用第二种方法,每次调用executeQuery方法时都获得连接。如果我使用的是DriverManager,我显然会选择第一个(只获得连接一次),但是当使用C3P0包时,我不确定这样做是否正确。或者这个包裹无关紧要?

2 个答案:

答案 0 :(得分:2)

使用连接池,差异是可以忽略的,因为即使您使用第二种方法,带回池连接也只需要很少的时间。尽管如此,使用第一种方法是更好的方法,因为

  • 它避免了从池中获取连接的额外(小)开销。

  • 如果您以后需要引入交易(执行所有更改,或者出现错误,方便安全地回滚您的更改),那么第一种方法是您唯一的选择。

    < / LI>

答案 1 :(得分:1)

一些意见/建议

  • 如果您的应用程序是单线程的(除非您提及,),这无关紧要。无论您是否使用连接池,这都无关紧要。只需使用一个连接并将其传递给您需要的地方。
  • 当用例同时涉及多个数据库连接时,连接池非常有用。
  • 由于您的应用程序是批处理和单线程,因此不保证使用连接池。
  • 关于您的申请,两种方法都是等效的。在池化数据源连接上调用connection.close()时,它实际上并未关闭,而是返回到池。