Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建JPA本机查询很慢 数据库:MySQL 5.1 JPA实现:EclipseLink 容器:玻璃鱼4 Java:jdk7u55_Java_Performance_Jakarta Ee_Jpa_Eclipselink - Fatal编程技术网

创建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和语句缓存使用命名查询,以限制对语句的重判。有关更多性能和监视选项,请参阅。