我现在有一个项目需要连接两个数据库,一个是mysql一个是sybase,我的框架是ssh,我该怎么在一个项目中操作两个数据库呢,请教高手了!

解决方案 »

  1.   


    如果是多数据库操作,并且要提供事务,EJB3你可以试试。如果你不会EJB3的话。看下前几天CSDN上的一篇 SPRING下配置多数据库事务的帖子 不过我没测试过,你可以参考下http://topic.csdn.net/u/20110427/18/096d3f27-8e0f-4e60-bfe9-6173c7d2c710.html最后我提供一个解决办法
    SSH中当前使用的A数据库日常使用,半夜三更把要处理的数据库 传给B数据库。
      

  2.   

    如果不涉及到分布式事务的话,还是好办的。先写一个数据源的代理,里面实际上是两个“真的”数据库。
    一个“主”,一个“从”。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方法结束以后,还可以切换回来。
      

  3.   

    设计分布式事务的,我也没弄过。 反正必须祭出 JTA 和 应用服务器了。 看看有没有高人出来给个列子。
      

  4.   

    应该创建两sessionFactory,DataSource
      

  5.   

     推荐一下  ComboPooledDataSource API
      

  6.   

    我以前做到过类似的项目,那个项目的办法就是在spring中配置两个数据源,然后对不同的数据源进行操作,然后对取出来的数据进行合并操作