Как лучше всего использовать сервис в потоках Java? - PullRequest
0 голосов
/ 05 января 2019

Я пишу приложение, которое будет запускать несколько потоков - их количество варьируется в зависимости от исполнения, но, как правило, более 5 и менее 100 - каждый из которых будет многократно считываться из базы данных Mongo.

public class MyThread implements Runnable {
    private MyMongoClient myMongoClient = MyMongoClient.getInstance();

    public MyThread() {
    }

    @Override
    public void run() {
        Document myDocument = myMongoClient.getDocumentById("id");
        Document newDocument = new Document("id": "newId");
        myMongoClient.writeDocument(newDocument);
    }
}

У меня есть существующий класс синглтон-сервиса для запроса и обновления Mongo, и я хотел бы получить какие-либо советы по шаблонам для использования в потоках?

public class MyMongoClient {
    private static MyMongoClient INSTANCE = new MyMongoClient();
    private myCollection; 

    private MyMongoClient() {
        try (MongoClient mongoClient = new MongoClient(host)) {
            MongoDatabase db = mongoClient.getDatabase("myDatabase");
            myCollection = db.getCollection("myCollection");
        } 
    }

    public static MyMongoClient getInstance() {
        return INSTANCE;
    }

    private Document getObjectById(String id) {
        // Implementation
    }

    private write writeDocument(Document document) {
        // Implementation
    }    
}

Как показано, каждый поток будет читать из существующих записей, но не обновлять ни одну из них, и будет писать новые записи, используя тот же сервис

Должен ли каждый поток использовать один и тот же экземпляр службы или мне нужно переписать службу, чтобы у каждого потока был свой экземпляр?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вы можете использовать ThreadPoolExecutor. Он обрабатывает все, вы просто отправляете задачу в пул.

В моем примере keepAliveTime=10 сек., Его значение зависит от ваших требований.

ExecutorService threadPoolExecutor = new ThreadPoolExecutor(
            5,
            100,
            10,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>()
    );

См. Учебное пособие по Oracle для платформы Executors .

0 голосов
/ 05 января 2019

Вы получите сообщение об ошибке, потому что вы закрываете MongoClient в этом конструкторе. MongoClient имеет встроенный пул соединений, поэтому нет причин создавать более одного. Создайте только один и поделитесь им среди своих тем.

...