1

我使用 Spring 框架在 jave 中配置 mongoDB。但是我发现保存对象时它的性能非常低。分别插入这样200条记录大约需要7000ms。

但是,当我使用 pymongo 做同样的插入操作时,速度非常快,大约 50 毫秒。

仅插入 200 个单独的对象需要 7 秒钟有什么问题吗?

mongodb的版本是2.4.1,这个性能测试是在fedora13,ubuntu 12.4和win8上进行的。

有人可以告诉我为什么并帮助我解决问题吗?

代码如下:

下面的代码需要超过 7000 毫秒:

MongoTemplate mongoTemplate = (MongoTemplate)SpringFactory.getFactory().getBean("mongoTemplate");
for (int i = 0; i <200; i++) {
   Person person = new Person;
   person.setName("test" + i);
   person.setAge(1234665 + i);
   mongoTemplate.insert(ncbiid);
}

下面的 Python 代码只需要 50ms:

connection = Connection('127.0.0.1', 27017)
db = connection['test']
def insert(num):
    posts = db.person
    for x in range(200):
        post = {"_id" : str(x),
             "name": str(x)+"Mike",
             "age": x}
        posts.insert(post)

这是人员类:

@Document(collection="person")
public class Person {
    @Indexed
    String name;
    int age;

    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

这是 Spring xml 文件的 mongodb 部分:

<mongo:mongo id="mongo" replica-set="127.0.0.1:27017">
    <mongo:options
         connections-per-host="8"
         threads-allowed-to-block-for-connection-multiplier="4"
         connect-timeout="1000"
         max-wait-time="1500"
         auto-connect-retry="true"
         socket-keep-alive="true"
         socket-timeout="1500"
         slave-ok="true"
         write-number="1"
         write-timeout="0"
         write-fsync="true"/>       
</mongo:mongo>

<mongo:db-factory dbname="test" mongo-ref="mongo"/>

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>

<mongo:mapping-converter base-package="com.database.model" />

<mongo:repositories base-package="com.database.mongorepo"/>
4

1 回答 1

3
mongoOps.insert(ncbiid);

这样做 200 次是 200 个单独的插入。

mongoTemplate.insert(lsPersons, "person");

这一次是一批插入 200 条记录。

如果对它们进行批处理,则意味着更少的数据库往返次数和更好的性能。

这是 MongoTemplate 的 java 文档,它告诉您一个是批处理操作。

于 2013-04-13T04:29:25.917 回答