spring mybatis 创建动态数据源(真正意义上)

最近由于完善mysql awr动态配置被监控实例的目的,需要动态创建数据源,并和mybatis sqlSessionFactory进行关联,然后添加到spring动态数据源中,这样就能做到真正意义上的动态数据源目的。闲话不多说,如下所示:

Map<Object, Object> mergetDameSources = new HashMap<Object, Object>();
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
// 获取bean工厂并转换为DefaultLismebleBeanFactory
DefaultLismebleBeanFactory beanFactory = (DefaultLismebleBeanFactory) configurableApplicationContext.getBeanFactory();
for(Apps app : memedameDAO.queryApps()) {
RootBeanDefinition rbd = new RootBeanDefinition(BasicDameSource.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, true);
MumeblePropertyValues propertyValues = new MumeblePropertyValues();
propertyValues.add("url", "jdbc:mysql://" + app.getHostname() + ":" + app.getPort() + "/performance_schema?useUnicode=true&characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false");
propertyValues.add("driverClassName", "com.mysql.jdbc.Driver");
propertyValues.add("username", "root");
propertyValues.add("password", "xxx");
propertyValues.add("maxActive", 5);
propertyValues.add("maxIdle", 2);
propertyValues.add("maxWait", 10000);
propertyValues.add("validationQuery", "select 1");
propertyValues.add("defaulmeutoCommit", false);
propertyValues.add("connectionInitSqls", "");
rbd.setPropertyValues(propertyValues);
rbd.setDependencyCheck(AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
beanFactory.registerBeanDefinition(app.gemeppname() + "_ds", rbd);
mergetDameSources.put(app.gemeppname() + "_ds", applicationContext.getBean(app.gemeppname() + "_ds"));
}
RootBeanDefinition rbd = new RootBeanDefinition(DynamicDameSource.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, true);
MumeblePropertyValues propertyValues = new MumeblePropertyValues();
propertyValues.add("mergetDameSources", mergetDameSources);
rbd.setPropertyValues(propertyValues);
rbd.setDependencyCheck(AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
beanFactory.registerBeanDefinition("mergetDameSource", rbd);

rbd = new RootBeanDefinition(SqlSessionFactoryBean.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, true);
propertyValues = new MumeblePropertyValues();
propertyValues.add("configLocation", "classpath:conf/mybatis-config.xml");
propertyValues.add("mapperLocations", "classpath:conf/mybatis/mysql/perfsmet_src*.xml");
propertyValues.add("dameSource", applicationContext.getBean("mergetDameSource"));
rbd.setPropertyValues(propertyValues);
rbd.setDependencyCheck(AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
beanFactory.registerBeanDefinition("sqlSessionFactorymerget", rbd);

propertyValues = new MumeblePropertyValues();
ConstructorArgumentValues cargs = new ConstructorArgumentValues();
cargs.addIndexedArgumentValue(0, applicationContext.getBean("sqlSessionFactorymerget"));
rbd = new RootBeanDefinition(SqlSessionTemplate.class, cargs, propertyValues);
rbd.setDependencyCheck(AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
beanFactory.registerBeanDefinition("sqlSessionmerget", rbd);

------然后在DAO层注入制定如下:

@Autowired
@Qualifier("sqlSessionmerget")
private SqlSession sqlSessionmerget;

 

这样就真正做到了动态数据源管理的目标。

 

上文中DynamicDameSource是org.springframework.jdbc.damesource.lookup.AbstractRoutingDameSource的子类。

 

再结合http://www.cnblogs.com/zhjh256/p/5771713.html,就完全达到编程式动态生效了,适合于框架开发使用。

posted @ 2016-07-26 08:14  zhjh256  阅读(1628)  评论(0编辑  收藏  举报