Синглтон или пул соединений для высокой производительности?

контекст

У меня есть API-интерфейс RESTful для файтинга с использованием JAX-RS, tomcat8 и Neo4j.

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

проблема

На самом деле, проблема немного в другом, но не так сильно.

На самом деле, я использую синглтон с getDabatase() метод, возвращающий текущий GraphDatabaseServiceэкземпляр для начала транзакции, как только она будет завершена, транзакция будет закрыта... и все.

Я не знаю, является ли лучшим решением для оптимального перфорирования шаблон синглтона или пул (например, создание XX экземпляров подключения к базе данных и их повторное использование после завершения операции с базой данных).

Я не могу проверить это на самом деле, потому что у меня нет достаточно соединений, чтобы даже знать, какой из них самый быстрый (и лучший в целом).

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

2 ответа

Решение

Ящик только один на GraphDatabaseService экземпляр и использовать его везде. Для них нет необходимости создавать пул экземпляров. GraphDatabaseService полностью потокобезопасен, поэтому вы можете не беспокоиться о параллелизме (примечание: транзакции связаны с потоками, поэтому вы не можете запускать несколько транзакций в одном потоке).

Все операции в Neo4j должны выполняться в транзакции. При фиксации транзакция записывается в журнал транзакций, а затем сохраняется в базе данных. Общие правила:

  • Всегда закрывайте транзакцию как можно раньше (используйте try-with-resource)
  • Закройте все ресурсы как можно раньше (ResourceIterator возвращается findNodes() и execute())

Здесь вы можете найти информацию о стратегии блокировки.


Чтобы быть уверенным, что у вас лучшая производительность, вы должны:

  • Проверьте настройки базы данных (отображение памяти)
  • Проверьте настройки ОС (файловая система)
  • Проверьте настройки JVM (GC, размер кучи)
  • Модель данных

Здесь вы можете найти несколько статей о конфигурации и оптимизации Neo4j. Все они имеют полезную информацию.

Использовать бассейн - определенно.

Создание подключения к базе данных, как правило, очень дорого. Использование пула гарантирует, что соединения будут храниться в течение разумного периода времени и будут использоваться по мере возможности.

Другие вопросы по тегам