spring动态配置多数据源

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

起因:在当前我手上的一个项目中需要多个数据源,并且来自于不同类型的数据库...因为很多历史原因.这个项目的住数据源是MySQL,整个系统的CURD都是操作的这个数据库.但是还有另外两个用于数据采集的数据库:MSSQL,ACCESS.还好只是用于数据采集,在事务上可以不要跨数据库了,这一点节省了好多的工作量.环境:我搭建的测试环境是spring2.5.6+hibernate3.2思路:动态切换数据源确切的来说是在同一类型数据库的情况下的。意思就是说,在系统中的使用的数据库分布在多台数据库服务器或者在同台服务器上的多个数据库.在运行时期间根据某种标识符来动态的选择当前操作的数据库.1.数据源是相同类型的数据库:一个SessionFactory+动态数据源+一个事务管理器2.数据源是不同类型的数据库:根据类型配置多套SessionFactory模拟:两个mysql数据源+一个Access数据源实现:1.切换数据源需要标识符,标识符是Object类型packagelhp.example.context;publicenumDBType{dataSource1,dataSource2;}2.然后创建一个用于切换数据源(设置或者获得上下文)的工具类复制代码packagelhp.example.context;publicclassContextHolder{privatestaticfinalThreadLocalObjectholder=newThreadLocalObject();publicstaticvoidsetDbType(DBTypedbType){holder.set(dbType);}publicstaticDBTypegetDbType(){return(DBType)holder.get();}publicstaticvoidclearDbType(){holder.remove();}}复制代码3.创建动态数据源类,继承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource这个类.复制代码packagelhp.example.context;importjava.util.logging.Logger;importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;publicclassDynamicDataSourceextendsAbstractRoutingDataSource{publicstaticfinalLoggerlogger=Logger.getLogger(DynamicDataSource.class.toString());@OverrideprotectedObjectdetermineCurrentLookupKey(){DBTypekey=ContextHolder.getDbType();//获得当前数据源标识符//logger.info(当前数据源:+key);returnkey;}}复制代码4.然后配置多个数据源复制代码!--数据源1:mysql--beanid=dataSource1class=com.mchange.v2.c3p0.ComboPooledDataSourcepropertyname=driverClassvalue=com.mysql.jdbc.Driver/propertyname=jdbcUrlvalue=jdbc:mysql://127.0.0.1:3306/dec/propertyname=uservalue=root/propertyname=passwordvalue=//bean!--数据源2:mysql--beanid=dataSource2class=com.mchange.v2.c3p0.ComboPooledDataSourcepropertyname=driverClassvalue=com.mysql.jdbc.Driver/propertyname=jdbcUrlvalue=jdbc:mysql://127.0.0.1:3306/lms/propertyname=uservalue=root/propertyname=passwordvalue=//bean!--数据源3:access--beanid=dataSource3class=com.mchange.v2.c3p0.ComboPooledDataSourcepropertyname=driverClassvalue=sun.jdbc.odbc.JdbcOdbcDriver/propertyname=jdbcUrlvalue=jdbc:odbc:accessTest/propertyname=uservalue=administrator/propertyname=passwordvalue=XLZX0309//bean!--mysql动态数据源设置--beanid=mysqlDynamicDataSourceclass=lhp.example.context.DynamicDataSourcepropertyname=targetDataSources!--标识符类型--mapkey-type=lhp.example.context.DBTypeentrykey=dataSource1value-ref=dataSource1/entrykey=dataSource2value-ref=dataSource2//map/propertypropertyname=defaultTargetDataSourceref=dataSource1//bean复制代码5.配置sessionFactory复制代码!--mysqlsessionFactory--beanid=mysqlSessionFactoryclass=org.springframework.orm.hibernate3.LocalSessionFactoryBeanpropertyname=dataSourceref=mysqlDynamicDataSource/propertyname=hibernatePropertiespropspropkey=hibernate.dialectorg.hibernate.dialect.MySQLDialect/proppropkey=hibernate.show_sqltrue/proppropkey=hibernate.hbm2ddl.autoupdate/prop!--createvalidate--propkey=hibernate.query.substitutionstrue1,false0/prop/props/property/bean!--accesssessionFactory--beanid=aceessSessionFactoryclass=org.springframework.orm.hibernate3.LocalSessionFactoryBeanpropertyname=dataSourceref=dataSource3/propertyname=hibernatePropertiesprops!--access语法和MSSQL相似所以用的MSSQL方言,或者可以使用第三方方言--propkey=hibernate.dialectorg.hibernate.dialect.SQLServerDialect/proppropkey=hibernate.jdbc.batch_size30/proppropkey=hibernate.jdbc.fetch_size50/proppropkey=hibernate.show_sqltrue/proppropkey=hibernate.format_sqlfalse/proppropkey=hibernate.hbm2ddl.autoupdate/prop!--createvalidate--propkey=hibernate.query.substitutionstrue1,false0/proppropkey=hibernate.cglib.use_reflection_optimizertrue/prop!--propkey=hibernate.cache.use_second_level_cachetrue/prop--!--propkey=hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/prop--!--propkey=hibernate.cache.use_query_cachetrue/prop--!--propkey=hibernate.generate_statisticstrue/prop--!--propkey=hibernate.cache.provider_configuration_file_resource_pathclasspath:ehcache.xml/prop--/props/property/bean复制代码6.测试用例复制代码packagelhp.example.junit;importstaticorg.junit.Assert.*;importjava.sql.DatabaseMetaData;importlhp.example.context.ContextHolder;importlhp.example.context.DBType;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.junit.Before;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassServiceTest{privateApplicationContextcontext;//三个数据源的URLprivateStringdataSource1_URL=jdbc:mysql://127.0.0.1:3306/dec;privateStringdataSource2_URL=jdbc:mysql://127.0.0.1:3306/lms;privateStringdataSource3_URL=jdbc:odbc:accessTest;privateSessionFactorymysqlSessionFactory;privateSessionFactoryaceessSessionFactory;@BeforepublicvoidsetUp()throwsException{//选择数据源初始化springContextHolder.setDbType(DBType.dataSource1);//String[]xmlFiles=newString[]{applicationContext-dataSource.xml,applicationContext-hibernate.xml,applicati

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功