1

语境

我有一个用于对抗格斗游戏的 RESTful API,使用 JAX-RS、tomcat8 和嵌入的 Neo4j。

今天我认为很多查询将在有限的时间内完成,我使用嵌入式来进行更快的查询,但我仍然想尽可能快地进行。

问题

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

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

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

实际上我自己无法测试它,因为我没有足够的联系甚至不知道哪个是最快的(并且是整体上最好的)。

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

4

2 回答 2

2

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

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

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

在这里您可以找到有关锁定策略的信息。


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

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

在这里你可以找到一些关于 Neo4j 配置和优化的文章。他们都有有用的信息。

于 2015-09-14T13:03:27.837 回答
-1

使用游泳池 - 绝对。

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

于 2015-09-14T08:57:26.503 回答