2016-03-18 65 views
0

你好,這是我所期待的事 -使用spring和hibernate連接到數據庫 - 一級和二級數據庫

我有三個數據庫 - 每一個完全相同的 - 一個是主要的,二和三是備份。

我正在使用hibernate和spring連接到數據庫。我有配置了3個會話工廠的spring應用程序上下文文件和3個相應的數據源。

我想知道是否有一種方法使用彈簧,如果應用程序無法連接到數據庫1(拋出異常),它將連接到數據庫2 - 反過來數據庫3會關閉連接到3並繼續。

什麼是最好的實施方式?我已閱讀關於AbstractRoutingDataSource ..但不知道如何在這種情況下使用,如果還有其他想法..會欣賞一些方向。謝謝!

這是我在應用程序上下文XML配置 -

<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     destroy-method="close"> 
     <property name="driverClass" value="$g{jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="$g{url1}" /> 
     <property name="user" value="$l{uid1}" /> 
     <property name="password" value="$l{pwd1}" /> 
     <property name="minPoolSize" value="$g{jdbc.minPoolSize}" /> 
     <property name="maxPoolSize" value="$g{jdbc.maxPoolSize}" /> 
     <property name="preferredTestQuery" value="$g{jdbc.preferredTestQuery}" /> 
     <property name="testConnectionOnCheckout" value="$g{jdbc.testConnectionOnCheckout}" /> 
    </bean> 

    <bean id="sessionFactory1" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource1" /> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.model</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">validate</prop> 
       <prop key="hibernate.dialect">$g{jdbc.dialect}</prop> 
       <prop key="hibernate.show_sql">$g{jdbc.show_sql}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     destroy-method="close"> 
     <property name="driverClass" value="$g{jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="$g{url2}" /> 
     <property name="user" value="$l{uid2}" /> 
     <property name="password" value="$l{pwd2}" /> 
     <property name="minPoolSize" value="$g{jdbc.minPoolSize}" /> 
     <property name="maxPoolSize" value="$g{jdbc.maxPoolSize}" /> 
     <property name="preferredTestQuery" value="$g{jdbc.preferredTestQuery}" /> 
     <property name="testConnectionOnCheckout" value="$g{jdbc.testConnectionOnCheckout}" /> 
    </bean> 

    <bean id="sessionFactory2" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource2" /> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.model</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">validate</prop> 
       <prop key="hibernate.dialect">$g{jdbc.dialect}</prop> 
       <prop key="hibernate.show_sql">$g{jdbc.show_sql}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="dataSource3" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     destroy-method="close"> 
     <property name="driverClass" value="$g{jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="$g{url3}" /> 
     <property name="user" value="$l{uid3}" /> 
     <property name="password" value="$l{pwd3}" /> 
     <property name="minPoolSize" value="$g{jdbc.minPoolSize}" /> 
     <property name="maxPoolSize" value="$g{jdbc.maxPoolSize}" /> 
     <property name="preferredTestQuery" value="$g{jdbc.preferredTestQuery}" /> 
     <property name="testConnectionOnCheckout" value="$g{jdbc.testConnectionOnCheckout}" /> 
    </bean> 

    <bean id="sessionFactory3" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource3" /> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.model</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">validate</prop> 
       <prop key="hibernate.dialect">$g{jdbc.dialect}</prop> 
       <prop key="hibernate.show_sql">$g{jdbc.show_sql}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager1" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory1" /> 
    </bean> 

    <bean id="transactionManager2" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory2" /> 
    </bean> 

    <bean id="transactionManager3" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory3" /> 
    </bean> 
+0

我不知道的春天的方式來做到這一點。我認爲更典型的是配置一個DataSource並使用DNS將連接指向所需的(當前運行的)數據庫。然後,應用程序的連接池在連接失敗時會繼續重試,並且一旦DNS TTL過期,它將被引導至新服務器,並建立連接。我們通常在這種類型的配置中使用60秒或更短的DNS TTL。 – Rob

回答