2

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

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

或者

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

其中executeQuery

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

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

4

2 回答 2

2

使用连接池,差异可以忽略不计,因为即使您使用第二种方法,恢复池连接也需要很少的时间。不过,使用第一种方法是更好的方法,因为

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

  • 如果您稍后需要引入事务(进行所有更改,或者在发生错误时方便且安全地回滚更改),那么第一种方法是您唯一的选择。

于 2013-08-13T12:48:33.927 回答
1

一些意见/建议

  • 如果您的应用程序是单线程的(除非您提到),那没关系。是否使用连接池甚至都没有关系。只需使用单个连接并将其传递到您需要的地方即可。
  • 当用例同时涉及多个数据库连接时,连接池很有用。
  • 由于您的应用程序是批处理和单线程的,因此不保证使用连接池。
  • 关于您的应用程序,这两种方法是等效的。当您在池数据源连接上调用 connection.close() 时,它实际上并没有关闭,而是返回到池中。
于 2013-08-13T12:46:34.773 回答