spring+hibernate如何动态切换 mysql和oracle遇到一个几首饿的问题。我遇到一个问题就是从mysql切换到oracle数据库,或者从oracle切换到mysql数据库,但是spring配置文件为了方便事务管理只配置一个sessionfactory,那么请问这个sessionfactory的数据库方言如何确定呢?如果只是单纯的mysql内不同账户和地址之前的动态切换是好解决的,如上问题如何解决?

解决方案 »

  1.   

    SessionFactory中的配置数据 从配置文件中读
      

  2.   

    如果没有涉及到分布式事务的话,可以自己写一个数据源(java.sql.DataSource)来装饰另外两个数据源(一个Mysql, 一个Oracle)。 把你的数据源的包装类交给spring容器管理。 如果要切换的话,从IOC容器取得。调用一个你编写的切换方法进行切换。
      

  3.   

    DataSource 不能绑定数据库方言啊,还的得有sessionfactory,如果从mysql切换到了oracle,方言是不会自动切换过来的
      

  4.   

    用jpa,在persistence.xml里建俩个单元<?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="mysql" transaction-type="RESOURCE_LOCAL">
      <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
    <property name="hibernate.connection.username" value="root" />
    <property name="hibernate.connection.password" value="xxx" />
    <property name="hibernate.connection.url" value="jdbc:mysql://xxx:3306/xx" />
    <property name="hibernate.show_sql" value="true" />
    <property name="hibernate.format_sql" value="true"/>
    </properties>
    </persistence-unit><persistence-unit name="oracle" transaction-type="RESOURCE_LOCAL">
      <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9i" />
    <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" />
    <property name="hibernate.connection.username" value="xx" />
    <property name="hibernate.connection.password" value="xxx" />
    <property name="hibernate.connection.url" value="jdbc:oracle:thin:@xxxx:1521:xx" />
    <property name="hibernate.show_sql" value="true" />
    <property name="hibernate.format_sql" value="true"/>
    </properties>
    </persistence-unit>
    </persistence>
    再在spring里搞俩个EntityManagerFactory
        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="mysql" />
    </bean>    <bean id="entityManagerFactory2" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="oracle" />
    </bean>试试看
      

  5.   


    确实! 我以前这样做过,不过都是MySQL的。 那你干脆配置两套好了。 DataSource1
    DataSource2AnnotationSessionFactoryBean1
    AnnotationSessionFactoryBean2这样就不要切来切去的啦。
      

  6.   

    老项目了,使用JPA是不太可能了,我其实是不想配置多个sessionfactory,其实预先定义好oracle的sessionfactory并且IOC到那个DAOimpl,再动态切换数据原,就可以实现我的要求,刚才已经弄好了,只是这个不太好维护,并且没有配置另外一套事务管理,好在切换到oracle上去也只是查询。
      

  7.   

    API:org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
    Spring提供了动态切换的程序接口
      

  8.   

    同问, 顺便问下楼主这个问题怎么解决的? 就是不同的数据源(我用的Mysql和Sqlserver) 方言问题怎么动态设置, 我是在分页的时候, Mysql分页使用limit 。limit在Sqlserver中不支持,不切换方言在Sqlserver中就会报 limit附近有语法错误。 费解 。