Java 如何使用Spring切换动态事务?
首先,非常感谢您阅读我的文章 我有一个具有以下体系结构的web应用程序:Java 如何使用Spring切换动态事务?,java,spring,hibernate,architecture,spring-transactions,Java,Spring,Hibernate,Architecture,Spring Transactions,首先,非常感谢您阅读我的文章 我有一个具有以下体系结构的web应用程序: WEB <-> ManagedBean (JSF) <-> Service <-> DAO -> DataBase 1 -> DataBase 2
WEB <-> ManagedBean (JSF) <-> Service <-> DAO
-> DataBase 1
-> DataBase 2
-> DataBase n
是否可以动态更改数据库连接?模式完全相同,但是我需要(取决于ManagedBean上的参数)使用不同的事务管理器
我在DAO上放置了一个拦截器,读取了一个hibernate文件,启动了selects,它就可以工作了,但是在事务上下文中是不可能的,因为Spring在它创建的事务中进行提交
先谢谢你
是否可以动态更改数据库连接
如果使用事务性注释,唯一的方法是更改数据源定义(在应用程序上下文中)。但是不,如果不更改事务实现,就不能单独在java中以编程方式完成 支持不启动事务,知道事务在哪里启动吗?我可以在事务注释中添加一个表示数据源的最终参数,但我需要动态执行。如果可以直接执行,我会将它放在我的答案中。另一种选择是使用N个服务层bean实例,每个实例都绑定到不同的数据源,并通过服务的路由实现动态路由到它们。如果将服务层拆分为许多类,可能会出现问题;我已经为不同的数据源定义了一个个人Spring作用域,并且,不是只有一个服务类实例,而是每个数据源都有一个实例,但是现在我需要使用新的数据源配置、XML或try-catch块来加载新的服务。你觉得怎么样?:)不看代码很难说,但是因为没有标准的首选解决方案,你可以选择任何适合你的解决方案。所以。。。我必须编写自己的允许变量的事务注释,不是吗?不,您不能在运行时更改注释。您必须使用事务性注释以外的其他内容,如@mrembisz所说。或者更改数据源定义(我假设它在您的应用程序上下文中)。我知道我有两个选择:1。删除注释,并通过XML配置来完成,创建XML dinamically或2。删除注释并通过try-catch块执行事务。
@Transactional("myDataSource")
public void doCommit( MyObject object );