一个系统要用多种数据库怎么解决 本帖最后由 JAVA_STU 于 2010-01-08 15:36:20 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多个dataSource,多个sessionFaction。 给你一个我们用的: context.xml 《?xml version="1.0" encoding="UTF-8"?》 《beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"》 《jee:jndi-lookup id="mysqlds" jndi-name="java:comp/env/jdbc/mysqlds" /》 《jee:jndi-lookup id="orads" jndi-name="java:comp/env/jdbc/orads" /》 《bean id="dataSource" class="util.DynamicDataSource"》 《property name="targetDataSources"》 《map key-type="java.lang.String"》 《entry key="0" value-ref="mysqlds" /》 《entry key="1" value-ref="orads" /》 《/map》 《/property》 《property name="defaultTargetDataSource" ref="orads" /》 《/bean》 《/beans》 package util; public class DbContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return (String) contextHolder.get(); } public static void clearDbType() { contextHolder.remove(); } } package util; import java.sql.SQLException; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { //static Logger log = Logger.getLogger("DynamicDataSource"); @Override protected Object determineCurrentLookupKey() { // TODO return DbContextHolder.getDbType(); } @Override public boolean isWrapperFor(Class 《?》 iface) throws SQLException { // TODO Auto-generated method stub return false; } @Override public 《T》 T unwrap(Class 《T》 iface) throws SQLException { // TODO Auto-generated method stub return null; } } 测试程序: DbContextHolder.setDbType("1"); UserDomain od = this.testService.queryUserAccount("admin"); System.out.println("username=="+od.getName()); DbContextHolder.setDbType("0"); d = this.testService.queryUserAccount("admin");《bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"》 《!-- Connection Info --》 《property name="driverClassName" value="${jdbc.driver}" /》 《property name="url" value="${jdbc.url}" /》 《property name="username" value="${jdbc.username}" /》 《property name="password" value="${jdbc.password}" /》 《!-- Connection Pooling Info --》 《property name="initialSize" value="5" /》 《property name="maxActive" value="100" /》 《property name="maxIdle" value="30" /》 《property name="maxWait" value="1000" /》 《property name="poolPreparedStatements" value="false" /》 《property name="defaultAutoCommit" value="false" /》 《/bean》 《bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"》 《!-- Connection Info --》 《property name="driverClassName" value="${jdbc.driver}" /》 《property name="url" value="${jdbc.url}" /》 《property name="username" value="${jdbc.username}" /》 《property name="password" value="${jdbc.password}" /》 《!-- Connection Pooling Info --》 《property name="initialSize" value="5" /》 《property name="maxActive" value="100" /》 《property name="maxIdle" value="30" /》 《property name="maxWait" value="1000" /》 《property name="poolPreparedStatements" value="false" /》 《property name="defaultAutoCommit" value="false" /》 《/bean》 《bean id="dataSource" class="util.DynamicDataSource"》 《property name="targetDataSources"》 《map key-type="java.lang.String"》 《entry key="0" value-ref="dataSource1" /》 《entry key="1" value-ref="dataSource2" /》 《/map》 《/property》 《property name="defaultTargetDataSource" ref="dataSource1" /》 《/bean》 《/beans》 就是ssh动态支持多数据源啊。看不懂? 我记得应该都是<>符号来着,你怎么是《》呢? 使用多个数据库不是难点,难点在于如何管理多个数据库之间的事务!如果三个数据库不涉及同一个事务那是没有问题的,如果一个操作涉及一个事务,那称之为分布式事务(分布式事务通俗点讲就是:一个操作需要在 A 上存些东西,在 B 上修改一些东西,在 C 上删除一些记录,这三个操作要么全部成功,要么全部失败)。JDBC 的事务是基于 Connection 的,因此 JDBC 无法支持分布式事务。虽然 SSH 很强大,但是针对于分布式事务来说,要使用 SSH 的话,必须放到 J2EE 应用服务器中,而且数据源必须配置在 JNDI 上,并且使用 JTA 的分布式事务处理。另外,在数据库服务端必须支持分布式事务,SQL Server 是企业级数据库是支持的;MySQL 需要 5.0 以上版本,JDBC 也需要 5.0 以上版本,而且需要使用 InnoDB 数据引擎;Access 的话也就算了,绝对不可能支持分布式事务的。 如果不想在 J2EE 应用服务器上使用的话,可以去看一下 jOTM 这个开源框架,这个框架在 J2SE 环境中实现了分布式事务和 JTA 有个 linked 方法 你可以查下资料可以实现使用多个数据库 你可以试下 eclipse 新建applicationContext.xml文件 数据库连接测试中所遇到的问题 Tomcate连接oracle问题 java调用oracle存储过程的问题。 简单的多线程同步程序有问题 Spring2.0+Hibernate3.3.2事务配置问题 谁有在WINDOWS下使用的用JAVA制作的WEBMAIL 怎样在tomcat的配置文件中设置java_home javaweb乱码 个人见解 关于POI 导出多SHEET问题 不太晓得jstl中的很多标签中的context属性是干嘛的 求hibernate分页方法封装
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货