- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序需要选择可能非常大量的行(数十万到数百万)。
当我直接针对数据库 (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/
我正在使用以下 JPA 查询,并且收到 java.lang.IllegalArgumentException:无法为具有多个返回异常的查询创建 TypedQuery。 TypedQuery uQuer
我正在使用以下 JPA 查询,并且收到 java.lang.IllegalArgumentException:无法为具有多个返回异常的查询创建 TypedQuery。 TypedQuery uQuer
我收到错误“无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery”我尝试返回所有列值。那时应用程序挂起。我需要获取数组列表中的客户端列表。请帮忙,我是 JPA 新手。 @Overrid
我正在使用 Mockito 来模拟 Java 持久性查询的结果集: 被 mock 的代码: public void queryMethod(String name){ List result =
在 JPA 中,查询类型返回泛型类型对象,需要将其转换为指定的数据类型。我最近看到了另一个 Query 实例,它是 TypedQuery。 TypedQuery 确保 query.getSingleR
我收到错误“无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery” 对于在 Glassfish 上使用 JPA 的以下查询,您知道这里出了什么问题吗?我想获取最新的某个扣款状态的扣款记
我一直在尝试使用 TypedQuery 和 Criteria Builder 构建下面的 SQL: select a.id, a.numeroAvisoPagament
一直在使用 Spring MVC 和 JPA 编写一些代码,我偶然发现了这个问题。 在尝试输出我的一个类(class)(本例中为 Student)时,我在 TypedQuery 代码行处遇到 Null
我有一个应用程序需要选择可能非常大量的行(数十万到数百万)。 当我直接针对数据库 (Oracle) 运行查询时,它会在大约 9-10 秒内返回并选择 4M 行。 当我执行与 TypedQuery 相同
我在使用 TypedQuery 接口(interface)、NamedQuery 和多对多关系创建查询时遇到问题。这是我的报告实体: @Entity @Table(name = "REPORT") @
我正在尝试学习如何在 JPQL 中使用隐式联接。我正在使用的一个示例似乎表明可以将外键引用为路径,然后可以访问外键引用的表中的属性。 用户和报表之间是 1:M 的强制关系。userId 是引用 Use
我有一个javax.persistence.TypedQuery我想直播。这是我的尝试: public static Stream stream(TypedQuery query, int batc
下面是对问题的更多、可能更好的描述: 我做了一个简单的选择查询。返回列表包含确切数量的记录/对象,就好像我在数据库中执行相同的查询一样,但问题是所有对象都相同/相同。 例如,这是数据库中的结果(我删除
是否可以将此查询编写为 TypedQuery,并让两个 Long 运行到一个内部有两个公共(public) Long 字段的对象中。 Query q = em.createQuery(
来自 Entity Framework 背景,我可以将我的 ORM 结果转换为包含完整后端模型数据子集的类。 我有一个 JAX-RS REST 服务,我通常会在其中返回类似的内容 MyEntity r
我想在 javax.persistence.TypedQuery 上设置超时。 我发现了这个简单的方法: TypedQuery query = ... ; query.setHint("javax.p
我希望在 FIQL 支持下实现分页。我在 JPA(Hibernate) 中使用 apache cxf。这是为其提供的示例 http://cxf.apache.org/docs/jax-rs-searc
当我尝试执行通用类型的 TypedQuery 时,我收到来自 Eclipse 的未经检查的类型转换警告。 我在这里使用通用的,因为在数据集中,由于查询和编辑的时间限制,每年都必须分成不同的表。表中有
假设有一个简单的 JPA 实体类,如下所示: @Entity(name="TASK") public class Task implements Serializable { /* gette
我需要知道正在数据库上执行什么查询,以便我可以检查是否可以改进它。 以下代码用于创建查询: TypedQuery orderItemTypedQuery = typedQuery.setParamet
我是一名优秀的程序员,十分优秀!