Spring事务管理器和数据源的Java配置方式,在不创建新实例的情况下传递相同的bean id。

6 浏览
0 Comments

Spring事务管理器和数据源的Java配置方式,在不创建新实例的情况下传递相同的bean id。

目标:我想在我的数据源上引入一个事务管理器。寻找使用同一实例的数据源和事务管理器的正确方法。我的要求是使用Java配置方式将“同一实例”的数据源传递给事务管理器。如果我对此理解有误,请纠正我。

在我的情况下,我有一个数据源,类型是autocommit false,通过使用下面指定的事务管理器,我想要提交/回滚一个事务(例如,在事务中进行更新操作/还原更新操作---当事务中有错误/没有错误时)。

然而,在调试过程中,我注意到当我使用下面指定的Java配置时,我得到了两个不同的数据源实例,trx.commit()不起作用。

编程式事务管理

(https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch10s06.html)

    @Bean
    public DataSource dataSource() {
        return getMyDataSource();    //新的数据源实例。//此数据源是autocommit-false
    }
    @Bean
    public DataSourceTransactionManage trxManager() {
        return getTransationManage(dataSource()); //这将创建另一个数据源实例
    }

非常感谢对此的任何帮助。

编辑:

我在使用Spring的Mybatis。基本上,我必须正确配置DataSouce。下面的链接对此很有帮助。

[将参数动态传递给Spring bean][1] [Mybatis事务管理CTM和PTM][2] [Spring事务管理笔记][3] [Spring和JTA笔记][4]

  [1]: https://stackoverflow.com/a/21202458/5086633
  [2]: http://www.mybatis.org/spring/transactions.html
  [3]: https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch10s06.html
  [4]: https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction

0
0 Comments

问题的原因是在Spring中,当使用Java配置方式配置事务管理器(Transaction Manager)和数据源(DataSource)时,如果传递相同的bean ID,会导致创建新的实例而不是使用已存在的实例。

解决方法是在配置事务管理器的方法中添加一个参数,并将数据源的bean ID作为参数传递。这样Spring会自动注入具有相同bean ID的实例。

以下是解决方法的示例代码:

public DataSourceTransactionManager trxManager(DataSource dataSource) {
    return getTransationManage(dataSource);
}

需要注意的是,需要在方法所在的类上添加注解,示例代码如下:

@Configuration
public class AppConfig {
    // 配置数据源和其他Bean
}

如果在传递数据源的参数上遇到"multiple bean found of dataSource"的错误,可以通过给数据源的bean添加一个名称(name = "myDataSource")来解决,并相应地更改参数的名称(DataSource myDataSource)。

以上就是解决这个问题的原因和方法,在Java配置方式下传递相同的bean ID而不创建新实例的方法。

0