1

对于每个客户端,我都有单独的数据库,但每个客户端的业务逻辑和表都是相同的。我想要每个客户端的通用服务和 dao 层。在 dao 中,我根据登录的用户客户端选择数据源。在@Transactional中,我必须传递事务管理器的 bean id。如何使用@Transactional注释制作公共服务层。

同样的问题在这里

  1. 多个事务管理器 - 在运行时选择一个 - Spring

  2. 在运行时在多个事务管理器之间进行选择

但没有人回复

4

2 回答 2

0

您无需在多个事务管理器之间进行配置和切换即可实现最终目标。而是使用 Spring 提供的org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource机制。

详细的例子可以在这里找到:

  1. https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
  2. http://howtodoinjava.com/spring/spring-orm/spring-3-2-5-abstractroutingdatasource-example/
于 2017-05-24T19:34:48.267 回答
0

如果您想动态创建数据库连接,请查看SO 帖子。

来自链接的帖子:基本上在 JDBC 中,大多数这些属性都不能像这样在 API 中配置,而是依赖于实现。JDBC 处理此问题的方式是允许每个供应商的连接 URL 不同。

所以你要做的是注册驱动程序,以便 JDBC 系统知道如何处理 URL:

DriverManager.registerDriver((Driver)
Class.forName("com.mysql.jdbc.Driver").newInstance());

然后形成 URL:

String url =
 "jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]"

最后,使用它来建立连接:

Connection c = DriverManager.getConnection(url);

在更复杂的 JDBC 中,您会涉及到连接池等,并且应用程序服务器通常有自己的方式在 JNDI 中注册驱动程序,您可以从那里查找 DataSource,并在其上调用 getConnection。

关于 MySQL 支持的属性,请参见此处(链接已失效)。

编辑:再想一想,从技术上讲,只需要一行代码就可以了 Class.forName("com.mysql.jdbc.Driver") 就足够了,因为该类应该有自己的静态初始化程序来注册一个版本,但有时是JDBC驱动程序没有,所以如果你不确定,注册第二个没有什么害处,它只是在内存中创建一个重复的对象。

我不知道这是否可行,因为我还没有测试过,但你可以试试。

现在您可以做的是,使用@TransactionalDAO 顶部的注释而不指定任何值(有效)。现在在您的 DAO 类中,不要注入任何DataSourcebean,而是按照上面链接中的指定动态创建您自己的数据源,然后在运行时注入该依赖项,使用 getter setter 方法,或者只使用new关键字。我希望这能解决问题。

注意:我自己还没有测试过,所以如果可行,请告诉我。

于 2016-05-09T13:58:05.320 回答