我正在开发一个小型应用程序,它由一个表组成。
我使用的技术是: 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>
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;
}
}
我认为使用这些文件足以进行分析,因为应用程序运行良好,但速度很慢。
提前感谢您的关注。
答案 0 :(得分:0)
可以尝试这些或所有这些中的任何一个,具体取决于配置,修改配置属性的可用性。
hibernate.show_sql
将此标记为false。这需要时间来记录。<property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property>
这有助于从池中快速获得连接。避免时间来获得连接。
如果您有大量数据,请在JPA课程中使用@OrderBy
标记相应列。
Hibernate搜索提供@SortableField
来注释该字段,这在内部编制索引并帮助检索已排序的结果。
[编辑]
如果Integer nroaccionista
是主键,则默认为其编制索引。使用@Id
标记JPA类中的列,并使用默认创建索引生成的DDL创建语句。索引列有助于更好地搜索和排序结果。
希望这有帮助。
答案 1 :(得分:0)
首先,你可以做很多事情来加速Hibernate。查看这些High-Performance Hibernate Tips或此High-Performance Hibernate video presentation。
现在,回到你的问题。您正在使用仅提供基本连接池解决方案的DriverManagerConnectionProvider
。更好地使用HikariCP,因为它是最快的,它也可以在Hibernate 4.3中使用。
与您的陈述相关:
问题出现在Hibernate的性能上,非常好 很差,特别是考虑到表中只包含36000个 记录。
每页更改大约需要6或7秒。
为什么要在一次拍摄中获取36k记录?
您无法将其显示在UI中?这就是我们毕竟分页的原因。
即使对于批处理器,最好将整个工作负载分成多个较小的数据集,这些数据集允许您保持较小的数据库事务,甚至可以在多个工作线程之间分配负载。