【问题标题】:Not allow DML operations during Packages exec在 Packages exec 期间不允许 DML 操作
【发布时间】:2015-04-30 09:40:33
【问题描述】:

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

所以,首先,我会解释一下这个想法。

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

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

3 - 我的 java 应用只在导出表中插入信息。

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

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

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

我有两种方法:

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

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

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

对我正在尝试做的事情有任何疑问。

【问题讨论】:

    标签: java oracle jdbc plsql


    【解决方案1】:

    不要尝试锁定表作为解决方案。可悲的是,这很常见,但很少必要。只是一些想法:

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

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

    【讨论】:

    • 我会探讨您的建议。谢谢;)
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2012-01-03
    • 2021-02-10
    相关资源
    最近更新 更多