數據庫讀寫分離小例子

主要做用:分主庫從庫兩個數據庫,實現負載均衡,通常來講咱們會把查詢展現鏈接在主庫,而後把一些增刪改功能放在從庫,即讓不一樣的請求分別請求不一樣的數據庫,緩解數據庫請求過多的壓力。主庫數據改變從庫中也會隨之改變,而從庫數據改變不會影響主庫。實施步驟主要是在項目中配置兩個數據的聯繫信息,根據請求方法的註解請求不一樣的數據庫,而在讀寫分離中咱們通常把切面放在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&amp;characterEncoding=UTF-8&amp;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&amp;characterEncoding=UTF-8&amp;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)
相關文章
相關標籤/搜索