创建JPA本机查询很慢 数据库:MySQL 5.1 JPA实现:EclipseLink 容器:玻璃鱼4 Java:jdk7u55
我使用本机查询从订单表中获取结果。每个订单都有一个日期,我只想按年份和日期进行选择。整个方法有这个主体创建JPA本机查询很慢 数据库:MySQL 5.1 JPA实现:EclipseLink 容器:玻璃鱼4 Java:jdk7u55,java,performance,jakarta-ee,jpa,eclipselink,Java,Performance,Jakarta Ee,Jpa,Eclipselink,我使用本机查询从订单表中获取结果。每个订单都有一个日期,我只想按年份和日期进行选择。整个方法有这个主体 Query query = entityManager.createNativeQuery("SELECT COUNT(PLACED_ORDER.ID) as POCET_OBJEDNAVEK FROM PLACED_ORDER WHERE ORDERDATE IS NOT NULL AND EXTRACT(YEAR FROM ORDERDATE) = ?1 AND extract(D
Query query = entityManager.createNativeQuery("SELECT COUNT(PLACED_ORDER.ID) as POCET_OBJEDNAVEK FROM PLACED_ORDER WHERE ORDERDATE IS NOT NULL AND EXTRACT(YEAR FROM ORDERDATE) = ?1 AND extract(DAY FROM ORDERDATE) = ?2");
query.setParameter(1, year);
query.setParameter(2, day);
return (Long) query.getSingleResult();
此查询工作正常,但执行速度非常慢。所谓慢,我指的是每次方法调用一秒钟或更长时间。事务管理设置为“必须”
命名查询在从请求到响应的几毫秒内执行。单独调用此方法非常慢。有什么可以做的吗
编辑-对评论的反应:
当我从命令行或通过MySQL WorkBench查询数据库时,在重载情况下,性能正常(最大为一毫秒或几毫秒)
我还应该知道,项目中的二级缓存已禁用,对此我无能为力
MySQL解释看起来是这样的,我没有简单的方法在EclipseLink上启用解释
用于确定数据类型和DB约束的实体注释
@Entity(name = "PLACED_ORDER")
public class Order implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne
@JoinColumn(name = "CUSTOMER_ID")
private Customer customer;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REMOVE, CascadeType.PERSIST}, orphanRemoval = true)
@JoinColumn(name = "PLACED_ORDER_ID")
private List<OrderItem> items;
@Temporal(TemporalType.TIMESTAMP)
private Date orderDate;
@Enumerated(EnumType.STRING)
@NotNull
private OrderState orderState = OrderState.SEMIFINISHED;
@OneToOne
private Transportation transportation;
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval = true)
private Address deliveryAddress;
@Enumerated(EnumType.STRING)
private TransportationType transportationType;
在问题中指定的技术和禁用二级缓存的情况下,解决方案是将本机查询编写为@namednaviquery,而不是每次调用方法时都创建它。这样,性能显著提高。当您使用DBMS执行查询时,您具有相同的性能?显示此表的DDL,我对列类型感兴趣。查询的执行计划pleaseEclipseLink不支持本地查询或具有复杂结果集(如返回数据或多个对象)的查询的缓存使用。-因此,我没有办法做到这一点。返回字段的本机SQL不会命中实体缓存,但查询结果本身可以缓存:您还可以在数据源/驱动程序级别对本机SQL和语句缓存使用命名查询,以限制对语句的重判。有关更多性能和监视选项,请参阅。