如何在Mongo Async Java Driver上实现多线程?

时间:2015-09-20 11:14:42

标签: java multithreading spring performance mongodb

我正在尝试在Spring应用程序上实现高吞吐量的Inserts / Second(没有Spring数据)。我尝试使用以下代码插入一百万个文档:

public void insert(Address address) {
       Document address = new Document("_id", address.getId()).
                         append("zip_code", address.getZipCode).
                         append("street_1", address.getStreet1()).
                         append("street_2", address.getStreet2());

      db.getCollection("address").insertOne(address, (Void result, Throwable t)
                                      -> System.out.println("Inserted"));
}

存储库代码如下:

 @Bean
 public MongoClient mongoClient() {
        return MongoClients.create("mongodb://localhost");
 }

我可以集合的最大写入次数约为4k /秒。有没有办法以多线程的方式做到这一点,以获得更高的每秒写入次数?

我对MongoClient的Spring bean配置是:

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: accept EMFILE
    at exports._errnoException (util.js:746:11)
    at TCP.onconnection (net.js:1308:24)

2 个答案:

答案 0 :(得分:1)

这是直接异步驱动程序使用的示例 https://github.com/mongodb/mongo-java-driver/tree/master/driver-async 并且api看起来并不好......我认为它到目前为止还没准备好。 PS:vert.x有真正的async mongo驱动程序,它运行良好(在压力测试期间0%cpu)

<强>更新

Next Spring Data release将具有反应功能:ReactiveCrudRepository,ReactiveMongoTemplate等。 Cassandra和Redis也在支持名单中。查找详细信息here

答案 1 :(得分:0)

我认为在尝试多线程之前,您可以检查MongoDB Java驱动程序(BulkWriteOperation类)中可用的MongoDB批量操作API(https://docs.mongodb.org/manual/core/bulk-write-operations/)。

检查:http://mongodb.github.io/mongo-java-driver/2.13/getting-started/quick-tour/#bulk-operations:b8bcd3c4cba9ac16433f82561ee44461