java - 在 Packages exec 期间不允许进行 DML 操作

标签 java oracle jdbc plsql

我在这里需要一点帮助,因为我正在努力寻找解决我的问题的最佳解决方案。我用谷歌搜索并没有任何有启发性的答案。

首先,我将解释一下这个想法。

1 - 我有一个 java 应用程序,它使用 jdbc 在我的数据库 (Oracle DB) 中插入数据。

2 - 我的数据库在逻辑上分为两部分。一部分包含带有导出信息(从另一个应用程序)的表格,另一部分包含表示一些报告的表格。

3 - 我的 Java 应用程序仅在导出表中插入信息。

4 - 我开发了一些软件包,可以将数据从导出表转换为报告表(生成一些报告)。

5 - 该包计划每天执行 2、3 次

所以,我的问题是,当转换任务开始时,我想阻止新的 DML 操作。然后,当转换停止时,应在该时间内插入/更新的所有新数据应再次插入导出表中。

我采取了两种方法:

1 - 在转换期间将 DML 操作偏离到临时表

2 - 锁定表,但我没有太多使用它的经验。我的主要问题是,我可以强制 jdbc 中的 DML 操作等待锁定完成吗?还没有尝试过,但是在这里和那里阅读了一些在抛出 lockwaittimeout 异常或类似的东西之后。

有经验的人可以给我一些建议吗?

对我正在尝试做的事情有任何疑问,请尽管询问。

最佳答案

不要尝试将锁定表作为解决方案。遗憾的是,这种情况很常见,但很少有必要。只是一些想法:

  • 在转换开始时,从导出表中选择 * 数据到 global_temp table 。然后在该临时表上执行转换包
  • 创建 materialized view就像从导出表中选择*数据一样。研究提交时刷新的选项,但似乎您需要在转换之前刷新表
  • 分析您导出的数据。如果像许多其他情况一样,大多数数据一旦导入就永远不会改变。只需要分析新数据。为了帮助处理,在表上添加一个名为 date_last_modified 的时间戳字段和一个触发器。当更新一行时,更新 date_last_modified。这使您可以选择“仅更改的记录”的最小数据集
  • 您还应该使用 bulk collect 进行调查优化您的光标。这将允许您一次获得一组记录,类似于某个时间点的数据快照
  • 我相信你想多了。如果您一次获取一组记录,那么 Oracle 将获取截至任何用户最后一次提交时记录的状态。如果您批量收集一组记录,它们将进入内存并再次代表某个时间点的状态。

对此感到更舒服的最佳方法是设置一个测试用例。设置光标 sleeps在每个处理周期中。打开另一个 session 并更改正在处理的数据。看看会发生什么......

关于java - 在 Packages exec 期间不允许进行 DML 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769103/

相关文章:

java - 将 MySQL 数据库拆分为单独的数据库

Java RMI 客户端访问被拒绝

Oracle:使用 select 插入不返回批量收集新插入的 ID

oracle - oracle 11gr1 中 xmltype 列的最大大小?

oracle - 为什么 Oracle 反向键索引不会导致缓慢的随机写入?

java - 使用 getGenerateKeys() Java

java - 在 android 上的 sqlite 中根据 id 更新多行?

java - 如何正确设置 gradle 命令输出编码?

java - 如何从结果集中获取单行

java - 如何在没有 JNDI 的情况下使用 DataSource 检索数据库连接?