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()和.closesesession()而不是.getcurrentsession()和.flush(),因为我们有几个查询在多个事务上运行,否则回滚就不会那么容易了)
当应用程序没有得到任何异常时,池在oracledb中维护特定数量的打开会话,这些会话被重新用于打开和关闭jdbc连接以执行查询。
在应用程序处理异常之后,池将打开一个新会话以服务于下一个jdbc连接,而上一个会话在oracleserver中保持打开和空闲。
这使得应用程序有时达到oracle的最大会话数,因此无法获得任何新的jdbc连接,应用程序冻结。。。
有人知道在哪里解决这个问题吗。
我知道我的描述可能是“高水平的”,但在这里提出这个问题之前,我已经尝试了几乎所有我发现或知道的。我一直在研究这个问题。如果你需要进一步的细节,请问我。
Spring backbone :4.3.18
休眠:3.6.10
web服务器:tomcat 9
java:1.8版本
jdbc驱动程序:ojdbc8 v12.2.0.1
oracle版本:19c
暂无答案!
目前还没有任何答案,快来回答吧!