对于每个客户端,我都有单独的数据库,但每个客户端的业务逻辑和表都是相同的。我想要每个客户端的通用服务和 dao 层。在 dao 中,我根据登录的用户客户端选择数据源。在@Transactional
中,我必须传递事务管理器的 bean id。如何使用@Transactional
注释制作公共服务层。
同样的问题在这里
但没有人回复
对于每个客户端,我都有单独的数据库,但每个客户端的业务逻辑和表都是相同的。我想要每个客户端的通用服务和 dao 层。在 dao 中,我根据登录的用户客户端选择数据源。在@Transactional
中,我必须传递事务管理器的 bean id。如何使用@Transactional
注释制作公共服务层。
同样的问题在这里
但没有人回复
您无需在多个事务管理器之间进行配置和切换即可实现最终目标。而是使用 Spring 提供的org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
机制。
详细的例子可以在这里找到:
如果您想动态创建数据库连接,请查看此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驱动程序没有,所以如果你不确定,注册第二个没有什么害处,它只是在内存中创建一个重复的对象。
我不知道这是否可行,因为我还没有测试过,但你可以试试。
现在您可以做的是,使用@Transactional
DAO 顶部的注释而不指定任何值(有效)。现在在您的 DAO 类中,不要注入任何DataSource
bean,而是按照上面链接中的指定动态创建您自己的数据源,然后在运行时注入该依赖项,使用 getter setter 方法,或者只使用new
关键字。我希望这能解决问题。
注意:我自己还没有测试过,所以如果可行,请告诉我。