1. 程式人生 > >SSM框架多資料來源配置以及一直呼叫預設的資料來源的問題

SSM框架多資料來源配置以及一直呼叫預設的資料來源的問題

今天突然想到,學習一下SSM框架多資料來源配置問題,於是上網查了查,發現配置都很簡單,這裡就不做過多的講解了,說一下,我遇到的問題

就一個問題,配置按照網上說的配置了之後,測試N遍還是呼叫的預設的資料庫

問什麼?

查了半天時間,一直追查到底層才發現,自己配置沒有完全配置好,哪裡沒配置好呢?

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    
        <property name="dataSource" ref="dynamicDataSource" />    
        <!-- 自動掃描mapping.xml檔案 -->    
        <property name="mapperLocations" value="classpath:zkwyht/com/mapper/*.xml"></property>    
    </bean> 
這個熟悉SSM的都應該知道,不做過多解釋,回到原話,哪裡沒配置好呢,就是這個    <property name="dataSource" ref="dynamicDataSource" />    這裡的ref,

原本我的ref呼叫的是dataSource,也就是預設的資料庫,而dynamicDataSource這裡才是多資料來源的配置

    <bean id="dynamicDataSource" class="zkwyht.com.utils.DynamicDataSource">  
         <property name="targetDataSources">  
             <map key-type="java.lang.String">
                 <!-- 指定lookupKey和與之對應的資料來源 -->
                 <entry key="dataSource" value-ref="dataSource"></entry>  
                 <entry key="dataSource2" value-ref="dataSource2"></entry>  
             </map>  
         </property>  
         <!-- 這裡可以指定預設的資料來源 -->
         <property name="defaultTargetDataSource" ref="dataSource" />  
   </bean> 

也就是為什麼我們一直測試呼叫的都是預設的原因


網上說的很多事務需要在AOP控制,優先呼叫AOP等,多新增一個新資料庫的事務等,其實這些都沒錯,但是和一直呼叫預設的資料庫關係不算大,為什麼呢?

你自己這樣配置好之後,你可以試試把事務關掉,發現並沒多大影響,因為問題的源頭不一樣(當然我也是慢慢看著這些大神的摸索到最後這個原理)

講下原理:這個從SSM專案啟動的第一步開始,

第一步:SSM專案啟動優先執行web.xml,裡面有SSM配置的執行順序(和這個問題關係不大,正常配置順序即可)

第二步:當它執行到spring-db.xml(連線資料庫的xml),這裡會從上往下執行,而你裡面配置的假如是多個,其實它也記錄下來了,

第三步:當程式執行的時候,與資料庫互動的時候,它把記錄下來的連線方式,資訊等開始進行連線,後面就是增刪改查了

而最重要的是,它只是記錄了,而去調那個,或者怎麼調,卻是在spring-db.xml裡面的(為了方便,多貼上一下)

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="prototype">    
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />    
        <property name="url" value="jdbc:mysql://localhost:3306/zkwy" />
        <property name="username" value="root" />    <!--  root-->
        <property name="password" value="openq11" />  
        
        <property name="initialSize" value="0"></property>    
       
        <property name="maxActive" value="100"></property>    
         
        <property name="maxIdle" value="100"></property>    
    
        <property name="minIdle" value="1"></property>    
     
        <property name="maxWait" value="60000"></property>    
    </bean>
    
    <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="prototype">     
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />    
        <property name="url" value="jdbc:mysql://localhost:3306/baoxian" />
        <property name="username" value="root" />    <!--  root-->
        <property name="password" value="openq11" />  

        
        <property name="initialSize" value="0"></property>    
       
        <property name="maxActive" value="100"></property>    
         
        <property name="maxIdle" value="100"></property>    
    
        <property name="minIdle" value="1"></property>    
     
        <property name="maxWait" value="60000"></property>    
    </bean>
    
    <bean id="dynamicDataSource" class="zkwyht.com.utils.DynamicDataSource">  
         <property name="targetDataSources">  
             <map key-type="java.lang.String">
                 <!-- 指定lookupKey和與之對應的資料來源 -->
                 <entry key="dataSource" value-ref="dataSource"></entry>  
                 <entry key="dataSource2" value-ref="dataSource2"></entry>  
             </map>  
         </property>  
         <!-- 這裡可以指定預設的資料來源 -->
         <property name="defaultTargetDataSource" ref="dataSource" />  
   </bean> 

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    
        <property name="dataSource" ref="dynamicDataSource" />    
        <!-- 自動掃描mapping.xml檔案 -->    
        <property name="mapperLocations" value="classpath:zkwyht/com/mapper/*.xml"></property>    
    </bean>
這裡來決定調那個,也就是說,當你的專案執行的時候,專案就通過這段程式碼  <property name="dataSource" ref="dynamicDataSource" />   
來決定調那個資料庫了,而當我們配置成這樣的時候,專案就不確定調那個資料庫了,需要你

 @Override
     protected Object determineCurrentLookupKey() {
         // 從自定義的位置獲取資料來源標識
         //System.out.println(DynamicDataSourceHolder.getDataSource());
         return DynamicDataSourceHolder.getDataSource();
     }

這段程式碼來告訴他,去執行那個資料庫資訊

所以,最終的解決方法是要從

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    
        <property name="dataSource" ref="dynamicDataSource" />    
        <!-- 自動掃描mapping.xml檔案 -->    
        <property name="mapperLocations" value="classpath:zkwyht/com/mapper/*.xml"></property>    
    </bean>

這裡來入手,它才是控制資料庫連線的關鍵,其它是為了給他提供資料庫資訊等而產生的

所以本人學習的時候,測試了N遍,專案也不報錯,但就是無法靈活切換資料來源,一直死調預設的資料來源的解決原因(還是對SSM執行流程,執行方式不清楚的原因,實力問題)

希望有人碰到這類相同的問題,可以少走一些彎路,順便自己也記下來,方便回顧,哈哈