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執行流程,執行方式不清楚的原因,實力問題)
希望有人碰到這類相同的問題,可以少走一些彎路,順便自己也記下來,方便回顧,哈哈