【发布时间】:2012-02-10 12:34:40
【问题描述】:
我有一个桌面应用程序,将其数据保存在本地 H2 数据库中。我正在使用 Squeryl 连接到数据库。
数据库的大小非常小(大约 10kB)。我遇到了严重的性能问题,并且正在进行大量的磁盘 IO。我只是在读取数据库,因此我希望可以缓存完整的数据;我什至将缓存大小设置为某个值(远高于总数据库大小)。我也尝试禁用锁定但没有结果。
我的程序对数据库执行了非常多的小查询;基本上我有一个 Swing TableModel 对每个表条目(每行的每一列)进行查询。我将这些调用中的每一个包装到一个 Squeryl transaction 块中。
我使用 JVisualVM 创建了一个配置文件,我怀疑以下调用树显示了问题。最上面的方法是从我的代码中读取访问权限。
link to JVisualVM screen shot.
问题
我该如何解决这个问题或我做错了什么?不知何故,我希望我应该能够对一个小到可以保存在 1MB 内存以下的数据库进行许多小调用。为什么会发生此磁盘 IO,我该如何避免?
【问题讨论】:
-
我不知道它为什么这么慢,但问题是,如果你只需要这么小的数据库(最多几 MB)也许你可以在内存中使用 H2 实例(在启动时从 hdd 复制应用程序)?那么你根本不会有磁盘 IO 的问题......
-
@kuki 这基本上是个好主意。虽然我喜欢(罕见的)写访问现在立即在磁盘上;并且无需显式保存所有内容。