首页 > 解决方案 > 应用程序不断在 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 连接并且应用程序冻结......

有谁知道在哪里解决这个问题。

我知道我的描述可能是“高级别的”,但在这里提出这个问题之前,我已经尝试了几乎所有我发现或知道的东西。我在这个问题上工作了很长时间。如果您需要任何进一步的细节,请询问我。

标签: javaspringoraclesessionconnection-pooling

解决方案


推荐阅读