为什么在@Transactional块中没有调用AbstractRoutingDataSource.determineCurrentLookupKey()?

时间:2012-04-25 22:20:15

标签: spring hibernate transactions

我正在使用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 />

1 个答案:

答案 0 :(得分:4)

考虑一下......

  1. 有些代码希望从Connection获取DataSource。可能是为了启动事务并运行一些SQL查询

  2. AbstractRoutingDataSource执行determineCurrentLookupKey()以便从一组可用的DataSource中找到合适的DataSource

  3. 查找键用于获取当前 AbstractRoutingDataSourceAbstractRoutingDataSource返回该数据源的JDBC连接。

  4. determineCurrentLookupKey()返回连接,就像它是正常来源一样。

  5. 现在你问为什么determineCurrentLookupKey()没有在交易中运行? First Spring必须转到第1点来获取启动事务所需的一些数据库连接。看下一点。看到问题?闻到无限的递归给我。

    简单地说 - DataSource无法在事务中运行,因为事务需要连接,并且该方法的目的是确定使用哪个{{1}}来获取连接。另见:Chicken or the egg

    同样,工程师也无法使用计算机来设计第一台计算机。