Hibernate性能调优技巧



我正在开发一个小应用程序,它由一个表组成。

我正在使用的技术是:NetBeans 8.1Java 8Hibernate 4.3.xInformixPrimefaces 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>

Pojo:

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;
}
}
DAO:

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。查看这些高性能Hibernate技巧,或者这个高性能Hibernate视频演示。

现在,回到你的问题。您正在使用的DriverManagerConnectionProvider仅提供基本的连接池解决方案。最好使用HikariCP,因为它是最快的,它也可以通过hibernate-hikaricp Maven依赖项获得。

与你的陈述相关:

问题出现在Hibernate的性能上,它非常可怜,尤其是考虑到这张表只有36000张记录。

每一页大约需要6到7秒。

为什么要一次获取36k条记录?

你不能在UI中显示它们?这就是为什么我们有数据分页。

即使对于批处理处理器,您最好将整个工作负载拆分为多个较小的数据集,这样可以避免长时间运行的事务,甚至可以将负载拆分为多个工作线程。

可以根据配置、修改配置属性的可用性尝试其中的任何一种或所有这些。

  • hibernate.show_sql将此标记为false,一旦您完成了对查询形成的分析。
  • 您可以更改连接池大小配置,如果您正在使用一个
  <property name="hibernate.c3p0.min_size">5</property>
  <property name="hibernate.c3p0.max_size">20</property>

这有助于从池中快速获得连接。避免了获得连接的时间。

  • 如果您有大量的数据,请用@OrderBy标记JPA类中相应的列。

  • Hibernate search提供@SortableField来注释字段,这在内部索引并帮助检索排序的结果。

[编辑]

如果Integer nroaccionista是主键,默认索引。用@Id标记JPA类中的列,默认情况下用创建索引生成DDL创建语句。索引列有助于更好地搜索和排序结果。

最新更新