【问题标题】:When using a connection-pool should I get the connection each query or once each batch?使用连接池时,我应该在每个查询还是每个批次都获得连接?
【发布时间】:2013-08-15 01:57:48
【问题描述】:

我一直无法找到这个问题的确切答案。我正在使用 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 包时,我不确定这样做是否正确。还是这样的包没关系?

【问题讨论】:

    标签: java postgresql jdbc connection-pooling c3p0


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      一些cmets/建议

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

      【讨论】:

      • 我转而使用连接池,因为我的应用程序必须连续几个月保持正常运行,并且池处理断开/重新连接。我自己处理这些并使用 DriverManager 会更好吗?
      • 好吧,处理断开/重新连接是池提供的众多功能之一。您的用例非常简单,据我了解,只需一个连接就足够了。我的建议是,在需要之前打开连接,除非完成,否则不要关闭它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2015-12-25
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多