首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java TypedQuery比直接查询数据库慢得多

Java TypedQuery比直接查询数据库慢得多
EN

Stack Overflow用户
提问于 2018-09-24 03:46:51
回答 1查看 271关注 0票数 0

我有一个应用程序,它需要选择可能非常大的行数(几十万到几百万)。

当我直接对我的数据库(Oracle)运行查询时,它在大约9-10秒内返回并选择了4M行。

当我执行与TypedQuery相同的SQL时,它在5分钟后超时。

我尝试过分页,hibernate scrollableresults,将查询设置为只读,禁用缓存,甚至尝试过nativeQuery,但似乎都没有帮助。

示例代码如下:

StringBuffer sql = new StringBuffer();
sql.append("SELECT t from TestResult t WHERE t.endDatetime >= ");
sql.append(getDateSelector(timestampStart));
sql.append(" AND t.endDatetime <= ");
sql.append(getDateSelector(timestampEnd));
sql.append(" ORDER BY t.nodeId, t.endDatetime DESC");

TypedQuery<TestResult> query = entityManager.createQuery(sql.toString(), TestResult.class);

testResults = query.getResultList();

分页示例:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public List<TestResult> iterateAllTestResults(String startDateTime, String endDateTime)
{
    int offset = 0;
    List<TestResult> allTestResults = new ArrayList<>();

    List<TestResult> testResults;
    while ((testResults = this.getAllTestResultsIterableHelper(offset, 100, startDateTime, endDateTime)).size() > 0)
    {
        allTestResults.addAll(testResults);
        offset += testResults.size();
    }

    return allTestResults;
}

private List<TestResult> getAllTestResultsIterableHelper(int offset, int max, String startDateTime, String endDateTime)
{

    try
    {
        Timestamp timestampStart = DateTimeFormatter.convertFormattedDateToTimestamp(startDateTime);
        Timestamp timestampEnd = DateTimeFormatter.convertFormattedDateToTimestamp(endDateTime);

        StringBuffer sql = new StringBuffer();
        sql.append("SELECT t from TestResult t WHERE t.endDatetime >= ");
        sql.append(getDateSelector(timestampStart));
        sql.append(" AND t.endDatetime <= ");
        sql.append(getDateSelector(timestampEnd));
        sql.append(" ORDER BY t.nodeId, t.endDatetime DESC");

        List<TestResult> results = entityManager.().createQuery(sql.toString(), TestResult.class).setFirstResult(offset).setMaxResults(max).getResultList();

        return results;
    }
    catch (Exception e)
    {
        // omitted
    }
}

有没有什么我缺少的或者可以用来做得更好的选择或技术?

EN

回答 1

Stack Overflow用户

发布于 2018-09-24 04:29:44

这是因为在Java中,您试图获取全部400万条记录,而在Oracle studio中,作为预防措施,您已经按studio添加了限制(我假设只有50行左右?或者像mysql工作台中的1000个?)。如果你认为在排序的情况下,你可以在9秒内获取4m行,那么我不会买它的账。

无论如何,无论出于什么原因,获取4M到应用程序中都是相当糟糕的ide。你应该尝试将你的“分析”转移到数据库中,或者重新思考处理过程,这样你一次只能使用所有结果中的某一部分。这就是使用分页的目的。如果你真的想要得到所有的行,那么每次你需要它的时候,你就必须等待5分钟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52469685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档