Java 当使用连接池时,我应该在每个查询或每个批中获取一次连接?

Java 当使用连接池时,我应该在每个查询或每个批中获取一次连接?,java,postgresql,jdbc,connection-pooling,c3p0,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(); 或

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

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

其中
executeQuery

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

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

一些评论/建议

  • 若您的应用程序是单线程的(除非您提到),那个么这并不重要。无论您是否使用连接池,这都无关紧要。只需使用一个连接,并将其传递到需要的功能
  • 当用例同时涉及多个数据库连接时,连接池非常有用
  • 由于您的应用程序是一个批处理单线程应用程序,因此不保证使用连接池
  • 对于您的应用程序,这两种方法是等效的。在池数据源连接上调用connection.close()时,它实际上并没有关闭,而是返回到池中
对于连接池,差异可以忽略,因为即使使用第二种方法,恢复池连接也只需要很少的时间。不过,使用第一种方法是更好的方法,因为

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

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


我切换到使用连接池,因为我的应用程序必须连续运行数月,并且连接池处理断开/重新连接。我自己处理这些并使用DriverManager会更好吗?好的,处理断开/重新连接是pool提供的众多功能之一。您的用例非常简单,据我所知,仅仅一个连接就足够了。我的建议是,在需要之前打开一个连接,除非完成,否则不要关闭它。
conn = dataSource.getConnection;
st = conn.createStatement();
rs = executeQuery(query);
conn.closed();