从 Hibernate 处理的 h2 数据库的表中删除是不是会损坏表?
Posted
技术标签:
【中文标题】从 Hibernate 处理的 h2 数据库的表中删除是不是会损坏表?【英文标题】:Does deleting from a table of a h2 database handled by Hibernate corrupts the table?从 Hibernate 处理的 h2 数据库的表中删除是否会损坏表? 【发布时间】:2020-06-18 14:45:41 【问题描述】:这里是系统的简要说明:
Java 7 REST 客户端接收 json 并通过 Hibernate 将其解析的内容写入 h2 数据库。 一些 Pentaho Kettle Spoon 4 ETL 直接连接到同一个数据库以一次读取和删除大量条目。此解决方案在我们的测试环境中运行良好,但在生产环境中(当然,流量确实更高)ETL 经常失败并出现以下错误
Error inserting/updating row
General error: "java.lang.ArrayIndexOutOfBoundsException: -1"; SQL statement:
DELETE FROM TABLE_A
WHERE COLUMN_A < ? [50000-131]
如果我浏览数据库,我确实可以看到该表不可读(显然是因为它认为它的长度是-1?)。错误代码50000
是“通用”,所以没有用。
除了琐碎的“也许 h2 不适合事件处理程序”之外,我一直认为损坏可能是由 Kettle 和 Hibernate 之间的冲突引起的,或者换句话说任何人都不应该在他不知情的情况下从 Hibernate 处理的数据库中删除。
对于那些比我更有经验的 Hibernate 的人,我的问题是:
我的反对正确吗? 我是否应该重新设计我的解决方案以使用相同的宁静 Hibernate 来执行删除? 我应该为这样的系统使用 h2 辞职吗?感谢您的帮助!
编辑:
数据库由一个简单的 sh 脚本创建,该脚本运行以下命令,该命令基本上使用提供的 Shell 工具连接到默认创建的不存在的数据库。
$JAVA_HOME/bin/java -cp *thisIsAPath*/h2database/h2/main/h2-1.3.168-redhat-2.jar org.h2.tools.Shell -user $DB_USER -password $DB_PASSWORD -url jdbc:h2:$DB_FOLDER/Temp_SD_DS_EventAgent<<END
所以它的所有参数都设置为版本 1.3.168 的默认值。不幸的是,虽然我可以找到 current URL setting,但我找不到在哪里可以找到该版本的默认值和实验性。
我还发现了以下内容:
根据tutorialWhen using Hibernate, try to use the H2Dialect if possible.
我没有。
教程还说Please note MVCC is enabled in version 1.4.x by default, when using the MVStore
。这是否意味着在这种较旧的情况下默认禁用/不支持 cuncurrency,这就是问题所在?
数据库是使用 h2 版本 1.3.168 创建的,但消费者使用的是 1.4.197。这有什么大不了的吗?
【问题讨论】:
您为什么要使用 10 多年前发布的旧版 H2 数据库? 可悲的是服务器运行 java 7,我无法改变这个东西...... 2019 年的 H2 1.4.200 及所有早期版本也支持 Java 7,使用 1.2.131 有什么意义?几乎不可能有人记得完全过时版本的行为。 问题类似:我对服务器上安装的任何软件的版本没有控制/权限,所以有时我必须适应这些古老的技术...... 您不应该尝试在 1.4.197 中打开由 1.3.168 创建的数据库。您需要在 1.3.168 (SCRIPT TO 'filename.sql
) 中将其导出到 SQL,在 1.4.197 中创建一个新的空数据库并使用该脚本 (RUNSCRIPT FROM 'filename.sql'
) 中的数据填充它。
【参考方案1】:
我无法评论 h2 db 的可信度。 但从应用程序的角度来看,我认为你应该使用锁定机制 - 乐观或悲观锁。这将避免冲突情况。希望这个答案有助于指出正确的方向
Article on Optimistic and Pessimistic locking
【讨论】:
以上是关于从 Hibernate 处理的 h2 数据库的表中删除是不是会损坏表?的主要内容,如果未能解决你的问题,请参考以下文章