语境

我有一个对抗战斗游戏的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配置和优化的一些文章。他们都有有用的信息。

10-05 18:50