当前位置: 首页 > 知识库问答 >
问题:

手动创建的多个数据源的事务管理

邢飞鸿
2023-03-14

我正在开发一个应用程序,其中我必须根据从客户端传递的客户id连接到不同的数据库。所有数据库的模式都是相同的。它是一种多租户应用程序。由于我不知道会有多少客户,我无法使用xml配置静态创建数据源,因此我必须手动创建数据源。

我们使用Spring JdbcTemplate连接到数据库,连接参数来自另一个保存应用程序配置的数据库。我能够正确连接到数据库,但方法调用不会在事务中发生。下面的代码片段只对一个数据库进行了数据库连接,我打算将其扩展到多个数据库:

BasicDataSource datasource = new BasicDataSource();
// set database connection params
....
// create jdbcTemplate, 
jdbcTemplate = new JdbcTemplate(datasource);
// create transaction managers
PlatformTransactionManager txManager = new DataSourceTransactionManager(datasource);

我的想法是手动创建事务管理器,并以某种方式将其绑定到spring容器中,以便所有带有@Transactional注释的方法/类都可以使用该事务管理器。我不知道如何绑定txManager,这样所有带有@Transactional的方法/类都将使用这个事务管理器。我不确定这是否正确,是否应该为每个数据源创建一个事务管理器,因为我不希望事务跨越多个数据库,但我希望每个服务方法调用都应该在一个事务中。注意:我的所有服务类都有@Component和@Transactional注释。

我用正确的方法解决问题了吗?

共有2个答案

龚招
2023-03-14

您可以使用spring的AbstractRoutingDatasource。

请检查以下链接。解释了AbstractRoutingDatasource。在这里,数据库根据所选语言进行动态更改。

Spring AbstractRoutingDatasSource

许彭祖
2023-03-14

我认为下面的答案提供了你想要的。否则,您将需要一个全局事务管理器。全局事务管理器将与JEE容器捆绑在一起,或者可以由TrnAction管理器(如Atomikos)单独提供。Spring文档涵盖了这两个方面

 类似资料:
  • 问题内容: 我在Junit应用程序上下文文件中定义了三个(JDBC)。其中两个需要进行事务管理;使用这两个数据源时,我不必链接任何方法(它们完全彼此独立)。 当我使用单个事务管理器作为时,我没有问题,即使已被使用但未在相应方法中进行管理。尽管如此,在还需要管理来自各种DAO类的方法(仅使用这些方法)后,我添加了第二个事务- 。上下文文件包含以下内容: 由于要定义多个事务管理器,因此我用他们自己的值

  • 我想要一些关于Spring Batch处理中数据流的信息,但在Internet上找不到我要找的东西(尽管本网站上有一些有用的问题)。 我正在努力建立在我们公司使用Spring Batch的标准,我们想知道当一个步骤中的多个处理器更新不同数据源上的数据时,Spring Batch的行为如何。 这个问题侧重于分块过程,但可以随意提供有关其他模式的信息。 从我所看到的情况来看(如果我错了,请纠正我),当

  • 我有一个Spring mvc rest webservice,它带有一个保存数据源地图的数据源管理器bean。每个客户都有自己的数据库,因此也有自己的数据源。webservice以编程方式从DataSourceManager加载客户数据源,如果不存在,则创建一个新的。 通过这种实现,可以使用注释驱动的事务管理吗?我阅读的所有示例都在配置文件中声明了一个或多个数据源。

  • null 下面是一个示例代码- 我的问题是,updateDb02中的setRollbackOnly()只回滚Db01事务。

  • 我试图从这里用我当前的应用程序实现数据源代理 我在Spring xml中配置了数据源对象,即在dataSourceProxy对象中传递dataSourceReal。 侦听器和过滤器与文档中一样正确配置。 Spring xml文件: 数据源名称的JNDI名称的xml文件: 我得到了这个错误: 请帮忙。

  • 我正在构建一个spring boot应用程序,它有多个数据源、实体管理器、事务管理器和数据库。每一个都是为一个客户提供的,并共享相同的DAO、服务。 数据源之间的切换工作得很好。但我对交易有问题 这里是我的配置: } 根据配置文件加载数据源。像LoadCust4DatasourceCondition之类的类用于检查是否加载。 我的数据源配置文件是: 我的服务就像: 我的刀是这样的: 在服务级别,如