主要作用:分主庫從庫兩個數據庫,實現負載均衡,一般來說我們會把查詢展示連接在主庫,然后把一些增刪改功能放在從庫,即讓不同的請求分別請求不同的數據庫,緩解數據庫請求過多的壓力。主庫數據改變從庫中也會隨之改變,而從庫數據改變不會影響主庫。實施步驟主要是在項目中配置兩個數據的聯系信息,根據請求方法的注解請求不同的數據庫,而在讀寫分離中我們一般把切面放在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>
spring-common.xml
<!-- 配置數據源 使用拓展的動態數據源類 -->
<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>
spring-dasource.xml
主從數據庫連接信息配置
<!-- 從數據庫 -->
<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>
springmvc-control.xml
<!-- 讓分發器識別 控制層 -->
<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)