在 hsqldb 中调用 CHECKPOINT sql 是不是可以,而另一个 sql 可能正在进行中?
Posted
技术标签:
【中文标题】在 hsqldb 中调用 CHECKPOINT sql 是不是可以,而另一个 sql 可能正在进行中?【英文标题】:Is it OK in hsqldb to invoke the CHECKPOINT sql while another sql might be in progress?在 hsqldb 中调用 CHECKPOINT sql 是否可以,而另一个 sql 可能正在进行中? 【发布时间】:2013-04-10 18:29:26 【问题描述】:换句话说,我必须将 CHECKPOINT 与另一个查询同步还是可以简单地在专用线程中定期执行它?
我的数据库不写日志。如果数据在崩溃时丢失,我可以,但我确实想定期刷新它并确保在应用程序终止时刷新它。
编辑
以下项目描述了我的场景:
-
使用嵌入式 hsqldb 引擎运行一系列简短的单元测试,将项目插入到专用数据库中。
将 hsqldb 作为连接到单元测试期间创建的数据库之一的独立服务器运行。
打开SQL Workbench/J 尝试连接到正在运行的独立 hsqldb 服务器。
SQL Workbench/J 根本不显示任何表。但是,如果我在插入所有记录后添加 CHECKPOINT,那么一切都很好。
【问题讨论】:
【参考方案1】:HSQLDB 总是安全地执行检查点。它使用一个单独的线程等待所有连接都提交,然后锁定数据库并执行检查点。
CHECKPOINT 有助于减少崩溃后重新启动数据库所需的时间。这不适用于您已禁用日志的数据库。
如果您不编写日志,则可能不需要检查点。在这种情况下使用检查点是为了回收已删除 lob 的空间(在 2.3.0 版本中)。它还会写出所有数据。
如果您想在测试结束时刷新数据库,可以改为执行 SHUTDOWN。
【讨论】:
请看我的编辑。这是否意味着在单元测试终止时没有刷新数据库?这是单元测试环境的特性吗? 好的。我错过了关于刷新应用程序的要点。将更新答案。 我比较担心生产代码。如果我从不执行 CHECKPOINT,则默认情况下每 10,000K 或 50,000 行写入一次数据,对吗?这没有说明时间,这可能需要多长时间才能填充缓存。我说的对吗? 不用担心数据被写出,引擎只有在需要缓存空间的时候才会写入数据。如果您希望数据库在加载数据后可用,只需执行 SHUTDOWN 并且不设置检查点。 感谢您的建议。数据加载过程可能需要数天时间,数据每隔几秒钟就会流动一次。假设在第一次写出缓存之前重新启动服务器。然后磁盘上的数据库是空的,我什至看不到表(这是单元测试中发生的事情)。因此,您建议此时关闭数据库。以上是关于在 hsqldb 中调用 CHECKPOINT sql 是不是可以,而另一个 sql 可能正在进行中?的主要内容,如果未能解决你的问题,请参考以下文章