Синглтон или пул соединений для высокой производительности?
контекст
У меня есть API-интерфейс RESTful для файтинга с использованием JAX-RS, tomcat8 и Neo4j.
Сегодня я подумал, что много запросов будет выполнено за ограниченное время, я использую встроенные для более быстрых запросов, но я все еще хочу идти как можно быстрее.
проблема
На самом деле, проблема немного в другом, но не так сильно.
На самом деле, я использую синглтон с getDabatase()
метод, возвращающий текущий GraphDatabaseService
экземпляр для начала транзакции, как только она будет завершена, транзакция будет закрыта... и все.
Я не знаю, является ли лучшим решением для оптимального перфорирования шаблон синглтона или пул (например, создание XX экземпляров подключения к базе данных и их повторное использование после завершения операции с базой данных).
Я не могу проверить это на самом деле, потому что у меня нет достаточно соединений, чтобы даже знать, какой из них самый быстрый (и лучший в целом).
Кроме того, мне интересно, если я создам пул GraphDatabaseService
экземпляры, смогут ли они все получить доступ к одним и тем же данным, не блокируясь блокировкой?
2 ответа
Ящик только один на GraphDatabaseService
экземпляр и использовать его везде. Для них нет необходимости создавать пул экземпляров. GraphDatabaseService
полностью потокобезопасен, поэтому вы можете не беспокоиться о параллелизме (примечание: транзакции связаны с потоками, поэтому вы не можете запускать несколько транзакций в одном потоке).
Все операции в Neo4j должны выполняться в транзакции. При фиксации транзакция записывается в журнал транзакций, а затем сохраняется в базе данных. Общие правила:
- Всегда закрывайте транзакцию как можно раньше (используйте try-with-resource)
- Закройте все ресурсы как можно раньше (
ResourceIterator
возвращается findNodes() и execute())
Здесь вы можете найти информацию о стратегии блокировки.
Чтобы быть уверенным, что у вас лучшая производительность, вы должны:
- Проверьте настройки базы данных (отображение памяти)
- Проверьте настройки ОС (файловая система)
- Проверьте настройки JVM (GC, размер кучи)
- Модель данных
Здесь вы можете найти несколько статей о конфигурации и оптимизации Neo4j. Все они имеют полезную информацию.
Использовать бассейн - определенно.
Создание подключения к базе данных, как правило, очень дорого. Использование пула гарантирует, что соединения будут храниться в течение разумного периода времени и будут использоваться по мере возможности.