我有一個連接到多個 oracle 資料庫的 Spring Boot 2 Hibernate 5 多租戶應用程式。當我使用JpaRepository 時,一切都很好,即在收到 http 請求后,“攔截器”檢測資料源,“MultiTenantConnectionProvider”實作選擇正確的資料源以供TransactionManager 使用. 問題是什么?我想使用 TransactionInterceptor 來處理來自特定 bean(擴展 JdbcDaoSupport 或注入 JdbcDaoSupport 實作)的某些方法(帶有方法名稱)上的事務。對不起,如果我解釋得有點混亂。但是對于每個 http 請求,該 bean 的資料源是不可變的(默認資料源)。而注入的存盤庫在正確的事務中對正確的資料源進行操作。
<bean id="txProxyTemplate" abstract="true"
depends-on="transactionManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="genericJdbcDao" parent="txProxyTemplate">
<property name="target">
<bean class="org.broker.dao.impl.BaseGenericJdbcDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
</property>
</bean>
任何人都可以幫助解決這個問題嗎?
uj5u.com熱心網友回復:
我終于解決了這個問題。按照代碼部分:
@Bean("jdbcTemplate")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public JdbcTemplate jdbcTemplate(
@Qualifier("tenantIdentifierResolver") TenantIdentifierResolverImpl tenantResolver,
@Qualifier("tenantConnectionProvider") DataSourceMultiTenantConnectionProviderImpl dataSourceProvider) {
return new RhaJdbcTemplate(dataSourceProvider.selectDataSource(tenantResolver.resolveCurrentTenantIdentifier()));
}
@Bean(value = "transactionInterceptor")
public TransactionInterceptor transactionInterceptor(
@Qualifier("txProxyTemplateConfig") Properties txProxyTemplateConfig,
@Qualifier("transactionManager") PlatformTransactionManager transactionManager) {
TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
transactionInterceptor.setTransactionAttributes(txProxyTemplateConfig);
transactionInterceptor.setTransactionManager(transactionManager);
return transactionInterceptor;
}
@Bean("genericJdbcDAO")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public ProxyFactoryBean genericJdbcDAO(
@Qualifier("jdbcTemplate") JdbcTemplate jdbcTemplate) throws ClassNotFoundException {
BaseGenericJdbcDAOImpl genericJdbcDAO = new BaseGenericJdbcDAOImpl();
genericJdbcDAO.setJdbcTemplate(jdbcTemplate);
ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
proxyFactoryBean.setTarget(genericJdbcDAO);
proxyFactoryBean.setProxyInterfaces(new Class[] {BaseGenericJdbcDAO.class});
proxyFactoryBean.setInterceptorNames("transactionInterceptor");
return proxyFactoryBean;
}
然后將BaseGenericJdbcDAO注入控制器,作為示例:
@RestController
public class VoucherLineRest {
@Resource(name = "genericJdbcDAO")
private BaseGenericJdbcDAO genericJdbcDAO;
}
您將看到,對于每個請求,都選擇了正確的資料源,并且TransactionInterceptor攔截了從BaseGenericJdbcDAO bean呼叫的每個方法,并在其上應用了正確的事務傳播。
我希望你喜歡這種體驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375404.html
