首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Spring:兼容mongodb的事务性和非事务性版本

Java Spring:兼容mongodb的事务性和非事务性版本
EN

Stack Overflow用户
提问于 2019-04-23 00:06:39
回答 2查看 1.2K关注 0票数 2

我使用的是Spring Boot 2.1.2版本( mongodb -driver v3.8.2),正在开发与mongodb一起运行的web应用程序。我的应用程序与mongodb 3.4版本兼容(该版本不支持事务),现在我引入了事务机制。我使用事务性注释来注释我的服务方法

代码语言:javascript
复制
@Transactional
    public void process(Object argument) {
        ...
        ...
        ...
    }

它在mongodb v4上运行得很好,所有的东西都可以正常工作--失败的事务会被回滚。

但是当我用mongodb v3.4启动我的应用程序时,我的应用程序崩溃了

代码语言:javascript
复制
Sessions are not supported by the MongoDB cluster to which this client is connected

异常。

问题是,我希望我的应用程序支持两种情况:事务性和非事务性,使用相同的代码(对于两个mongodb版本)。所以我想知道我该怎么做?似乎我的应用程序应该只为特定版本的mongo创建会话,也就是说,这个注释应该只在这种情况下处理。

我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-23 20:18:23

我找到了一个解决方案。Spring在创建事务之前检查当前上下文中是否存在PlatformTransactionManager。因此,如果未定义此bean,则不会为事务打开会话。因此,我在configuration类中使用了on condition bean来实现此目的:

代码语言:javascript
复制
    @Bean
    @Autowired
    @ConditionalOnExpression("'${mongo.transactions}'=='enabled'")
    MongoTransactionManager mongoTransactionManager(MongoDbFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }

因此,只有当mongo.transactions参数设置为enabled时,才会创建MongoTransactionManager bean。

票数 4
EN

Stack Overflow用户

发布于 2019-04-23 03:11:05

不确定它是否可以工作,但您可以尝试将@EnableTransactionManagement注释移动到新的配置类,将注释@Configuration@Profile("enableTransactions")添加到configuration类,并在需要自动配置事务管理时使用给定的配置文件运行应用程序,例如使用:

mvn spring-boot:run -Dspring-boot.run.profiles=enableTransactions

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55797342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档