我花了最后几天的时间试图找出几天前提出的开发过程中一些新问题的原因......但我还没有找到它。但我找到了一个解决方法。但让我们从问题本身开始。
我们正在使用 JBoss EAP 6.1.0.GA (AS 7.2.0.Final-redhat-8) 作为我们一个相当大的企业项目的应用服务器。 JPA 层由 处理Hibernate 核心 {4.2.0.Final-redhat-1} 使用 oracle.jdbc.OracleDriver(版本 11.2)连接甲骨文 11.2.0.3.0 .
几周前,一切都按预期进行,我们没有与数据库相关的问题。我们使用了以下数据源:
<datasource jta="true" jndi-name="java:/myDS" pool-name="myDS" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:oracle:thin:@192.168.0.93:1521:DEV</connection-url>
<driver>oracle</driver>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>20</max-pool-size>
<prefill>true</prefill>
<use-strict-min>false</use-strict-min>
<flush-strategy>FailingConnectionOnly</flush-strategy>
</pool>
<security>
<user-name>MY_DB</user-name>
<password>pass</password>
</security>
</datasource>
大多数情况下,我们有 5-10 个开放连接,其中 1-3 个在使用(单一开发环境)……池保持该水平并且工作得很好。
但是对我们的代码进行了一些未知的更改,导致池停止工作......不再释放它的连接......甚至根本没有重新使用它们!只需几个简单的请求即可将池填充到最多 20 个连接,并且 JPA 拒绝了任何新的数据库查询。
我们花了几天时间来寻找我们代码的相关更改……但没有成功!
今天我发现了一个解决方法。我们稍微改变了persistence.xml:
<persistence-unit name="myPU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/myDS</jta-data-source>
<properties>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/myDSMF" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="hibernate.default_batch_fetch_size" value="1000" />
<property name="hibernate.jdbc.batch_size" value="0" />
<property name="hibernate.connection.release_mode" value="after_statement" />
<!-- <property name="hibernate.connection.release_mode" value="after_transaction" /> -->
<property name="hibernate.connection.SetBigStringTryClob" value="true" />
</properties>
</persistence-unit>
换
hibernate.connection.release_mode
来自 after_transaction
至 after_statement
成功了。但是这个设置以前从未被触及过。现在连接按预期释放,池再次可用。我不明白为什么 after_transaction 不再起作用......因为已提交更改。我们在数据库中看到所有这些东西。提交事务应该结束它 - 不是吗?
尽管我发现了这个简单的解决方法,但我确实了解了问题所在。将这些知识推迟到生产时间,我没有什么好感觉。所以任何反馈都非常感谢!谢谢!
最佳答案
您正在使用 JTA .所以 after_transaction 从不推荐用于 JTA 事务的模式。
这是来自 JBOSS 站点的文档。
after_transaction - says to use ConnectionReleaseMode.AFTER_TRANSACTION. This setting should not be used in JTA environments. Also note that with ConnectionReleaseMode.AFTER_TRANSACTION, if a session is considered to be in auto-commit mode connections will be released as if the release mode were AFTER_STATEMENT.
所以你应该使用 汽车 或 after_statement 明确地,积极地释放连接。
引用
Connection Release Modes .
关于oracle - JBoss 连接池的意外问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21182114/