【问题标题】:connecting to databases using spring and hibernate - primary and secondary databases使用 spring 和 hibernate 连接到数据库 - 主数据库和辅助数据库
【发布时间】:2016-03-18 18:11:33
【问题描述】:

你好,这就是我想做的-

我有三个数据库 - 每个都完全相同 - 一个是主数据库,两个和三个是备用数据库。

我正在使用 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> 

【问题讨论】:

  • 我不知道 Spring 方法可以做到这一点。我认为更典型的是配置一个 DataSource 并使用 DNS 将连接定向到所需的(当前正在运行的)数据库。然后,您的应用程序的连接池会在连接失败时不断重试,一旦 DNS TTL 过期,它将被定向到新服务器并建立连接。在这种类型的配置中,我们通常使用 60 秒或更短的 DNS TTL。

标签: java spring hibernate spring-mvc


【解决方案1】:

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

https://spring.io/blog/2007/01/23/dynamic-datasource-routing/

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多