主要做用:分主庫從庫兩個數據庫,實現負載均衡,通常來講咱們會把查詢展現鏈接在主庫,而後把一些增刪改功能放在從庫,即讓不一樣的請求分別請求不一樣的數據庫,緩解數據庫請求過多的壓力。主庫數據改變從庫中也會隨之改變,而從庫數據改變不會影響主庫。實施步驟主要是在項目中配置兩個數據的聯繫信息,根據請求方法的註解請求不一樣的數據庫,而在讀寫分離中咱們通常把切面放在mapper層,而後在每一個方法上加註解,執行時根據註解上數據庫信息決定請求哪一個數據庫
maven項目 讀寫分離步驟:
1,resources文件夾中添加四個文件:
spring-base.xml
主要有
<!-- 數據源切換 -->
<bean id="dataSourceExchange" class="com.jk.datasource.DataSourceExchange"/>
aop配置
<aop:config>
<aop:pointcut expression="execution(* com.jk.mapper..*.*(..))" id="dao"/>
<aop:advisor pointcut-ref="dao" advice-ref="dataSourceExchange" order="1" id="dao-ad"/>
</aop:config>
<!-- 配置數據源 使用拓展的動態數據源類 -->
<bean id="dataSource" class="com.jk.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">,、,
<!-- 引用自定義的一些讀寫數據源 -->
<entry key="dataSourceWrite" value-ref="dataSourceWrite"></entry>
<entry key="dataSourceRead" value-ref="dataSourceRead"></entry>
</map>
</property>
<!-- 默認目標數據源爲你主庫數據源 -->
<property name="defaultTargetDataSource" ref="dataSourceWrite"/>
</bean>
<!-- mybatis的SqlSession的工廠: SqlSessionFactoryBean dataSource:引用數據源 MyBatis定義數據源,贊成加載配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- mybatis自動掃描加載Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory
basePackage:指定sql映射文件/接口所在的包(自動掃描)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.jk.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
主從數據庫鏈接信息配置
<!-- 從數據庫 -->
<bean id="dataSourceRead" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3307/amusement?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<!-- 主數據庫 -->
<bean id="dataSourceWrite" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/amusement?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<!-- 讓分發器識別 控制層 -->
<context:annotation-config/>
<context:component-scan base-package="com.jk.controller"></context:component-scan>
<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加先後綴 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/view/"
p:suffix=".jsp" >
</bean>
在java包中新建主從配置文件包
主要包括4個文件
DataSource.java:主要做用是配置數據源名稱
DataSourceExchange.java:實現MethodInterceptor主要是得到方法名,根據方法上註解決定使用哪一個數據庫
if(dataSource!=null){
DataSourceHolder.setDataSource(dataSource.name());
}
return invocation.proceed();
DataSourceHolder.java:主要是對數據源的操做
DynamicDataSource:獲取數據源
在mapper中須要轉換數據庫的方法上加:
/*做用不大,標記使用哪一個數據源*/
@DataSource(name=DataSource.write)