一个项目连接两个数据库问题 我现在有一个项目需要连接两个数据库,一个是mysql一个是sybase,我的框架是ssh,我该怎么在一个项目中操作两个数据库呢,请教高手了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是多数据库操作,并且要提供事务,EJB3你可以试试。如果你不会EJB3的话。看下前几天CSDN上的一篇 SPRING下配置多数据库事务的帖子 不过我没测试过,你可以参考下http://topic.csdn.net/u/20110427/18/096d3f27-8e0f-4e60-bfe9-6173c7d2c710.html最后我提供一个解决办法SSH中当前使用的A数据库日常使用,半夜三更把要处理的数据库 传给B数据库。 如果不涉及到分布式事务的话,还是好办的。先写一个数据源的代理,里面实际上是两个“真的”数据库。一个“主”,一个“从”。package datasource;import java.io.PrintWriter;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;public class DoubleDataSource implements DataSource { private DataSource master; private DataSource slave; public Connection getConnection() throws SQLException { Connection connection = null; if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) { connection = master.getConnection(); } else { connection = slave.getConnection(); } return connection; } public Connection getConnection(String username, String password) throws SQLException { Connection connection = null; if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) { connection = master.getConnection(username, password); } else { connection = slave.getConnection(username, password); } return connection; } public PrintWriter getLogWriter() throws SQLException { PrintWriter out = null; if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) { out = master.getLogWriter(); } else { out = slave.getLogWriter(); } return out; } public void setLogWriter(PrintWriter out) throws SQLException { if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) { master.setLogWriter(out); } else { slave.setLogWriter(out); } } public void setLoginTimeout(int seconds) throws SQLException { if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) { master.setLoginTimeout(seconds); } else { slave.setLoginTimeout(seconds); } } public int getLoginTimeout() throws SQLException { if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) { return master.getLoginTimeout(); } else { return slave.getLoginTimeout(); } } public DataSource getMaster() { return master; } public void setMaster(DataSource master) { this.master = master; } public DataSource getSlave() { return slave; } public void setSlave(DataSource slave) { this.slave = slave; }}再来一个数据源的遥控器,让你可以在任何想要的位置切换。package datasource;public final class DataSourceRemote { public final static String MASTER = "MASTER"; public final static String SLAVE = "SLAVE"; private static ThreadLocal<String> tl = new ThreadLocal<String>() { @Override protected String initialValue() { return MASTER; } }; public static void useMasterDataSource() { tl.set(MASTER); } public static void useSlaveDataSource() { tl.set(SLAVE); } public static void useDefaultDataSource() { useMasterDataSource(); } /*public */ static String get() { return tl.get(); }}切换的话,放在Spring AOP 之中似乎很不错。 你说呢。 几个静态方法一调用就切换掉了。等Dao方法结束以后,还可以切换回来。 设计分布式事务的,我也没弄过。 反正必须祭出 JTA 和 应用服务器了。 看看有没有高人出来给个列子。 应该创建两sessionFactory,DataSource 推荐一下 ComboPooledDataSource API 我以前做到过类似的项目,那个项目的办法就是在spring中配置两个数据源,然后对不同的数据源进行操作,然后对取出来的数据进行合并操作 struts2标签与dreamweaver 浏览器下图片加载不出来 望指点 截取字符串 hibernate惹的祸 struts2 文件动态下载问题 通过压缩网页提高网站浏览速度 200求hibernate入门的实题 关于struts配置数据池的问题请高手帮忙一下 如何实现文件的加密 用struts2的iterator标签如何让数组的奇数变成红色(就是让美国,日本,法国变成红色)? spring整合servlet
如果是多数据库操作,并且要提供事务,EJB3你可以试试。如果你不会EJB3的话。看下前几天CSDN上的一篇 SPRING下配置多数据库事务的帖子 不过我没测试过,你可以参考下http://topic.csdn.net/u/20110427/18/096d3f27-8e0f-4e60-bfe9-6173c7d2c710.html最后我提供一个解决办法
SSH中当前使用的A数据库日常使用,半夜三更把要处理的数据库 传给B数据库。
一个“主”,一个“从”。package datasource;import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;import javax.sql.DataSource;public class DoubleDataSource implements DataSource { private DataSource master;
private DataSource slave; public Connection getConnection() throws SQLException {
Connection connection = null;
if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) {
connection = master.getConnection();
} else {
connection = slave.getConnection();
}
return connection;
} public Connection getConnection(String username, String password)
throws SQLException {
Connection connection = null;
if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) {
connection = master.getConnection(username, password);
} else {
connection = slave.getConnection(username, password);
}
return connection;
} public PrintWriter getLogWriter() throws SQLException {
PrintWriter out = null;
if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) {
out = master.getLogWriter();
} else {
out = slave.getLogWriter();
}
return out;
} public void setLogWriter(PrintWriter out) throws SQLException {
if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) {
master.setLogWriter(out);
} else {
slave.setLogWriter(out);
}
} public void setLoginTimeout(int seconds) throws SQLException {
if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) {
master.setLoginTimeout(seconds);
} else {
slave.setLoginTimeout(seconds);
}
} public int getLoginTimeout() throws SQLException {
if (DataSourceRemote.get().equals(DataSourceRemote.MASTER)) {
return master.getLoginTimeout();
} else {
return slave.getLoginTimeout();
}
} public DataSource getMaster() {
return master;
} public void setMaster(DataSource master) {
this.master = master;
} public DataSource getSlave() {
return slave;
} public void setSlave(DataSource slave) {
this.slave = slave;
}
}
再来一个数据源的遥控器,让你可以在任何想要的位置切换。package datasource;public final class DataSourceRemote { public final static String MASTER = "MASTER";
public final static String SLAVE = "SLAVE"; private static ThreadLocal<String> tl = new ThreadLocal<String>() {
@Override
protected String initialValue() {
return MASTER;
}
};
public static void useMasterDataSource() {
tl.set(MASTER);
}
public static void useSlaveDataSource() {
tl.set(SLAVE);
}
public static void useDefaultDataSource() {
useMasterDataSource();
}
/*public */ static String get() {
return tl.get();
}
}
切换的话,放在Spring AOP 之中似乎很不错。 你说呢。
几个静态方法一调用就切换掉了。等Dao方法结束以后,还可以切换回来。