数据库读写分离 spring-common.xml和jdbcConfig.properties配置

spring-common.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
	default-autowire="byType">

	<!-- 向 Spring 容器注册注解 -->
	<context:annotation-config />

	<!--加在dubbo的配置文件 -->
	<import resource="classpath:dubbo-reference.xml" />

	<!-- 扫描Service -->
	<context:component-scan base-package="com.base" />
	<context:component-scan base-package="com.bxh" />

	<!-- 引入数据库连接配置文件 DecryptPropertyPlaceholderConfigurer-->
	<bean id="mybatisPropertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="order" value="1" />
		<property name="ignoreUnresolvablePlaceholders" value="true" />
		<property name="locations">
			<list>
				<value>classpath:jdbcConfig.properties</value>
			</list>
		</property>
	</bean>


	<!--配置写入数据源 primary="true"必须设置属性为主数据源 -->
	<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource"
		init-method="init" destroy-method="close" primary="true">
		<property name="driverClassName" value="${jdbc.driver.class}"></property>
		<property name="url" value="${jdbc.writeUrl}"></property>
		<property name="username" value="${jdbc.writeUsername}"></property>
		<property name="password" value="${jdbc.writePassword}"></property>
		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialSize" value="${jdbc.pool.initialSize}" />
		<property name="minIdle" value="${jdbc.pool.minIdle}" />
		<property name="maxActive" value="${jdbc.pool.maxActive}" />
		<property name="maxWait" value="${jdbc.maxWait}" />
		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />
		<property name="validationQuery" value="${jdbc.validationQuery}" />
		<property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
		<property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
		<property name="testOnReturn" value="${jdbc.testOnReturn}" />
		<property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="${jdbc.maxPoolPreparedStatementPerConnectionSize}" />
		<property name="filters" value="config,stat" />
	</bean>

	<!--配置读取数据源1 -->
	<bean id="readDataSource1" class="com.alibaba.druid.pool.DruidDataSource"
		init-method="init" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver.class}"></property>
		<property name="url" value="${jdbc.read1Url}"></property>
		<property name="username" value="${jdbc.read1Username}"></property>
		<property name="password" value="${jdbc.read1Password}"></property>
		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialSize" value="${jdbc.pool.initialSize}" />
		<property name="minIdle" value="${jdbc.pool.minIdle}" />
		<property name="maxActive" value="${jdbc.pool.maxActive}" />
		<property name="maxWait" value="${jdbc.maxWait}" />
		<property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
		<property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />
		<property name="validationQuery" value="${jdbc.validationQuery}" />
		<property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
		<property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
		<property name="testOnReturn" value="${jdbc.testOnReturn}" />
		<property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="${jdbc.maxPoolPreparedStatementPerConnectionSize}" />
		<property name="filters" value="config,stat" />
	</bean>


	<!--配置读取数据源2 
	<bean id="readDataSource2" class="com.alibaba.druid.pool.DruidDataSource"
		init-method="init" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver.class}"></property>
		<property name="url" value="${jdbc.read2Url}"></property>
		<property name="username" value="${jdbc.read2Username}"></property>
		<property name="password" value="${jdbc.read2Password}"></property>
		<property name="initialSize" value="${jdbc.pool.initialSize}" />
		<property name="minIdle" value="${jdbc.pool.minIdle}" />
		<property name="maxActive" value="${jdbc.pool.maxActive}" />
		<property name="maxWait" value="${jdbc.maxWait}" />
		<property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
		<property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />
		<property name="validationQuery" value="${jdbc.validationQuery}" />
		<property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
		<property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
		<property name="testOnReturn" value="${jdbc.testOnReturn}" />
		<property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="${jdbc.maxPoolPreparedStatementPerConnectionSize}" />
		<property name="filters" value="config,stat" />
	</bean>-->

	<!-- 1.动态配置数据源 -->
	<bean id="readWriteDataSource" class="com.base.datasouce.ReadWriteDataSource">
		<property name="writeDataSource" ref="writeDataSource" />
		<property name="readDataSourceMap">
			<map>
				<!--可配置多个读数据源 -->
				<entry key="readDataSource1" value-ref="readDataSource1" />
				<entry key="readDataSource2" value-ref="readDataSource1" />
				<!--<entry key="readDataSource3" value-ref="readDataSource1" />-->
			</map>
		</property>
	</bean>

	<!--当之前操作是写的时候,是否强制从从库读 默认(false) 当之前操作是写,默认强制从写库读 -->
	<bean id="readWriteDataSourceTransactionProcessor" class="com.base.datasouce.ReadWriteDataSourceProcessor">
		<property name="forceChoiceReadWhenWrite" value="false" />
	</bean>

	<!-- jdbctemplate模板获取dataSource -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
		abstract="false" lazy-init="false" autowire="default">
		<property name="dataSource" ref="readWriteDataSource" />
	</bean>
	
	<aop:config proxy-target-class="true">
		<!-- 只对业务逻辑层实施事务 -->
 		<aop:pointcut id="txPointcut" expression="execution(* com.*.service..*.*(..))" /> 
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> 
		<!-- 通过AOP切面实现读/写库选择 -->
		<aop:aspect order="-2147483648" ref="readWriteDataSourceTransactionProcessor" > 
			<!--determineReadOrWriteDB方法用于决策是走读/写库的 -->
			<aop:around pointcut-ref="txPointcut" method="determineReadOrWriteDB" /> 
		</aop:aspect>
	</aop:config>

	<!-- 定义事务管理 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="readWriteDataSource" />
	</bean>
	<!-- 拦截器方式配置事物 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
		
			<!--写入数据库 -->
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="create*" propagation="REQUIRED" />
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="merge*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="remove*" propagation="REQUIRED" />
			<tx:method name="lock" propagation="REQUIRED" />
			<tx:method name="unlock*" propagation="REQUIRED" />
			<tx:method name="check*" propagation="REQUIRED" />

			<!--read-only读取数据库 -->
			<tx:method name="select*" read-only="true" />
			<tx:method name="load*" read-only="true" />
			<tx:method name="put*" read-only="true" />
			<tx:method name="query*" read-only="true" />
			<tx:method name="use*" read-only="true" />
			<tx:method name="get*" read-only="true" />
			<tx:method name="count*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="list*" read-only="true" />
			<!--指定目标方法采用哪种事务管理 -->
			<tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
		</tx:attributes>
	</tx:advice>


	<!-- Spring 工具类 -->
	<bean id="springContextUtil" class="com.base.utils.SpringContextUtil" />
	<!-- 处理文件上传 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="utf-8" />
		<property name="maxInMemorySize" value="10240" />
		<property name="uploadTempDir" value="/temp/" />
		<property name="maxUploadSize" value="-1" />
	</bean>

