spring - 为什么在 @Transactional block 内没有调用 AbstractRoutingDataSource.defineCurrentLookupKey() ?

标签 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. 某些代码想要从DataSource 获取Connection。可能是为了启动事务并运行一些 SQL 查询

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

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

  4. 连接从 AbstractRoutingDataSource 返回,就像它是普通源一样。

现在您问为什么 defineCurrentLookupKey() 没有在事务中运行?首先,Spring 必须转到第 1 点,以获取启动事务所需的一些数据库连接。看下一点。看到问题了吗?对我来说,这就像无限递归。

简单地说 - defineCurrentLookupKey() 无法在事务中运行,因为事务需要连接,并且该方法的目的是确定使用哪个 DataSource 来获取一个连接。另请参阅:Chicken or the egg .

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

关于spring - 为什么在 @Transactional block 内没有调用 AbstractRoutingDataSource.defineCurrentLookupKey() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324644/

相关文章:

spring - Hibernate4 和 Lobhandler

java - 无法使用 SpringMVC 通过 Hibernate 将 ItemDetail 列表 ie.List<ItemDetail> (OBJECT) 插入 MySQL 数据库字段

java - 如何在 Spring Boot 中使用显式指定的编码器

spring - HibernateTemplate 类转换异常

java - Spring:在 Java 配置中定义自定义 @Transactional 行为

performance - 来自 Hibernate App 的查询不使用数据库索引

java - 如何在 Hibernate 中创建/调用 sql View

mysql - 删除 Hibernate 中键“PRIMARY”的重复条目 '59'

c# - 命名空间 'Transactions' 中不存在类型或命名空间名称 'System'

redis - Redis ZPOP的实现