【问题标题】:The cached table is not cached but in memory when using hsqldb使用 hsqldb 时缓存表不缓存而是在内存中
【发布时间】:2011-11-15 09:33:18
【问题描述】:

我正在尝试 hsqldb 2.2.5 版本的缓存表功能。

只使用JDBC批量插入一张表,奇怪的是如果 尽管我使用了创建缓存表,但我单独运行测试, 但它仍然使用内存模式,因为在 100,0000 条记录之后,OOM

但是如果我在这个测试用例之前运行一些其他测试或者使用jdbc:hsqldb:mem:HSQLDB;hsqldb.default_table_type=cached ,它将使用缓存表。

无论如何,我不想默认使用缓存。

缓存表的表现是这样的 2600000 条记录后,性能下降很多。 3600000 条记录后,变得很慢

可能是某些索引占满了内存让JVM变慢了。 不是因为db本身

两个子问题

1)任何其他强制缓存表使用缓存模式的配置?

2)任何 db 配置将有助于提高缓存表的性能?

(使用JDK1.6 -Xmx1024m)

【问题讨论】:

    标签: hsqldb caching


    【解决方案1】:

    您报告的 URL 用于 mem:(内存中的所有内容 - 无持久性)数据库。在此设置中,对 CACHED 表的任何引用或设置都将被忽略,数据存储在内存中。

    可用的 CACHED 表功能是 file:(持久化到磁盘)数据库。这些数据库还支持持久性 MEMORY 表(所有数据都存储在内存中)。 CACHED 和 MEMORY 表的数据都存储在磁盘上的file: 数据库中。

    关于 CACHED 的性能,最近使用的行缓存在内存中,当缓存满时,更改会保存到磁盘。

    数据库引擎使用java.nio 方法访问磁盘上大于16MB 且低于某个限制的数据库。为了提高性能,您可以使用 hsqldb.nio_max_size 属性或等效的 SQL 语句来增加限制。

    通常,磁盘在随机访问模式下速度很慢(每秒最多访问 100 次)。使用缓存、nio 和其他策略可以减少有效访问时间,但只是在一定程度上。

    还请注意,您可以在批量插入期间关闭数据记录,然后再次打开以进行正常的数据库操作。

    本指南的这一章介绍了这些问题和设置。

    http://hsqldb.org/doc/2.0/guide/deployment-chapt.html

    【讨论】:

    • @fredit,感谢您的有用建议。但我觉得很奇怪,即使在 URL 中使用 mem,我也确实看到了不使用缓存的区别。比较从 3600000 到 1000000 的总记录。如果不是因为使用 CACHED 表,我感到很奇怪。 +1
    • @fredit,我真的希望我们可以在 mem url 中使用缓存表。由于我想在使用 hsqldb 时混合使用内存表和缓存表。有可能吧?
    • @Clark,是的,你可以混合使用。更新了答案。详情请阅读指南。
    • @fredit,为什么我不想使用文件模式是因为我希望在关闭 JVM 并重新连接到它时清理数据库。我可以设置一些东西让它像这样工作吗?
    • 你必须使用file:模式来持久化数据。您可以使用 SQL 语句清除 db 对象。
    猜你喜欢
    • 2012-01-15
    • 2016-07-21
    • 1970-01-01
    • 2021-06-30
    • 2012-12-19
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多