【问题标题】: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,但我找不到在哪里可以找到该版本的默认值和实验性。

我还发现了以下内容:

  • 根据tutorial When 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') 中的数据填充它。

标签: java hibernate h2 sql-delete kettle


【解决方案1】:

我无法评论 h2 db 的可信度。 但从应用程序的角度来看,我认为你应该使用锁定机制 - 乐观或悲观锁。这将避免冲突情况。希望这个答案有助于指出正确的方向

Article on Optimistic and Pessimistic locking

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多