高性能的单例或连接池?

Singleton or Connection pool for high perfs?

上下文

我有一个 RESTful API 对战游戏,使用 JAX-RS、tomcat8 和嵌入式 Neo4j。

今天我发现很多查询将在有限的时间内完成,我正在使用嵌入式来进行更快的查询,但我仍然希望尽可能快。

问题

其实问题有点不同,但差别不大。

实际上,我正在使用带有 getDabatase() 方法的 Singleton 返回当前 GraphDatabaseService 实例来开始事务,一旦完成,事务就关闭了......仅此而已。

我不知道最佳性能的最佳解决方案是单例模式还是池模式(比如创建数据库连接的 XX 个实例,并在数据库操作完成后重用它们)。

实际上我无法自己测试,因为我没有足够的连接甚至不知道哪个是最快的(也是最好的)。

此外,我想知道如果我创建一个 GraphDatabaseService 实例池,它们是否都能够访问相同的数据而不会被锁阻塞?

一定要使用游泳池。

创建数据库连接通常非常昂贵。使用池将确保连接保持合理的时间并尽可能重新使用。

GraphDatabaseService 实例上只创建 一个 并在任何地方使用它。无需为它们创建实例池。 GraphDatabaseService 是完全线程安全的,所以你可以不用担心并发(注意:事务是线程绑定的,所以你不能 运行 在同一个线程中进行多个事务)。

Neo4j中的所有操作都应该在Transaction中执行。提交事务写入事务日志,然后持久化到数据库中。一般规则是:

  • 始终尽早关闭事务(使用 try-with-resource)
  • 尽早关闭所有资源(ResourceIterator 由 findNodes() 和 execute() 返回)

Here您可以找到有关锁定策略的信息。


为确保获得最佳性能,您应该:

  • 检查数据库设置(内存映射)
  • 检查 OS 设置(文件系统)
  • 检查 JVM 设置(GC、堆大小)
  • 数据模型

Here 您可以找到一些有关 Neo4j 配置和优化的文章。他们都有有用的信息。