我使用的是Spring Boot 2.1.2版本( mongodb -driver v3.8.2),正在开发与mongodb一起运行的web应用程序。我的应用程序与mongodb 3.4版本兼容(该版本不支持事务),现在我引入了事务机制。我使用事务性注释来注释我的服务方法
@Transactional
public void process(Object argument) {
...
...
...
}
它在mongodb v4上运行得很好,所有的东西都可以正常工作--失败的事务会被回滚。
但是当我用mongodb v3.4启动我的应用程序时,我的应用程序崩溃了
Sessions are not supported by the MongoDB cluster to which this client is connected
异常。
问题是,我希望我的应用程序支持两种情况:事务性和非事务性,使用相同的代码(对于两个mongodb版本)。所以我想知道我该怎么做?似乎我的应用程序应该只为特定版本的mongo创建会话,也就是说,这个注释应该只在这种情况下处理。
我该怎么做呢?
发布于 2019-04-23 20:18:23
我找到了一个解决方案。Spring在创建事务之前检查当前上下文中是否存在PlatformTransactionManager
。因此,如果未定义此bean,则不会为事务打开会话。因此,我在configuration类中使用了on condition bean来实现此目的:
@Bean
@Autowired
@ConditionalOnExpression("'${mongo.transactions}'=='enabled'")
MongoTransactionManager mongoTransactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
因此,只有当mongo.transactions参数设置为enabled时,才会创建MongoTransactionManager
bean。
发布于 2019-04-23 03:11:05
不确定它是否可以工作,但您可以尝试将@EnableTransactionManagement
注释移动到新的配置类,将注释@Configuration
和@Profile("enableTransactions")
添加到configuration类,并在需要自动配置事务管理时使用给定的配置文件运行应用程序,例如使用:
mvn spring-boot:run -Dspring-boot.run.profiles=enableTransactions
https://stackoverflow.com/questions/55797342
复制相似问题