有一部分寫到一半沒寫完。
網路上整理資料
Spring的多事务配置(多个Transaction Manager)和使用方法 - 简书
Spring的多事务配置(多个Transaction Manager)和使用方法_Clement-Xu的专栏-CSDN博客
DataSource和SessionFactory的区别Zzrdark的博客-CSDN博客
如何在spring框架中解决多数据源的问题 - duanxz - 博客园
如何在spring框架中解决多数据源的问题_runming56的专栏-CSDN博客
The txManager bean in this case is of the HibernateTransactionManager type. In the same way as the DataSourceTransactionManager needs a reference to the DataSource, the HibernateTransactionManager needs a reference to the SessionFactory.
transactionManager 預設抓 transactionManager
1 | The default <tx:annotation-driven> target bean name transactionManager will still be used if no specifically qualified PlatformTransactionManager bean is found. |
我公司的專案使用上面方法無效
參照Spring的多事务配置(多个Transaction Manager)和使用方法 - 简书,照上面各種設定發現我的傳案無法正常使用,後來發現Dao繼承的GenericDao
裡面的SessionFactory
寫死,所以上面怎麼設定都會連到,想嘗試抓現在SessionFactory,看目前沒有想到方法。
Workaround 解決方法
設定 applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:/xxxPool</value>
<value>java:comp/env/xxxPool</value>
</property>
<property name="cache" value="false" />
</bean>
<bean id="dataSourceHistory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/xxxPool</value>
</property>
<property name="cache" value="false" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.Project.persistence.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.PostgreSQLDialect
</prop>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<!-- prop key="hibernate.default_schema">Project</prop -->
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/Project/conf/xxxx_sql.xml</value>
</list>
</property>
</bean>
<bean id="historySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSourceHistory"/>
<property name="packagesToScan" value="com.Project.persistence.history.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.PostgreSQLDialect
</prop>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.default_schema">history</prop>
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
....
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
<qualifier value="ProjectTx"/>
</bean>
<bean id="historyTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="historySessionFactory"/>
<qualifier value="historyTx"/>針對原本 Bean 建立物件,去做 ForHistory名稱,原因是 packagesToScan 時候,不能用相同 Entry 名稱,所以要特別命名。
XXXX.java ==> XXXXForHistory.java
- 複製
GenericDaoImpl
維GenericDaoForHistoryImpl
因為GenericDaoImpl
裡面 SessionFactory 寫死,所以為什麼上面設定怎麼調整,所以沒法修改到連線,這邊也是我目前沒辦法動態載入到連線(SessionFactory)地方。
1 | public class GenericDaoImpl<T> implements GenericDao<T> { |
改為1
2
private SessionFactory historySessionFactory;
@Resource
可以參考 Spring 自動注入小記 | 程式狂想筆記
- 查詢SQL設定
@Transactional
另一條連線
我們這邊applicationContext.xml 有設定historyTransactionManager
裡面的<qualifier value="historyTx"/>
記得設定對應資料
1 | "datasource1Tx") ( |
HibernateTransactionManager LocalEntityManagerFactoryBean 差異
https://blog.supercalifragilisticexpialidociouser.com/page/2/
yogi0209/spring-mvc-multi-datasource
尚未整理