Mongodb在java中,多线程update时报错,请问是哪里出现的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb在java中,多线程update时报错,请问是哪里出现的问题相关的知识,希望对你有一定的参考价值。

看出错信息是你的线程使用太多了,超过了mongodb连接的最大线程数50,导致多余的线程一直在等待连接。你可以把线程数设小一点。 不用设置mongodb的线程数,只需要把number变量的值设小一点就行了,比如10. 参考技术A 不用设置mongodb的线程数,只需要把number变量的值设小一点就行了,比如10.
可以设置mongodb的连接池。试试这句话。 System.setProperty("MONGO.POOLSIZE",number);
MongoOptions options = mg.getMongoOptions();
options.autoConnectRetry = true;
options.connectionsPerHost =number;
,不过一般使用默认的连接池就够了,如果线程太多可能影响mongodb的效率。

在多线程应用程序中使用 mongodb 的正确方法

【中文标题】在多线程应用程序中使用 mongodb 的正确方法【英文标题】:proper way to use mongodb in multi-threading application 【发布时间】:2015-09-29 01:13:43 【问题描述】:

我有带有 cron 任务的服务器应用程序(在自己的线程中),我想将数据插入 mongodb 数据库,并且我想避免死锁或其他多线程问题。

我的代码:

from multiprocessing.dummy import Pool as ThreadPool
from pymongo import MongoClient
import sched
import time

TIME_INTERVAL = 3
THREAD_NUMBER = 4

s = sched.scheduler(time.time, time.sleep)
pool = ThreadPool(THREAD_NUMBER)

websites = [
    "website1",
    "website2",
    "website3",
    "website4",
]

def insert_to_mongo(result):
    #that is proper way ?
    mongo_client = MongoClient('localhost', 27017)
    dic = mongo_client["cjgs"]["tracks"]
    dic.insert("Result": result)

def parsing_site(station):
    print "Doing stuff for ", station
    insert_to_mongo("Result for " + station)

def recursion(sc, station):
    parsing_site(station)
    sc.enter(TIME_INTERVAL, 1, recursion, (sc, station,))

def run_cron_task(station):
    s.enter(TIME_INTERVAL, 1, recursion, (s, station,))
    s.run()

pool.map(run_cron_task, websites)

在这种情况下如何使用 mongodb ?如何使用装饰器和其他语法糖以更 Python 风格的方式编写这段代码?

【问题讨论】:

【参考方案1】:

您可以使用装饰器将所有线程内容封装到其中,如下所示:

def your_decorator(fun):
    # your threading stuff with fun

@decorator
def you_fun():
   # etc

但我建议你宁愿看一下 Two Phase Commit,这是 MongoDB 自己推荐的。

【讨论】:

以上是关于Mongodb在java中,多线程update时报错,请问是哪里出现的问题的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 单事务内使用多线程加速的简单例子

mongodb 单事务内使用多线程加速的简单例子

mongodb 单事务内使用多线程加速的简单例子

Qt:使用多线程结束时报错的问题

spring data jpa执行update和delete语句时报错处理

在多线程应用程序中使用 mongodb 的正确方法