My DAL包括通过Oracle的UCP连接到Oracle的Spring Data Access。这意味着我主要使用JdbcTemplate。我的服务器需要从数据库中断中恢复,更具体地说,如果我们出现中断,我们的服务器显然会引发许多异常,然而,一旦数据库恢复在线,服务器应该会再次完美运行。
JdbcTemplate会和UCP一起为我处理这个问题吗?换句话说,JdbcTemplate会在数据库关闭时抛出异常,但一旦数据库恢复(它由UCP支持,所以我希望是这样)就会正常工作吗?还是我需要做其他事情,比如创建一个新的UCP工厂?
谢谢你抽出时间。
为了模拟数据库中断,我们的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>
现在,我们的池连接得到了验证,当发生中断时,断开的连接将被处理。因此,一旦数据库恢复,我们的服务器就恢复了联机状态。