语境
我有一个对抗战斗游戏的RESTful API,使用的是JAX-RS,tomcat8和Neo4j嵌入式。
今天,我发现很多查询将在有限的时间内完成,我将嵌入式用于更快的查询,但我仍然希望尽可能快。
问题
实际上,问题有点不同,但差别不大。
实际上,我正在使用具有getDabatase()
方法的Singleton返回当前GraphDatabaseService
实例以开始事务,一旦完成,事务就关闭了……仅此而已。
我不知道最佳性能的最佳解决方案是Singleton模式还是池模式(例如创建XX数据库连接实例,并在数据库操作完成后重用它们)。
我实际上无法亲自测试它,因为我没有足够的连接来知道哪一个是最快的(也是总体上最好的)。
另外,我想知道是否创建一个GraphDatabaseService
实例池,它们是否都能够访问相同的数据而不会被锁阻塞?
最佳答案
仅在GraphDatabaseService
实例上创建一个板条箱,并在各处使用它。无需为其创建实例池。 GraphDatabaseService
是完全线程安全的,因此您不必担心并发性(注意:事务是线程绑定的,因此您不能在同一线程中运行多个事务)。
Neo4j中的所有操作都应在Transaction中执行。提交时,事务将写入事务日志中,然后持久保存到数据库中。一般规则是:
始终尽早关闭事务(使用try-with-resource)
尽早关闭所有资源(由findNodes()和execute()返回的ResourceIterator
)
Here您可以找到有关锁定策略的信息。
为了确保您具有最佳性能,您应该:
检查数据库设置(内存映射)
检查操作系统设置(文件系统)
检查JVM设置(GC,堆大小)
资料模型
Here您可以找到有关Neo4j配置和优化的一些文章。他们都有有用的信息。