2013-02-12 1 views
2

My DAL состоит из доступа к данным Spring, подключающегося к Oracle через UCP Oracle. Это означает, что я преобладающе работаю с JdbcTemplate. Требование для моего сервера состоит в том, чтобы восстановить из-за сбоя базы данных, а точнее, если у нас есть отключение, наш сервер может, очевидно, забросить множество исключений, однако, как только база данных вернется в сеть, сервер снова должен функционировать отлично.Java DAL, который восстанавливается после отключения базы данных?

Будет ли JdbcTemplate вместе с UCP обрабатывать это для меня? Другими словами, будут ли исключения JdbcTemplate исключать, пока база данных не работает, а затем функционирует после восстановления базы данных (она поддерживается UCP, поэтому я надеюсь, что это так) или есть что-то еще, что мне нужно сделать, например создать новую UCP например, завод?

Спасибо за ваше время.

+0

Это похоже на вопрос «попробуй и посмотри», поскольку у вас уже есть сервер Oracle и UCP для имитации этой ситуации. – millimoose

+0

Согласен, к сожалению, модель, в которой я работаю, - иметь один очень мощный сервер базы данных, через фирму, контролируемый администраторами баз данных. Это означает, что выход из строя является логистической проблемой, так как это повлияет на всех, поэтому я надеялся, что у кого-то еще может быть свой опыт. – Mark

+0

Я договорился о создании резервной копии с администраторами баз данных, чтобы имитировать простоя и вскоре опубликует результаты. – Mark

ответ

3

Чтобы смоделировать отключение базы данных, наши администраторы баз данных отключили соответствующую учетную запись службы и уничтожили все существующие соединения во время работы нашего сервера. Затем мы обнаружили, что ответ на мой собственный вопрос, для других, заключается в том, что 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> 

Теперь наши объединенные соединения проверяются, и когда происходит сбой, нарушаются соединения. В результате, как только база данных восстановилась, наш сервер снова появился в сети.