【问题标题】:OpenJPA dirty read hintOpenJPA 脏读提示
【发布时间】:2011-06-01 10:36:38
【问题描述】:

我们有以下 DAO 堆栈:

  • DB2 9.7 Express-C
  • OpenJPA 2.0.1
  • 春季 3.0.5
  • Bitronix 2.1.1

如何指定 OpenJPA 在查询末尾添加WITH UR sql 子句?

我已经浏览了好几天的网站和手册,应该是这样的:

Query q = em.createQuery("select m from Magazine m where ... ");
q.setHint("openjpa.FetchPlan.ReadLockMode","WRITE");
List r = q.getResultList();

但是,唉,我一直无法找到一个可以作为 setHint() 参数传递并产生 WITH UR 的有效 OpenJPA 属性,所以我使用了 SpringJDBC 查询,很遗憾我不能再使用了。

有什么想法吗?非常感谢

【问题讨论】:

    标签: java db2 openjpa


    【解决方案1】:

    OpenJPA 不支持在 JPQL 中使用 WITH UR 子句。您始终可以使用 native query 来实现此功能。

    【讨论】:

    • 感谢您的回答 - 您是否有任何链接可以解释或记录这一点?
    • Mada,你是在告诉我 OpenJPA 支持 WITH UR 语法吗?请赐教。
    【解决方案2】:

    我现在遇到了非常相似的问题 - 似乎设置:

    query.setHint("openjpa.FetchPlan.Isolation", "READ_UNCOMMITTED");
    

    会成功的。不幸的是,源代码显示来自org.apache.openjpa.jdbc.sql.DB2Dictionary 的常量withURClause 永远不会被读取。

    此外,如果查询不是 FOR UPDATE,OpenJPA 从不 会考虑获取计划提示。我有一个 select 语句,它在排他锁上被阻塞,它真的可以处理未提交的数据——OpenJPA 不行。

    【讨论】:

    • 请不要猜测。如果您查看 org.apache.openjpa.jdbc.sql.DB2Dictionary.withURClause,您会注意到 OpenJPA 运行时代码的其余部分没有引用该字段。虽然您可能认为设置 FetchPlan.Isolation 级别可以解决问题,但它不会。
    • @Rick 你完全正确。现在我仔细观察了,这真的很明显。抱歉,我已经撤消了反对票并改进了答案。
    • @Quantum 请考虑删除对此的反对意见,因为答案已得到纠正。 SO 是关于改进,而不是报复。
    • @MaDa 据我所知,我没有否决你的答案,我也看不出我为什么会这样。你试图纠正一个你认为错误的答案(虽然,诚然,你本可以更加机智和谨慎地这样做),你已经被证明是错误的并且已经纠正了自己。最后,这里的每个人都获得了宝贵的知识,这就是这个地方的意义所在。因此,我为您的努力 +1,不过(作为一个友好的建议)请尝试在未来更加注意您的答案,尤其是如果您不是 100% 确定的话。
    • @Quantum 最近我一直在分析相同的 OpenJPA 源代码,寻找解决令人讨厌的死锁的方法,我最初对我的发现感到非常兴奋,因此草草回答。瑞克的反驳表明没有什么好激动的,我的分析太肤浅了。谢谢,你的观点很好。
    猜你喜欢
    • 2019-07-06
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2017-12-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多