gpt4 book ai didi

Java TypedQuery 比直接查询 DB 慢得多

转载 作者:行者123 更新时间:2023-12-02 10:47:03 24 4
gpt4 key购买 nike

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

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

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

我尝试过分页、 hibernate 可滚动结果、将查询设置为只读、禁用缓存,甚至尝试过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
}
}

我是否缺少/可以使用一些选项或技术来做得更好?

最佳答案

因为在 Java 中,您尝试在 Oracle 工作室中获取所有 400 万条记录,因此工作室添加了限制作为预防措施(我假设只有 50 行左右?或者可能像 mysql 工作台中那样 1000 行?)。如果您认为通过排序可以在 9 秒内获取 400 万行,那么我不会相信它。

无论如何,无论出于何种原因,将 4M 数据提取到应用程序中都是相当糟糕的主意。您应该尝试将“分析”移至数据库,或重新考虑处理,以便一次仅使用所有结果的一部分。这就是分页的用途。如果您确实想要获取所有行,那么每次需要时您都必须等待 5 分钟。

关于Java TypedQuery 比直接查询 DB 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52469685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com