簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM