6

我正在使用带有内置 OpenJPA 1.2.3 和 Oracle 数据库的 Websphere Application Server 7。我有以下实体:

    @NamedNativeQuery(name=Contract.GIVE_ALL_CONTRACTS, 
        query="SELECT number, name \n" +
          "FROM contracts \n" +
          "WHERE startdate <= ?1 \n" +
          "AND enddate > ?1",
          resultSetMapping = Contract.GIVE_ALL_CONTRACTS_MAPPING)
    @SqlResultSetMapping(name = Contract.GIVE_ALL_CONTRACTS_MAPPING, 
        entities = { @EntityResult(entityClass = Contract.class, fields = {
          @FieldResult(name = "number", column = "number"),
          @FieldResult(name = "name", column = "name")
        })
    })
    @Entity
    public class Contract {
      public static final String GIVE_ALL_CONTRACTS = "Contract.giveAllContracts";
      public static final String GIVE_ALL_CONTRACTS_MAPPING = "Contract.giveAllContractsMapping";

      @Id
      private Integer number;
      private String name;

      public Integer getNumber() {
        return number;
      }
      public String getName() {
        return name;
      }
    }

以下代码用于检索合同:

Query query = entityManager.createNamedQuery(Contract.GIVE_ALL_CONTRACTS);
query.setParameter(1, referenceDate);

List contracts = query.getResultList();
entityManager.clear();

return contracts;

检索到的合同被传递给 Web 服务。

对于 3608 条记录,在 Oracle 开发人员中执行此查询大约需要 0.35 秒。对 query.getResultList() 的调用大约需要 4 秒。

使用实体构造函数中的记录器,它记录大约有 10-20 个使用相同时间戳创建的实体。然后 0,015 秒它做了别的事情。我猜是 OpenJPA 的东西。

有没有办法加快 OpenJPA?或者是唯一的解决方案缓存?

4

2 回答 2

3

对象创建可能在性能损失中占有相当大的份额。在服务器中运行代码时,您不仅要查询数据库,还要分配内存并为每一行创建一个新的 Contract 对象。扩展堆或垃圾回收周期可能会计入您观察到的空闲期。

我建议您浏览一下有关如何处理大型结果集的 OpenJPA 文档。

于 2012-09-27T08:57:06.760 回答
0

我建议你下载 VisualVM 并为所涉及的包设置一个分析。VisualVM 可以显示在不同方法中花费的时间,理论上在您的情况下总计为 0.35 秒。您将能够分析代码、OpenJPA 和网络 IO 之间的总时间分布。这将帮助您识别瓶颈。

于 2012-09-27T10:12:50.367 回答