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

时间:2013-02-12 17:33:11

标签: java oracle spring jdbctemplate ucp

我的DAL包含通过Oracle的UCP连接到Oracle的Spring Data Access。这意味着我主要使用JdbcTemplate。我的服务器的要求是从数据库中断中恢复,更具体地说,如果我们有中断,我们的服务器显然可以抛出许多异常,但是,一旦数据库重新联机,服务器应该再次完美运行。

JdbcTemplate与UCP一起处理这个问题吗?换句话说,JdbcTemplate会在数据库关闭时抛出异常但是一旦databasde恢复就会运行(它由UCP支持,所以我希望是这种情况)或者还有其他我需要做的事情,比如创建一个新的UCP工厂例如?

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

为了模拟数据库中断,我们的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>

现在我们的汇总连接已经过验证,当发生中断时,会断开连接。因此,一旦数据库恢复,我们的服务器就会恢复在线状态。