spring+hibernate如何动态切换mysql和oracle spring+hibernate如何动态切换 mysql和oracle遇到一个几首饿的问题。我遇到一个问题就是从mysql切换到oracle数据库,或者从oracle切换到mysql数据库,但是spring配置文件为了方便事务管理只配置一个sessionfactory,那么请问这个sessionfactory的数据库方言如何确定呢?如果只是单纯的mysql内不同账户和地址之前的动态切换是好解决的,如上问题如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SessionFactory中的配置数据 从配置文件中读 如果没有涉及到分布式事务的话,可以自己写一个数据源(java.sql.DataSource)来装饰另外两个数据源(一个Mysql, 一个Oracle)。 把你的数据源的包装类交给spring容器管理。 如果要切换的话,从IOC容器取得。调用一个你编写的切换方法进行切换。 DataSource 不能绑定数据库方言啊,还的得有sessionfactory,如果从mysql切换到了oracle,方言是不会自动切换过来的 用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>试试看 确实! 我以前这样做过,不过都是MySQL的。 那你干脆配置两套好了。 DataSource1DataSource2AnnotationSessionFactoryBean1AnnotationSessionFactoryBean2这样就不要切来切去的啦。 老项目了,使用JPA是不太可能了,我其实是不想配置多个sessionfactory,其实预先定义好oracle的sessionfactory并且IOC到那个DAOimpl,再动态切换数据原,就可以实现我的要求,刚才已经弄好了,只是这个不太好维护,并且没有配置另外一套事务管理,好在切换到oracle上去也只是查询。 API:org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSourceSpring提供了动态切换的程序接口 同问, 顺便问下楼主这个问题怎么解决的? 就是不同的数据源(我用的Mysql和Sqlserver) 方言问题怎么动态设置, 我是在分页的时候, Mysql分页使用limit 。limit在Sqlserver中不支持,不切换方言在Sqlserver中就会报 limit附近有语法错误。 费解 。 Help g711用java写的编解码例子 JSTL如何调用一个DAO类的方法获取数据 EL表达式判断字符串相等的问题 hibernate事务的困惑 求jsftoolbox! 哪个是现在较为主流的jsp服务器 那位网友愿测试一下用struts写的一个办公用品管理系统吗 100 分求分 为会么在JBuilder的工程里的JAVA文件 引入包时不能用* soap用在什么地方 springmvc mybatis搭建的项目 大家开发一个模块的时候是先写dao层 在写service 在写action 还是反过来写 各路大神快现身!Java读取Oracle数据乱码问题! JAVA文件的读写 求高手指点
<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>试试看
确实! 我以前这样做过,不过都是MySQL的。 那你干脆配置两套好了。 DataSource1
DataSource2AnnotationSessionFactoryBean1
AnnotationSessionFactoryBean2这样就不要切来切去的啦。
Spring提供了动态切换的程序接口