我正在使用 Hibernate 和 Spring,相关配置:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory"><ref bean="sessionFactory" /></property>
</bean>
<tx:annotation-driven />
<aop:aspectj-autoproxy />
最佳答案
想想看...
某些代码想要从
DataSource
获取Connection
。可能是为了启动事务并运行一些 SQL 查询
<AbstractRoutingDataSource
执行defineCurrentLookupKey()
以便从一组可用的数据源中找到合适的DataSource
查找键用于获取当前
DataSource
。AbstractRoutingDataSource
从该数据源返回 JDBC 连接。连接从
AbstractRoutingDataSource
返回,就像它是普通源一样。
现在您问为什么 defineCurrentLookupKey()
没有在事务中运行?首先,Spring 必须转到第 1 点,以获取启动事务所需的一些数据库连接。看下一点。看到问题了吗?对我来说,这就像无限递归。
简单地说 - defineCurrentLookupKey()
无法在事务中运行,因为事务需要连接,并且该方法的目的是确定使用哪个 DataSource
来获取一个连接。另请参阅:Chicken or the egg .
同样,工程师也无法使用计算机来设计第一台计算机。
关于spring - 为什么在 @Transactional block 内没有调用 AbstractRoutingDataSource.defineCurrentLookupKey() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324644/