java - H2 性能建议

标签 java database h2

我目前正在处理一个更大的数据库,虽然我没有具体问题,但我想要一些建议,如果有人有的话。

数据库为 2.2 GB(重建/压缩后)。它包含大约 50 个表。其中一个表包含一个 blob 和一些元数据。它目前有大约 22000 行。如果我从表中删除 blob (UPDATE table SET blob = null),数据库大小将减少到大约 200 兆字节(在重建/压缩之后)。元数据被大量访问,但是并不经常需要 blob。

我目前使用的数据库网址是:

jdbc:h2:D:/data;AUTO_SERVER=true;MVCC=true;CACHE_SIZE=524288

它在我们的 Java 虚拟机中运行,该虚拟机的最大堆内存为 4GB。

我想知道的一些事情:

  • 在单独的进程中运行 H2 会对性能产生任何影响(是好是坏)?
  • 将 blob 放在与元数据具有 1-1 关系的单独表中是否有帮助?我可以想象它会有助于缓存,而不是让 blob 挡路?
  • 对于是将 blob 包含在数据库中还是将它们写入文件系统上的文件并在数据库中建立链接,互联网似乎存在分歧。这里有任何针对 H2 的建议吗?

最佳答案

您的答案取决于 blob 数据的增长率。例如,如果您的数据集将以每周 10% 的速度增长——那么尝试扩展 H2 的使用来存储 blob 数据就没有什么意义了(因为它会很快超过可用堆内存的速度)。相反,如果 blob 数据是最大的,那么尝试使用 H2 可能 是有意义的。

回答你关于 H2 的问题:

1) 在单独的进程中运行 H2 将允许 H2 占用大部分堆空间 - 使得控制 H2 的可用堆空间更易于管理。但是,您还将增加维护和监控单独流程的维护开销。所以答案是“这取决于你的操作环境和目标”。如果你有时间和人力,在单独的进程中运行 H2 可能是有意义的。但如果这是真的 - 那么您可能应该考虑只运行一个合适的 blob 存储平台。

2) 是的,您是正确的,将 blob 存储在单独的表中有助于缓存 - 在您不经常需要 blob 的情况下。它还应该有助于缩短检索时间,因为 H2 不必读取 blob 来查找元数据。

3) 请注意,“互联网”代表着成千上万的人,他们拥有几乎同样多的不同特定用例。您需要将您的用例过滤为需求,然后应用您从其他人那里收集的逻辑。

4) 我个人的建议是,如果您正在尝试构建可扩展且可维护的平台,请使用正确的工具。 H2 或任何其他关系数据库通常不是存储许多大型 blob 的正确工具。我建议您调查使用键/值存储。

关于java - H2 性能建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30660993/

相关文章:

java - H2 postgresql 模式似乎对我不起作用

sql - H2 DB CSVREAD命令将值转换为日期,然后再放入VARCHAR

database - 为什么在打开 H2 控制台时看不到从 Java 添加的表?

java - 在java中使用日期,并且仅使用日期

java - 如何将YouTube播放列表解析为ArrayList

php - 需要一个高效的 mysql 数据库模式来存储积分/评级

sql-server - 嵌套事务的目的

java - GSON java.lang.IllegalArgumentException : class 'xx' declares multiple JSON fields named 'XX' AND StackOverflowError 错误

java - 在 Java 中为变量分配动态名称

java - Android:EditText 返回与内容相同的值