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