前提:链接对应的数据库必须提前添加JAR包或者添加maven依赖。
第一步;在application.properties文件里面添加如下代码
#sqlserver连接
jdbc.test.url=jdbc:sqlserver://data.(你自己数据库地址).com:1433;database=database jdbc.test.username=username jdbc.test.password=password #============================================================================ #sqlserver连接 #Mysqlconect jdbc.local.mysql.driverClassName=com.mysql.jdbc.Driver jdbc.mysql.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull jdbc.mysql.username=root jdbc.mysql.password=123456
#数据源初始化通用配置
jdbc.initialPoolSize=3 jdbc.maxPoolSize=20 jdbc.minPoolSize=3 jdbc.maxIdleTime=0 jdbc.acquireIncrement=5 jdbc.maxStatements=3 jdbc.idleConnectionTestPeriod=60
代码释义:application.properties文件里面存储的是以键对的形式存放,key=value形式,key命名是自定义的,主要以简洁明了为主,value必须以正确的形式填写,sqlserver填写sqlserver的url,
mysql填写mysql的url,驱动器以此类推,用户明和密码不用多说了。
第二步;applicationContext.xml中引入.properties文件如下代码,就可以在xml中用${key}替换指定的properties文件中的值,通常项目中都会将jdbc的配置放在properties文件中,在启动容器时,初始化bean时,${key}就会替换成properties文件中的值
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:properties/*.properties</value> </list> </property> </bean>
<bean id="dataSource" name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 指定连接数据库的驱动--> <!-- <property name="driverClass" value="${jdbc.driverClassName}"/> --> <!-- 指定连接池中保留的最大连接数. Default:15--> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/> <!-- 指定连接池中保留的最小连接数--> <property name="minPoolSize" value="${jdbc.minPoolSize}"/> <!-- 指定连接池的初始化连接数 取值应在minPoolSize 与 maxPoolSize 之间.Default:3--> <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/> <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0--> <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/> <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3--> <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/> <!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。 但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数. 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0--> <property name="maxStatements" value="${jdbc.maxStatements}"/> <!-- 每60秒检查所有连接池中的空闲连接.Default:0 --> <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/> <property name="testConnectionOnCheckout" value="true"> </property>
<!-- dataSource配置 --> <bean id="fromDataSource" parent="dataSource"> <property name="driverClass"> <value>${jdbc.driverClassName}</value> </property> <property name="jdbcUrl"> <value>${jdbc.from.url}</value> </property> <property name="user"> <value>${jdbc.from.username}</value> </property> <property name="password"> <value>${jdbc.from.password}</value> </property> </bean>
<bean id="mysqlDataSource" parent="dataSource"> <property name="driverClass"> <value>${jdbc.local.mysql.driverClassName}</value> </property> <property name="jdbcUrl"> <value>${jdbc.mysql.url}</value> </property> <property name="user"> <value>${jdbc.mysql.username}</value> </property> <property name="password"> <value>${jdbc.mysql.password}</value> </property> </bean> <!-- 动态DataSource配置 --> <bean id="dynamicDataSource" class="cn.com.(你自己包名).common.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry key="testDataSource" value-ref="testDataSource"/> <entry key="mysqlDataSource" value-ref="mysqlDataSource"/> </map> </property> <!--默认数据源设置--> <property name="defaultTargetDataSource" ref="testDataSource"/> </bean>
<!--数据源转换管理-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dynamicDataSource"/> </bean> <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
基础配置完成了,接下来是代码和使用
第三步;这是一个本地线程,把数据源存放在线程里面,什么时候用什么时候取,不用了可以清除数据源。
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource { // 对应动态数据源配置中的key public static final String DATA_SOURCE_TEST = "testDataSource"; public static final String DATA_SOURCE_MYSQL = "mysqlDataSource"; // 本地线程,获取当前正在执行的currentThreadmysqlDataSource public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setCustomerType(String customerType) { contextHolder.set(customerType); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); } @Override protected Object determineCurrentLookupKey() { return getCustomerType(); } 第四步;代码测试和切换数据源 //先清除一下数据源,防止数据源重复加载 DynamicDataSource.clearCustomerType(); //使用我的mysql数据源 DynamicDataSource.setCustomerType(DynamicDataSource.DATA_SOURCE_MYSQL)
执行结果:信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource@69653e16[ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, description -> null, driverClass -> com.microsoft.sqlserver.jdbc.SQLServerDriver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 69653e16, idleConnectionTestPeriod -> 60, initialPoolSize -> 3, jdbcUrl -> jdbc:sqlserver://data.xxxxx.com:1433;database=localerp, loginTimeout -> 0, maxIdleTime -> 0, maxPoolSize -> 20, maxStatements -> 3, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, properties -> {password=******, user=******}, propertyCycle -> 300, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, usesTraditionalReflectiveProxies -> false ]
以上是数据库初始化成功了