性能OpenJPA查询(3000+记录)很慢

Rob*_*Jan 6 java websphere openjpa

我正在使用带有buildin 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;
      }
    }
Run Code Online (Sandbox Code Playgroud)

以下代码检索合同:

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

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

return contracts;
Run Code Online (Sandbox Code Playgroud)

检索到的合同将传递给Web服务.

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

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

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

Kur*_*glu 3

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

我建议您浏览一下 OpenJPA 文档,了解如何处理大型结果集