java - 应用程序不断在 Oracle (Java + Spring) 中打开新会话
问题描述
Spring 应用程序运行多个并行线程,在作业的生命周期中从多个数据源对 Oracle 数据库执行数千个查询。在处理异常时在特定数据源中观察到该问题。我们使用具有以下配置的 JDBC 池:
<bean id="connCachingProps"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="PropertyCheckInterval">30</prop>
<prop key="MinLimit">0</prop>
<prop key="MaxLimit">100</prop>
<prop key="TimeToLiveTimeout ">180</prop>
<prop key="MaxStatementsLimit">10</prop>
<prop key="InactivityTimeout">60</prop>
<prop key="ConnectionWaitTimeout">600</prop>
</props>
</property>
</bean>
<bean id="appDS" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="URL" value="${appds.url}"/>
<property name="user" value="${appds.user}"/>
<property name="password" value="${appds.password}"/>
<property name="connectionCacheProperties" ref="connCachingProps"/>
<property name="connectionCacheName" value="appDS" />
<property name="connectionCachingEnabled" value="true"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="appDS" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">com.company.base.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
</props>
</property>
</bean>
一些查询获取异常是正常的(基于应用程序的逻辑)(基本上是因为某些表中不存在客户信息)。这些异常由源代码处理,我们 100% 确定 JDBC 连接已释放并且 Sessionfactory.Session 已关闭。(我们使用 .OpenSession() 和 .CloseSession() 而不是 .GetCurrentSession() 和 .Flush() 因为我们有多个查询在多个事务上运行,否则回滚不会那么容易)
虽然应用程序没有出现任何异常,但池在 Oracle DB 中维护特定数量的打开会话,这些会话被重新用于打开和关闭 JDBC 连接以执行查询。
应用程序处理异常后,池将打开一个新会话来为下一个 JDBC 连接提供服务,而前一个会话在 Oracle Server 中保持打开和空闲状态。
这使得应用程序在某个时候达到 Oracle 的最大会话数,因此无法获得任何新的 JDBC 连接并且应用程序冻结......
有谁知道在哪里解决这个问题。
我知道我的描述可能是“高级别的”,但在这里提出这个问题之前,我已经尝试了几乎所有我发现或知道的东西。我在这个问题上工作了很长时间。如果您需要任何进一步的细节,请询问我。
- Spring框架:4.3.18
- 休眠:3.6.10
- 网络服务器:Tomcat 9
- 爪哇:1.8
- JDBC驱动:ojdbc8 v12.2.0.1
- 甲骨文版本:19c
解决方案
推荐阅读
- python - 如何使用 Pytest 测试 dockerized 烧瓶应用程序?
- javascript - 根据数据表数据选择的更改选项
- flutter - ListView.builder itemCount 未在 StreamBuilder 内更新
- express - passport.js 返回错误/failureFlasg 消息以查看
- spring-boot - 如何解决在 ec2 tomcat 上部署 Spring Boot 代码时出现 404 错误?
- zapier - Zapier:在对象数组中拆分字符串
- java - 导入 org.eclipse(.emf) 无法解决
- ios - 我可以从不同的 BundleID 访问 iCloud 存储吗?
- javascript - 如何使div过渡平滑
- java - 如何获取未知json对象结构的Json键值