【问题标题】:OpenJPA: how is concurrency controlled when result of a stored procedure is mapped to an object?OpenJPA:存储过程的结果映射到对象时如何控制并发?
【发布时间】:2012-08-02 19:15:46
【问题描述】:

我刚刚开始研究 OpenJPA,试图了解它是否能满足我的需求。 我已经阅读了一些关于 OpenJPA 并发控制的内容,并且知道如何创建命名存储过程 (@NamedStoredProcedureQuery) 并将其结果集映射到 POJO 实例列表。但是,我不明白这个组合,也找不到任何具体的文档......

如果我不通过 JPA 进行 SELECT/UPDATE/DELETE/INSERT 操作,而只是使用它将存储过程的结果映射到我的 POJO,它仍然能够处理并发吗?

问题是,我将使用存储过程来选择对象,然后当我更改它们时,我使用不同的存储过程来更新这些对象。 它如何知道另一个存储过程是否在我这样做之前更新了同一个表? 它是否跟踪我的 POJO 对象的状态(假设它由@Entity 标记)? 它是否在调用任何映射到该表的存储过程之前查询该表(假设我告诉 JPA 该对象可以映射到哪个表)?

谢谢!

【问题讨论】:

    标签: stored-procedures concurrency openjpa


    【解决方案1】:

    我没有使用过 OpenJPA,但是分析这个的方法很少。

    第一种方法是在 OpenJPA 中查找 Hibernate 的类似 showsql 的配置。

    接下来您可以尝试查找任何查询日志。 MySQL 提供查询日志。

    像 Hibernate 这样的 JPA 提供程序通常会生成一对一的查询。 IE。对于更新,它不会先 SELECT 到表中。 JPA 还定义了 JPA 提供者实现的锁定机制。

    https://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and

    这与隔离级别相结合可以帮助您调整行为。

    此外,您可以使用检查和更新。以下查询的效果。

    UPDATE some_table SET column_a = 456 where column_a = 123 and id = 1
    

    最后,反对使用存储过程的建议。 JPA 的实用程序是独立于供应商的,这通过使用存储过程来减少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      相关资源
      最近更新 更多