Java 如何为两个mysql和oracle定义routingdatasource?

Java 如何为两个mysql和oracle定义routingdatasource?,java,mysql,oracle,spring,hibernate,Java,Mysql,Oracle,Spring,Hibernate,我想为两个不同的数据库定义一个routingdatasource:mysql和oracle <bean id="dataSourceTarget" class="com.test.common.RoutingDataSource"> <property name="targetDataSources"> <map key-type="com.test.common.DataSourceType"> <ent

我想为两个不同的数据库定义一个routingdatasource:mysql和oracle

<bean id="dataSourceTarget" class="com.test.common.RoutingDataSource">
    <property name="targetDataSources">
        <map key-type="com.test.common.DataSourceType">
            <entry key="MY_SQL" value-ref="mySqlDataSource"/>
            <entry key="ORACLE" value-ref="oracleDataSource"/>
        </map>
    </property>
    <property name="defaultTargetDataSource" ref="mySqlDataSource"/>
</bean>

<bean id="mySqlDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="${jdbc.driver.classname}" />
    <property name="jdbcUrl" value="${mysql.url}" />
    <property name="user" value="${mysql.username}" />
    <property name="password" value="${mysql.password}" />
</bean>

<bean id="oracleDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="${oracle.url}" />
    <property name="user" value="${oracle.user}" />
    <property name="password" value="${oracle.passw}" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
        </props>
    </property>
</bean>
我已经定义了以下config.xml

<bean id="dataSourceTarget" class="com.test.common.RoutingDataSource">
    <property name="targetDataSources">
        <map key-type="com.test.common.DataSourceType">
            <entry key="MY_SQL" value-ref="mySqlDataSource"/>
            <entry key="ORACLE" value-ref="oracleDataSource"/>
        </map>
    </property>
    <property name="defaultTargetDataSource" ref="mySqlDataSource"/>
</bean>

<bean id="mySqlDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="${jdbc.driver.classname}" />
    <property name="jdbcUrl" value="${mysql.url}" />
    <property name="user" value="${mysql.username}" />
    <property name="password" value="${mysql.password}" />
</bean>

<bean id="oracleDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="${oracle.url}" />
    <property name="user" value="${oracle.user}" />
    <property name="password" value="${oracle.passw}" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
        </props>
    </property>
</bean>

<bean id="dataSourceTarget" class="com.test.common.RoutingDataSource">
    <property name="targetDataSources">
        <map key-type="com.test.common.DataSourceType">
            <entry key="MY_SQL" value-ref="mySqlDataSource"/>
            <entry key="ORACLE" value-ref="oracleDataSource"/>
        </map>
    </property>
    <property name="defaultTargetDataSource" ref="mySqlDataSource"/>
</bean>

<bean id="mySqlDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="${jdbc.driver.classname}" />
    <property name="jdbcUrl" value="${mysql.url}" />
    <property name="user" value="${mysql.username}" />
    <property name="password" value="${mysql.password}" />
</bean>

<bean id="oracleDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="${oracle.url}" />
    <property name="user" value="${oracle.user}" />
    <property name="password" value="${oracle.passw}" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
        </props>
    </property>
</bean>
此外,我必须为会话定义方言。
但是如何根据它所使用的数据源来定义它呢?

路由数据源是您自己的类?我宁愿创建两个会话工厂,然后创建一个能够返回正确会话工厂的东西。请注意,一旦hibernate会话打开,它就会保持连接(这取决于配置,但通常是这样)。那么,如果您进行切换呢?是的,您是对的,RoutingDataSourse是我自己的类,它实现了AbstractRoutingDataSource。我可以实现“我的”RoutingSessionFactory,问题是操作的顺序是什么?我认为首先为事务注释路由DataSource,然后我可以从ThreadLocals:-)获取正确的会话工厂。谢谢
<bean id="dataSourceTarget" class="com.test.common.RoutingDataSource">
    <property name="targetDataSources">
        <map key-type="com.test.common.DataSourceType">
            <entry key="MY_SQL" value-ref="mySqlDataSource"/>
            <entry key="ORACLE" value-ref="oracleDataSource"/>
        </map>
    </property>
    <property name="defaultTargetDataSource" ref="mySqlDataSource"/>
</bean>

<bean id="mySqlDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="${jdbc.driver.classname}" />
    <property name="jdbcUrl" value="${mysql.url}" />
    <property name="user" value="${mysql.username}" />
    <property name="password" value="${mysql.password}" />
</bean>

<bean id="oracleDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
      destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="${oracle.url}" />
    <property name="user" value="${oracle.user}" />
    <property name="password" value="${oracle.passw}" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
        </props>
    </property>
</bean>