【问题标题】:creating 155000 entities off of a openJPA query从 openJPA 查询创建 155000 个实体
【发布时间】:2012-09-30 22:09:10
【问题描述】:

我有一个查询,在最坏的情况下会创建超过 15 万个实体。可能有 300,000k 个实体的上限。我尝试了几种方法将这组数据返回给用户......我只使用 sql Developer 运行查询,它运行时间约为 0.348 秒。所以这不是任何类型的瓶颈。

我像这样创建一个嵌套查询...

List<Object[]> ObjList = (List<Object[]>) emf.createNativeQuery(assembleNestedQuery(query2)).getResultList();

本机查询是这样组装的......

String query2 = assembleQuery(organizationIDs, 2);

else if (type == 4){ 
    queryBuilder.append("SELECT t0.RESOURCE_ID, t0.FIRST_NAME,  t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0");
    if(typeArgs.length > 0){ 
        queryBuilder.append("  WHERE t0.RESOURCE_ID IN (");             
        for(int i = 0 ; i <= typeArgs.length - 1; i++){
        if(i != typeArgs.length -1)
            queryBuilder.append(typeArgs[i] +", ");
        else
            queryBuilder.append(typeArgs[i] +" ");
        if((i % 1000 == 0) && (i != 0)){
            queryBuilder.append(") OR IN (");
        }
    }
    queryBuilder.append(")");               
            }
    }

private String assembleNestedQuery(String typeArgs2){
        StringBuilder queryBuilder = new StringBuilder();
        queryBuilder.append("SELECT t0.RESOURCE_ID, t0.FIRST_NAME,  t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0");
        queryBuilder.append("  WHERE t0.RESOURCE_ID IN (");
        queryBuilder.append(typeArgs2);
        queryBuilder.append(")");
        return queryBuilder.toString();
    }

上面的代码基本上组装了这个查询......

SELECT t0.RESOURCE_ID, t0.FIRST_NAME,  t0.MIDDLE_NAME, t0.LAST_NAME FROM EPCD13.Provider t0  WHERE t0.RESOURCE_ID IN (SELECT DISTINCT d.RESOURCE_ID FROM EPCD13.RESOURCES d WHERE d.ORGANIZATION_ID in (...))

所以嵌套查询基本上是动态创建的... 我运行的查询返回了大约 155K 条记录。现在我基本上运行下面的代码将结果转换为 Provider 对象...

List<Provider> provList = new ArrayList<Provider>(); 
for(Object[] obj: ObjList)
{
    provList.add(this.GetProviderFromObj(obj));
}

这就是发生异常的地方。 JPA 处理的数据集是否太大?我可以很简单地使用一些简单的 Java JDBC 连接和一些基本的 Java 对象来做到这一点。但是,这组数据太大了吗?

谢谢。

更新:我遇到的异常

java.lang.OutOfMemoryError: caused by: java.lang.OutOfMemoryError

【问题讨论】:

  • 也许你应该包括你遇到的异常......?

标签: openjpa large-data-volumes


【解决方案1】:

听起来您是在尝试使用对于您的 JVM 来说太大的数据集。您可以将较少数量的对象拉入内存,也可以增加最大堆。

我还建议查看Large Result Sets

【讨论】:

  • 我为解决这个问题所做的是增加我的 jvm 中的起始堆大小和最大堆大小。这似乎解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2014-10-12
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多