簡體   English   中英

Hibernate 性能調優技巧

[英]Hibernate performance tuning tips

我正在開發一個小應用程序,它由一個表組成。

我使用的技術是: NetBeans 8.1 Java 8 Hibernate 4.3.x Informix Primefaces 5

我不得不調查與 Informix Hibernate 連接的時間,但我得到了它,並且應用程序正確顯示了包含請求數據的列表。

問題出在Hibernate的性能上,性能很差,特別是考慮到表只有36000條記錄。

每頁更改大約需要 6 或 7 秒。

一直在研究Hibernate的官方文檔,但是找不到具體的例子來提高性能。

附上應用代碼:

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
   <property name="hibernate.dialect">org.hibernate.dialect.InformixDialect</property>
   <property name="hibernate.connection.driver_class">com.informix.jdbc.IfxDriver</property>
   <property name="hibernate.connection.url">jdbc:informix-sqli://127.0.0.1:1526/chicho:INFORMIXSERVER=ol_chicho</property>
   <!--<property name="hibernate.connection.datasource">jdbc/votacion</property>-->
   <property name="hibernate.connection.username">informix</property>
   <property name="hibernate.connection.password">informix</property>
   <property name="hibernate.connection.autocommit">true</property>
   <property name="hibernate.current_session_context_class">thread</property>
   <property name="hibernate.default_schema">informix</property>
   <property name="hibernate.show_sql">true</property>
   <property name="hibernate.hbm2ddl.auto">validate</property>
   <property name="hibernate.cache.use_second_level_cache">true</property>
   <mapping resource="pojos/Xxpuedenvotar1.hbm.xml"/>
 </session-factory>

波喬:

package pojos;
// Generated 23/08/2016 22:07:42 by Hibernate Tools 4.3.1



/**
 * Xxpuedenvotar1 generated by hbm2java
 */
public class Xxpuedenvotar1  implements java.io.Serializable {


 private Integer nroaccionista;
 private Short estado;
 private Integer idcliente;
 private String razonSocial;
 private Short idlocalidad;
 private Short zona;
 private String calle;
 private String puerta;
 private String localidad;

public Xxpuedenvotar1() {
}


public Xxpuedenvotar1(Integer nroaccionista) {
    this.nroaccionista = nroaccionista;
}
public Xxpuedenvotar1(Integer nroaccionista, Short estado, Integer idcliente, String razonSocial, Short idlocalidad, Short zona, String calle, String puerta, String localidad) {
   this.nroaccionista = nroaccionista;
   this.estado = estado;
   this.idcliente = idcliente;
   this.razonSocial = razonSocial;
   this.idlocalidad = idlocalidad;
   this.zona = zona;
   this.calle = calle;
   this.puerta = puerta;
   this.localidad = localidad;
}

public Integer getNroaccionista() {
    return this.nroaccionista;
}

public void setNroaccionista(Integer nroaccionista) {
    this.nroaccionista = nroaccionista;
}
public Short getEstado() {
    return this.estado;
}

public void setEstado(Short estado) {
    this.estado = estado;
}
public Integer getIdcliente() {
    return this.idcliente;
}

public void setIdcliente(Integer idcliente) {
    this.idcliente = idcliente;
}
public String getRazonSocial() {
    return this.razonSocial;
}

public void setRazonSocial(String razonSocial) {
    this.razonSocial = razonSocial;
}
public Short getIdlocalidad() {
    return this.idlocalidad;
}

public void setIdlocalidad(Short idlocalidad) {
    this.idlocalidad = idlocalidad;
}
public Short getZona() {
    return this.zona;
}

public void setZona(Short zona) {
    this.zona = zona;
}
public String getCalle() {
    return this.calle;
}

public void setCalle(String calle) {
    this.calle = calle;
}
public String getPuerta() {
    return this.puerta;
}

public void setPuerta(String puerta) {
    this.puerta = puerta;
}
public String getLocalidad() {
    return this.localidad;
}

public void setLocalidad(String localidad) {
    this.localidad = localidad;
}
}

道:

package Dao;

import Interfaces.InterfazSocios;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import pojos.Xxpuedenvotar1;

/**
 *
 * @author Gustavo
*/
public class DaoSocios implements InterfazSocios {

private List<Xxpuedenvotar1> listaSocios;

@Override
public List<Xxpuedenvotar1> verTodos(Session sesion) throws Exception {
    String hql = "FROM Xxpuedenvotar1 ORDER BY NroAccionista";
    //Query consulta = sesion.createQuery(hql).setCacheable(true);
    this.listaSocios = sesion.createCriteria(Xxpuedenvotar1.class).list();
    //this.listaSocios = consulta.list();
    return this.listaSocios;
}

}

我認為這些文件足以進行分析,因為該應用程序運行良好,但速度較慢。

預先感謝您的關注。

根據配置、修改配置屬性的可用性,可以嘗試其中的任何一個或所有這些。

  • hibernate.show_sql將其標記為 false,一旦您完成對查詢形成的分析。 這需要時間來記錄。
  • 您可以更改連接池大小配置,如果您使用的是
 <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property>

這有助於從池中快速獲得連接。 避免獲得連接的時間。

  • 如果您有大量數據,請使用@OrderBy標記 JPA 類中的相應列。

  • Hibernate 搜索提供@SortableField來注釋字段,這在內部索引並有助於檢索排序結果。

[編輯]

如果Integer nroaccionista是主鍵,則默認對其進行索引。 @Id標記JPA 類中的列,默認情況下用create index 生成的DDL 創建語句。 索引列有助於更好地搜索和排序結果。

希望這可以幫助。

首先,您可以做很多事情來加速 Hibernate。 查看這些高性能 Hibernate 技巧或此高性能 Hibernate 視頻演示

現在,回到你的問題。 您使用的DriverManagerConnectionProvider僅提供基本的連接池解決方案。 最好使用 HikariCP,因為它是最快的,而且它也可以通過hibernate-hikaricp Maven 依賴項使用。

與您的聲明相關:

問題出在Hibernate的性能上,性能很差,特別是考慮到表只有36000條記錄。

每頁更改大約需要 6 或 7 秒。

為什么要一次性獲取 36k 條記錄?

您不能將它們顯示到 UI 中? 這就是我們畢竟有數據分頁的原因。

即使對於批處理器,最好將整個工作負載拆分為多個較小的數據集,這樣可以避免長時間運行的事務,甚至在多個工作線程之間拆分負載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM