首先说一下我的需求:数据库结构都是一样,但具体有多少个数据库不确定(视具体用户而定),用户操作那个数据库要根据登录的时候进行选择,这个信息肯定是保存在用户的登录信息中(例如:session)当有不同的用户需要操作不同的数据库时(根据登录时的选择或指定),什么时候切换数据库?
是在service层还是dao层?
这个信息怎么传给层中的方法?
如果每个方法都加一个参数这样不太好吧?另外我用的Spring+struts~

解决方案 »

  1.   

    dao 层的话,每个数据库都要实现一套,而且命名要规范比如说:UserDao.java 这个接口,Oracle 实现就为 UserDaoOracle.java,MySQL 实现就为 UserDaoMySQL.java所有的 dao 需要使用工厂方法返回 dao 的实例,工厂方法中把用户所选择的数据库名称传进去,比如说:public static UserDao DaoFactory.getUserDao(String database);传进去的 database 比如说是 "Oracle",那么就根据命名规则:String clazz = "com.test.dao." + database.toLowerCase() + ".UserDao" + database;再使用反射产生 clazz 的对象就可以了。
      

  2.   

    com.test.dao 包放 UserDao.java 等 dao 接口,以及 DaoFactory.java
    com.test.dao.oracle 包放 UserDaoOracle.java 的 dao 实现
    com.test.dao.mysql 包放 UserDaoMySQL.java 的 dao 实现
    ...当然了,由于反射产生对象的速度比较慢,建议增加适当的缓存,或者 Dao 使用单例。
      

  3.   


    谢谢解答。不过大大可能理解错我的意思了~~~并不是指多个数据库类型。我这里只有一个sql server2000,我指的是里面的数据库之间的切换。
      

  4.   

    楼主看下这个文章,也许有帮助
    http://www.blogjava.net/bigbigtooth/archive/2007/11/19/85756.html
      

  5.   


    谢谢你的回复,如果按照配置的动态载入来做,有下面几个考虑:
    1.每次新建用户都需要动态生成Spring的XML配置文件
    2.如果用户很多的话,那文件也会很多
    3.要修改SPRING的源代码我想的是,配置文件都一样,只是数据库连接URL中的数据库名需要根据用户名来变动,有没有更好的方法啊?
      

  6.   

    有动态载入就有动态修改,
    ((DriverManagerDataSource)getBean("dataSource")).setUrl(""); 
    运行时强制转换
      

  7.   

    当然在dao层了。我现在做的程序就是操作不同的数据库 但都是oracle的。跟你的情况会有些出入,但是类似。我现在做的程序是同时操作三个数据库。服务器是weblogic。配置三个数据库的数据源。然后后来需要一个和数据库交互的类,这个类就是连接三个数据源的。你那个是动态的调不同的数据库,那肯定需要传个参数了,到时候判断调哪个数据源。登陆的时候可能根据这个人的权限去判断 这个人用户应该登陆的是哪个数据库,这个参数一定要传到后台的。这个是我们项目的情况,希望对你有帮助