2

我正在使用带有 Spring 的 Hibernate,相关配置:

<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 />
4

1 回答 1

5

想一想...

  1. 一些代码想要Connection从 a 中获取 a DataSource。可能是为了启动事务并运行一些 SQL 查询

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

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

  4. 连接是从返回的,AbstractRoutingDataSource就好像它是一个正常的源一样。

现在你问为什么determineCurrentLookupKey()不在事务中运行?第一个 Spring 必须转到第 1 点,以获取启动事务所需的一些数据库连接。看下一点。看到问题了吗?对我来说闻起来像无限递归。

简单地说 -determineCurrentLookupKey()不能在事务中运行,因为事务需要连接,并且该方法的目的是确定DataSource使用哪个来获取连接。另见:鸡或蛋

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

于 2012-04-26T18:47:18.937 回答