</beans>


jdbcConfig.properties

着重记录  失效链接的检查和读写分离配置

#1.数据连接超时的配置参考:http://blog.csdn.net/stubborn_cow/article/details/47775683
#2.druid pool参数的配置参考:http://www.cnblogs.com/KohnKong/articles/6014918.html
jdbc.driver.class=net.sf.log4jdbc.DriverSpy

#写数据源(本地开发 读写可配置一样的数据库地址)
jdbc.writeUrl=jdbc:log4jdbc:mysql://127.0.0.1:3306/bxh_simulation_0410?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true&failOverReadOnly=false
jdbc.writeUsername=root
jdbc.writePassword=root.2016

#读数据源1
jdbc.read1Url=jdbc:log4jdbc:mysql://localhost:3306/bxh_simulation_0410?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true&failOverReadOnly=false
jdbc.read1Username=root
jdbc.read1Password=root.2016

#读数据源2
#jdbc.read2Url=jdbc:log4jdbc:mysql://10.200.112.206:3306/bxh8?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
#jdbc.read2Username=root
#jdbc.read2Password=123456


#初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时   
jdbc.pool.initialSize=1
#最小连接数
jdbc.pool.minIdle=2
#定义最大连接池数量   
jdbc.pool.maxActive=200
#获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。   
jdbc.maxWait=60000 
 #有两个含义:1) Destroy线程会检测连接的间隔时间;2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明   
jdbc.timeBetweenEvictionRunsMillis=60000
#连接池中连接,在时间段内一直空闲,被逐出连接池的时间(1000*60*60),以毫秒为单位 
jdbc.minEvictableIdleTimeMillis=300000
#是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。  
#在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。5.5及以上版本有PSCache,建议开启。   
jdbc.poolPreparedStatements=false  
#要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。  
#在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说20  
jdbc.maxPoolPreparedStatementPerConnectionSize=20  
#用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。   
jdbc.validationQuery=SELECT 1 
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。   
jdbc.testOnBorrow=true  
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。  
jdbc.testOnReturn=false  
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。   
jdbc.testWhileIdle=true
#属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat;日志用的filter:log4j;防御sql注入的filter:wall   
jdbc.filters=wall



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值