高性能的单例或连接池?
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 配置和优化的文章。他们都有有用的信息。
上下文
我有一个 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 配置和优化的文章。他们都有有用的信息。