Spring Data MongoDB-更新需要几秒钟才能完成?
我正在使用SpringDataMongoDB与我的mongodb设置交互。我正在测试不同的写关注点,并注意到对于未确认的写关注点,更新1000个文档的时间大约为5-6秒,即使未确认的写关注点并不等待任何确认。 我用原始java驱动程序测试了同样的程序,时间大约为40毫秒 是什么导致了原始java驱动程序和spring数据mongodb更新之间的巨大时间差 注意,我使用的是未确认的写关注点和mongodb v2.6.1以及默认配置 添加用于比较的代码:- 原始Java驱动程序代码:-Spring Data MongoDB-更新需要几秒钟才能完成?,mongodb,spring-data-mongodb,Mongodb,Spring Data Mongodb,我正在使用SpringDataMongoDB与我的mongodb设置交互。我正在测试不同的写关注点,并注意到对于未确认的写关注点,更新1000个文档的时间大约为5-6秒,即使未确认的写关注点并不等待任何确认。 我用原始java驱动程序测试了同样的程序,时间大约为40毫秒 是什么导致了原始java驱动程序和spring数据mongodb更新之间的巨大时间差 注意,我使用的是未确认的写关注点和mongodb v2.6.1以及默认配置 添加用于比较的代码:- 原始Java驱动程序代码:-
MongoClient mongoClient = new MongoClient("localhost", 27017);
DB db = mongoClient.getDB( "testdb" );
DBCollection collection = db.getCollection("product");
WriteResult wr = null;
try {
long start = System.currentTimeMillis();
wr = collection.update(
new BasicDBObject("productId", new BasicDBObject("$gte", 10000000)
.append("$lt", 10001000)),
new BasicDBObject("$inc", new BasicDBObject("price", 100)),
false, true, WriteConcern.UNACKNOWLEDGED);
long end = System.currentTimeMillis();
System.out.println(wr + " Time taken: " + (end - start) + " ms.");
}
弹簧代码:-
Config.xml
<mongo:mongo host="localhost" port="27017" />
<mongo:db-factory dbname="testdb" mongo-ref="mongo" />
<bean id="Unacknowledged" class="com.mongodb.WriteConcern">
<constructor-arg name="w" type="int" value="0"/>
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<property name="writeConcern" ref="Unacknowledged"/>
</bean>
注册代码:-
ProductDAOImpl productDAO = new ProductDAOImpl();
productDAO.setMongoTemplate(mongoTemplate);
long start = System.currentTimeMillis();
productDAO.update(10000000, 10001000, 100);
long end = System.currentTimeMillis();
System.out.println("Time taken = " + (end - start) + " ms.");
模式:-
{
"_id" : ObjectId("53b64d000cf273a0d95a1a3d"),
"_class" : "springmongo.domain.Product",
"productId" : NumberLong(6),
"productName" : "product6",
"manufacturer" : "company30605739",
"supplier" : "supplier605739",
"category" : "category30605739",
"mfgDate" : ISODate("1968-04-26T05:00:00.881Z"),
"price" : 665689.7224373372,
"tags" : [
"tag82",
"tag61",
"tag17"
],
"reviews" : [
{
"name" : "name528965",
"rating" : 6.5
},
{
"name" : "name818975",
"rating" : 7.5
},
{
"name" : "name436239",
"rating" : 3.9
}
],
"manufacturerAdd" : {
"state" : "state55",
"country" : "country155",
"zipcode" : 718
},
"supplierAdd" : {
"state" : "state69",
"country" : "country69",
"zipcode" : 691986
}
}
希望有帮助。您确定您正在测试完全相同的场景吗?没有更多关于你到底在做什么的细节,很难判断。是的,我保持一切不变。问题是,这只会在更新时发生。使用insert或remove,我看不出有什么明显的区别。如果您愿意共享您的架构、示例文档和用于测试的代码,人们会更容易帮助您。正如我对未确认的写入问题所理解的那样,驱动程序应该只在套接字上编写更新查询并返回。它不等待来自服务器的任何确认。spring是否可能在内部等待确认?
{
"_id" : ObjectId("53b64d000cf273a0d95a1a3d"),
"_class" : "springmongo.domain.Product",
"productId" : NumberLong(6),
"productName" : "product6",
"manufacturer" : "company30605739",
"supplier" : "supplier605739",
"category" : "category30605739",
"mfgDate" : ISODate("1968-04-26T05:00:00.881Z"),
"price" : 665689.7224373372,
"tags" : [
"tag82",
"tag61",
"tag17"
],
"reviews" : [
{
"name" : "name528965",
"rating" : 6.5
},
{
"name" : "name818975",
"rating" : 7.5
},
{
"name" : "name436239",
"rating" : 3.9
}
],
"manufacturerAdd" : {
"state" : "state55",
"country" : "country155",
"zipcode" : 718
},
"supplierAdd" : {
"state" : "state69",
"country" : "country69",
"zipcode" : 691986
}
}