Java 使用spring和hibernate连接到数据库-主数据库和辅助数据库

Java 使用spring和hibernate连接到数据库-主数据库和辅助数据库,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,嗨,这就是我想要做的- 我有三个数据库,每个都完全相同,一个是主数据库,两个是备份数据库,三个是备份数据库 我使用hibernate和spring连接到数据库。我有配置了3个会话工厂和3个相应数据源的spring应用程序上下文文件 我想知道是否有一种使用spring的方法,如果应用程序无法连接到数据库1(引发异常),它将连接到数据库2-反过来,如果数据库3关闭,它将连接到3并继续 实现这一点的最佳方式是什么?我已经读过AbstractRoutingDataSource.但不确定在这种情况下如何利

嗨,这就是我想要做的-

我有三个数据库,每个都完全相同,一个是主数据库,两个是备份数据库,三个是备份数据库

我使用hibernate和spring连接到数据库。我有配置了3个会话工厂和3个相应数据源的spring应用程序上下文文件

我想知道是否有一种使用spring的方法,如果应用程序无法连接到数据库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> 

com.model
验证
$g{jdbc.dialogue}
$g{jdbc.show_sql}
com.model
验证
$g{jdbc.dialogue}
$g{jdbc.show_sql}
com.model
验证
$g{jdbc.dialogue}
$g{jdbc.show_sql}

有一种方法可以通过使用Spring抽象数据源路由机制来实现这一点-


我不知道有什么办法可以做到这一点。我认为更典型的是配置一个数据源,并使用DNS直接连接到所需的(当前已启动并运行)数据库。然后,当应用程序的连接池无法连接时,它将继续重试,一旦DNS TTL过期,它将被定向到新服务器并建立连接。在这种配置中,我们通常使用60秒或更短的DNS TTL。