日期:2014-05-16 浏览次数:20417 次
最近做了个项目,他们要求在主数据库中存一个表,记录了所有要连接的数据库,然后客户可以任意选择要连接哪个数据库。但是,连到那个数据库,只是获取某一部分信息,而像日志、注释等信息还要存在主库中。
我们选的是ibatis框架作为数据库层,用mysql实验的时候,是用c3p0创建动态数据库,然后调用getSqlMapClientTemplate().setDataSource(DataSource dataSource)方法将数据源赋给ibtis,这样换数据源时,spring不用重启就可以。
但后来换了sqlserver发现不行,虽然数据库照样创建,但是ibatis还是连接的以前的主库,所以为这个烦恼了很长时间,现在想了一个方法,用aop来实现切换库。
@Before("execution(public * com.casic.dao.DmRleaseDao.*(..)) or execution(public * com.casic.dao.ReleaseHistoryDao.*(..)) or execution(public * com.casic.dao.ReleaseObjectDao.*(..)) " + " or execution(public * com.casic.dao.ReleaseResourceDao.*(..)) or execution(public * com.casic.dao.SecuritLevelDao.*(..)) or execution(public * com.casic.dao.StructureDmoduleDao.*(..))" + " or execution(public * com.casic.dao.StructureObjectDao.*(..))") public void changeDataSource() { //得到当前项目的action ProjectAction pa = new ProjectAction(); //获得用户选择的数据库 String dataSource = (String) pa.getSession().get("dataSource"); if (dataSource != null && !dataSource.equals("")) { System.out.println("改变数据源++++++++++++++++++++++++++++++++++++"); System.out.println(pa.getSession().size() + "....................................."); System.out.println(pa.getSession().get("dataSource") + "------------------------------"); this.getSqlMapClientTemplate().update( "DataSource.changeDataSource", dataSource); } }
?而在DataSource.xml里,这样
<update id="changeDataSource" parameterClass="java.lang.String"> use #value#; </update>?就可以在每一个dao类中的方法执行前执行一次use XXX,来切换数据库。虽然方法烂了点,但总算是达到功能了。