使用Spring @ Transactionnal,Spring如何知道要使用哪个数据源? - java

在Spring上使用@Transactionnal时

  • 如何选择应在其上打开事务的数据源?
  • 是否有诸如代理,threadlocals之类的魔术?
  • 如果是这样,那么这些技巧是否可与任何JDBC库一起使用(对于Hibernate,它可以工作,但是MyBatis呢?)
  • 如果有2个数据源怎么办?
  • 如果我在@Transactionnal服务中调用带有2个底层不同数据源的DAO,该怎么办?对于两个数据源还是仅对其中一个数据源都是事务性的,否则它将失败吗?
  • 谢谢

    参考方案

    要使用多个事务处理程序,只需指定一个限定符,然后对其进行引用。对于具有两个不同数据源的两个不同的DAO,您将需要两个不同的事务管理器。当然,交易应该在您的服务级别上进行,而不是直接在DAO上进行。对于任何类型的transactionmanager来说都是相同的,无论它是休眠的还是普通的旧的jdbc。

    <bean id="transactionManagerOne"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager"
            p:sessionFactory-ref="sessionFactoryOne">
            <qualifier value="One" />
        </bean>
    

    和会话工厂

    <bean id="sessionFactoryOne"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
            p:dataSource-ref="dataSourceOne"
    

    并只设置一个ID为dataSourceOne的数据源,然后使用限定符名称在代码中引用transactionmanager:

    @Transactional(value = "One")
    

    使用Spring JDBC Oracle设置会话时区 - java

    我有一个spring / jdbc / oracle 10g应用程序。Oracle服务器数据库时区设置为GMT + 2 JVM时区设置为GMT + 2(即使对于我而言这无关紧要)。我有一个执行某些日期操作的存储过程。问题是,即使我未在代码/配置中明确设置会话时区,会话时区也不同于数据库时区(GMT)。据我所知,会话时区默认情况下等于数据库时区。是否知道会话时…

    Hibernate:现实世界中的模式导出? - java

    我很好奇我的下一个项目完全使用架构导出。我认为这是真正处理对象而非基础数据库的非常有用的方法。只需创建并注释模型,然后将其导出即可。但是从先创建表然后创建模型对象的习惯来看,我对完全使用模式导出有疑问。这主要是因为我真的很深入休眠。但是我仍然好奇使用模式导出时,该区域列表是否会成为问题。请分享您的经验..表之间的关系代理/复合主键支持当我只想从多个模型中导出…

    使用Spring AOP配置Hibernate会话 - java

    我有一个使用Hibernate 4.3.8作为JPA提供程序的Spring Framework 4应用程序。我想使用休眠过滤器,因此需要启用它们。我想在应用程序中全局进行此操作,而我正在尝试使用Spring AOP。我的想法是,我可以编写一个方面,以便每次创建/获取会话时都启用过滤器,例如this和this问题。我已经将spring-aop和aspectjw…

    Java-搜索字符串数组中的字符串 - java

    在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)