我花了几天时间试图找出几天前在开发过程中出现的一些新问题的原因.我还没找到呢。但我找到了解决办法。但让我们从问题本身开始。
我们使用JBoss EAP 6.1.0.GA (作为7.2.0.Final-redhat-8)作为我们的应用服务器,用于一个相当大的企业项目。JPA层由Hibernate Core {4.2.0、1}使用oracle.jdbc.OracleDriver (Version 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不再工作了..。因为已经提交了更改。我们在数据库中看到了所有这些东西。而提交一笔交易应该结束它-不是吗?
虽然我已经找到了一个简单的解决办法,但我还是会真正了解这个问题。我没有好的感觉把这些知识推迟到生产时间。因此,任何反馈都是非常感谢的!谢谢!
发布于 2015-06-29 15:05:06
您正在使用JTA。因此,after_transaction模式从来不推荐用于JTA事务。
这是JBOSS的文档。
after_transaction -说要使用ConnectionReleaseMode.AFTER_TRANSACTION。此设置不应在JTA环境中使用。还请注意,如果使用ConnectionReleaseMode.AFTER_TRANSACTION,如果会话被认为处于自动提交模式,连接将被释放,就好像发布模式是AFTER_STATEMENT一样。
因此,您应该显式地使用after_statement或auto来积极地释放连接。
参考文献
https://stackoverflow.com/questions/21182114
复制相似问题