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

时间:2019-04-22 16:06:39

标签: java spring mongodb transactions spring-data

我正在使用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创建会话,即仅应在这种情况下处理此批注。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

不确定它是否有效,但是您可以尝试将 class ShoppingCart2{ private String[] arrayItems; private int numItems; public ShoppingCart2(){ arrayItems = new String[20]; numItems = 0; } public void addItems(String itemName){ for(int i = 0; i < numItems; i++){ if(numItems==arrayItems.length) System.out.println("Cart is full."); else{ arrayItems[numItems]= itemName; numItems++; } } } public ShoppingCart2 getTotal(){ ShoppingCart2 total = new ShoppingCart2(); for(int i = 0; i < numItems; i++){ /////I've tried several different methods here, they always ////lead to either /// a need to dereference or the non static method error } return total;} public String toString() { NumberFormat fmt = NumberFormat.getCurrencyInstance(); String cart = "\nShopping Cart\n"; for (int i = 0; i < numItems; i++) cart += arrayItems[i] + "\n"; cart += "\nTotal Price: " + fmt.format(total); cart += "\n"; return cart; } } 注释移至新的配置类,将注释@EnableTransactionManagement@Configuration添加到配置类,然后运行需要自动配置事务管理时,使用给定配置文件的应用程序,例如使用:

@Profile("enableTransactions")

答案 1 :(得分:1)

我找到了解决方案。 Spring在创建事务之前检查当前上下文中PlatformTransactionManager是否存在。因此,如果未定义此bean,则不会打开会话进行事务处理。因此,我在配置类中为此使用了条件豆:

    @Bean
    @Autowired
    @ConditionalOnExpression("'${mongo.transactions}'=='enabled'")
    MongoTransactionManager mongoTransactionManager(MongoDbFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }

因此,仅在mongo.transactions参数设置为enabled的情况下,才会创建MongoTransactionManager bean。