Java 当使用连接池时,我应该在每个查询或每个批中获取一次连接?
我一直找不到这个问题的确切答案。我使用的是C3P0的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(); 或
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()时,它实际上并没有关闭,而是返回到池中李>
- 它避免了从池中获取连接的额外(很少)开销
- 如果以后需要引入事务(进行所有更改,或者在发生错误时方便、安全地回滚更改),那么第一种方法是您唯一的选择
conn = dataSource.getConnection;
st = conn.createStatement();
rs = executeQuery(query);
conn.closed();