[英]Java Spring: Compatibility for both transactional and non-transactional versions of mongodb
我正在使用Spring Boot 2.1.2版本(mongodb-driver v 3.8.2),並開發可與mongodb一起運行的Web應用程序。 我的應用程序與mongodb 3.4版本兼容(此版本不支持事務),現在我要介紹事務機制。 我用事務注釋來注釋我的服務方法
@Transactional
public void process(Object argument) {
...
...
...
}
並且在mongodb v 4上運行良好,一切都在預期之中-失敗的事務將回滾。
但是,當我使用mongodb v 3.4啟動我的應用程序時,我的應用程序崩潰了
Sessions are not supported by the MongoDB cluster to which this client is connected
例外。
問題是我希望我的應用程序支持兩種情況:具有相同代碼的事務性和非事務性(對於兩個mongodb版本)。 所以我想知道我該怎么做? 似乎我的應用程序應僅針對特定版本的mongo創建會話,即,僅應在這種情況下處理此批注。
我該怎么做?
我找到了解決方案。 Spring在創建事務之前檢查當前上下文中是否存在PlatformTransactionManager
。 因此,如果未定義此bean,則不會打開會話進行事務處理。 因此,我在配置類中為此使用了條件豆:
@Bean
@Autowired
@ConditionalOnExpression("'${mongo.transactions}'=='enabled'")
MongoTransactionManager mongoTransactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
因此,僅當mongo.transactions參數設置為enabled時,才會創建MongoTransactionManager
bean。
不確定它是否有效,但是您可以嘗試將@EnableTransactionManagement
批注移動到新的配置類,將批注@Configuration
和@Profile("enableTransactions")
到配置類,並在給定配置文件時運行應用程序需要自動配置事務管理,例如使用:
mvn spring-boot:run -Dspring-boot.run.profiles=enableTransactions
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.