【发布时间】:2019-05-29 08:51:41
【问题描述】:
我有一个在 Windows 服务器上运行的 java 应用程序。此应用程序通过 Hibernate 查询 Oracle 10 数据库。我有一个查询返回 215 个实体的集合,每个实体有 6 个字符串字段。大约需要 20 秒才能恢复(从休眠状态获取的数据)
我取回了hibernate生成的sql并通过SQLPlus运行,运行时间在300-500ms之间。
我使用 ojdbc 驱动程序(与我的应用程序使用的相同)启动了 H2 控制台并连接到我的数据库(从与我的应用程序运行的同一台计算机以避免网络问题),运行了我从 Hibernate 获得的 sql 几次,我得到了与 SQLPlus 相同的 300-500 毫秒运行时间,所以我猜我的问题来自 Hibernate,但我不知道该去哪里找了。
数据库在另一台服务器上,但我得到了
我的配置:
javax.persistence.jdbc.driver=oracle.jdbc.driver.OracleDriver
javax.persistence.jdbc.url=jdbc:oracle:thin:@xxxxx
javax.persistence.jdbc.user=xxxxx
javax.persistence.jdbc.password=xxxxx
hibernate.ejb.naming_strategy=org.nuiton.jpa.hibernate.OracleCompliantImprovedNamingStrategy
hibernate.dialect=xxxx.MyDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.use_sql_comments=false
hibernate.format_sql=true
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.c3p0.min_size=3
hibernate.c3p0.max_size=5
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.generate_statistics = false
方言:
public class MyDialect extends Oracle10gDialect {
public MyDialect() {
super();
registerColumnType(Types.DOUBLE, "number");
}
}
我的实体看起来像(带有 getter 和 setter):
public abstract class AbstractJpaRequestedArticle extends AbstractJpaEntity implements Serializable {
private static final long serialVersionUID = 7293079560062973232L;
public static final String PROPERTY_ID = "id";
public static final String PROPERTY_QUANTITY = "quantity";
public static final String PROPERTY_PRIORITY = "priority";
public static final String PROPERTY_ARTICLE = "article";
public static final String PROPERTY_REQUESTED_LIST = "requestedList";
public static final String PROPERTY_DESTINATION_LOCATION = "destinationLocation";
@Id
protected String id;
protected double quantity;
protected String priority;
@ManyToOne
protected Article article;
@OneToOne
protected RequestedList requestedList;
@ManyToOne
protected Location destinationLocation;
@PrePersist
public void prePersist() {
if (this.id == null) {
this.id = new JpaEntityIdFactoryResolver().newId(this);
}
}
@Override
public String getId() {
return id;
}
AbstractJpaEntity 只定义了equals、hashcode和默认toString
【问题讨论】:
-
可能是一些错误的映射或错误的配置(我认为是这样)。将有助于您的休眠配置
-
您可以尝试使用 Log4j 设置休眠的日志记录配置吗?这将更好地了解幕后发生的事情。此外,第一个查询可能比后续查询花费更多时间
-
有意思,能分享一下hibernate的配置吗?
-
用休眠配置编辑了问题
-
尝试将
hibernate.jdbc.fetch_size设置为 100-500 以查看它是否有所改善。据我了解,如果查询在 oracle 中运行良好,唯一的问题可能是获取结果。参考makejavafaster.blogspot.com/2015/06/…