【问题标题】:Database connection settings retrieved from a JNDI connection pool从 JNDI 连接池检索的数据库连接设置
【发布时间】:2023-03-19 01:53:01
【问题描述】:

我在 Websphere 服务器上托管了一个数据源,我想通过我的应用程序客户端使用该数据源。

从 JNDI 数据源检索数据库连接后,我将连接的提交设置更改为 false。之后我会利用这个连接,任务完成后我会关闭连接。

如果我忘记在关闭之前更改连接的提交设置会发生什么(我的意思是将连接返回到池中)。如果任何其他客户端访问此数据源并获得相同的连接,提交设置是否仍然存在,或者服务器是否会重置这些连接设置。

【问题讨论】:

    标签: java jdbc commit jndi pooling


    【解决方案1】:

    池中的连接通常使用特定于 AS 的实现进行包装,以防止客户端过于侵入。当在连接上调用特定方法时,它被认为是“脏的”,并且可能不会返回到池中,而是关闭并重新创建,或者如果可能的话重置为原始状态。通常有关于如何处理这些情况的设置,例如在 Weblogic 中删除受感染的连接

    这些自清洁的效果也可能取决于驱动程序。因此,我建议您使用 1 连接池进行简单测试。将连接设置为 autocommit=false,不要关闭它,退出并尝试从另一个客户端使用它,并通过测试检查 autocommit 属性的实际状态。

    要考虑的另一件事是,该 AS 包装器中的 Connection.close() 不会关闭连接,而是将其放入池中。因此,如果您的客户端在调用 close() 之前断开连接(并在此之前设置自动提交),则该连接可能对其他池客户端不可用,从而造成连接泄漏。

    【讨论】:

      【解决方案2】:

      在 Apache Tomcat + Postgres 上测试 - 如果 defaultAutoCommit at server.xml 未指定 - 返回的数据库连接保持修改状态,也就是说,您必须在关闭之前手动设置 conn.setAutoCommit(true); (返回)。但是defaultAutoCommit="true" 在这种情况下会有所帮助。 Apache Tomcat 7 - The Tomcat JDBC Connection Pool 解释 defaultAutoCommit - "(boolean) 此池创建的连接的默认自动提交状态。如果未设置,则默认为 JDBC 驱动程序默认值(如果未设置,则不会调用 setAutoCommit 方法。)"

      【讨论】:

      • 这在很大程度上取决于所使用的连接池实现,鉴于 OP 引用了 Websphere,您的答案可能不适用
      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多