日期:2014-05-16  浏览次数:20417 次

aop实现动态数据库

最近做了个项目,他们要求在主数据库中存一个表,记录了所有要连接的数据库,然后客户可以任意选择要连接哪个数据库。但是,连到那个数据库,只是获取某一部分信息,而像日志、注释等信息还要存在主库中。

我们选的是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,来切换数据库。虽然方法烂了点,但总算是达到功能了。