我们使用JBoss EAP 6.1.0.GA(AS 7.2.0.Final-redhat-8)作为我们的应用服务器,用于一个相当大的企业项目. JPA层由Hibernate Core {4.2.0.Final-redhat-1}使用连接Oracle 11.2.0.3.0的oracle.jdbc.OracleDriver(版本11.2)处理.
几个星期前,一切都按预期工作,我们没有数据库相关的问题.我们使用以下数据源:
<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.
所以你应该明确地使用auto或after_statement来积极地释放连接.
参考
Connection Release Modes.
总结以上是内存溢出为你收集整理的oracle – JBoss连接池的意外问题全部内容,希望文章能够帮你解决oracle – JBoss连接池的意外问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)