有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从数据库中断中恢复的oracle Java DAL?

我的DAL包括通过Oracle的UCP连接到Oracle的Spring数据访问。这意味着我主要使用JdbcTemplate。我的服务器需要从数据库中断中恢复,更具体地说,如果发生中断,我们的服务器显然会抛出许多异常,但是,一旦数据库重新联机,服务器应该会再次正常工作

JdbcTemplate和UCP会为我处理这个问题吗?换句话说,JdbcTemplate会在数据库关闭时抛出异常,但在Databasede恢复后(它由UCP支持,所以我希望是这样),还是需要执行其他操作,例如创建新的UCP工厂

谢谢你抽出时间


共 (1) 个答案

  1. # 1 楼答案

    为了模拟数据库中断,我们的DBA关闭了相关的服务帐户,并在服务器运行时关闭了所有现有的连接。然后我们发现,为了其他人的利益,我自己的问题的答案是,没有正确的配置,JdbcTemplate不会自动恢复

    我最初的配置如下:

    <bean id="DataSource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
        <property name="URL" value="${jdbc.url}"/>
        <property name="User" value="${jdbc.user}"/>
        <property name="Password" value="${jdbc.password}"/>
        <property name="ConnectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
        <property name="ConnectionPoolName" value="FOX"/>
        <property name="MinPoolSize" value="1"/>
        <property name="MaxPoolSize" value="3"/>
        <property name="InitialPoolSize" value="1"/>
    </bean>
    
    <bean id="DataTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="DataSource" />
    </bean>
    

    不幸的是,在停机的情况下,这会在您的池中留下死连接,因此,我们的服务器无法恢复。我想有很多不同的方法可以解决这个问题,可能是在看到异常时清除池。例如,将ValidateConnectionOnBorrow设置为true是一个简单的更改,并达到了预期的效果:

    <bean id="DataSource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
        <property name="URL" value="${jdbc.url}"/>
        <property name="User" value="${jdbc.user}"/>
        <property name="Password" value="${jdbc.password}"/>
        <property name="ConnectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
        <property name="ConnectionPoolName" value="FOX"/>
        <property name="MinPoolSize" value="1"/>
        <property name="MaxPoolSize" value="3"/>
        <property name="InitialPoolSize" value="1"/>
        <property name="ValidateConnectionOnBorrow" value="true"/>
    </bean>
    
    <bean id="DataTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="DataSource" />
    </bean>
    

    现在,我们的池连接已被验证,当发生中断时,断开的连接将被处理。结果,一旦数据库恢复,我们的服务器就恢复了在线