Sunday, March 15, 2015

Hibernate - Optimisasi query

Pada blog kali ini saya akan memberikan tips untuk meningkatkan performance Hibernate aplikasi.

Skenario :
Kita mempunyai tabel dengan Department(Master) dan Employee(Detail).
Pada aplikasi akan menampilkan semua data pada Master dan Detail. Jika aplikasi berjalan sangat lamban mungkin hal ini terjadi dikarenakan Hibernate mengeksekusi query yang tidak diharapkan. Hal ini terjadi dikarenakan relasi one to many atau one to one antar master dan detail. Pertama - tama kita lakukan konfigurasi hibernate.cfg.xml dengan menambahkan :

<property name="hibernate.show_sql" value="true" />

Jika di set true SQL statements akan ditampilkan di console.

Entity class Department :
 

package com.byteslounge.spring.tx.model;
import java.util.Set;
/**
 * Created by nostra on 1/14/15.
 */
import javax.persistence.*;

@Entity
public class Department
{
    @Id
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    @OneToMany(mappedBy = "eid",fetch = FetchType.EAGER)
    private Set<Employee> employeeCollection;
    private String name;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName( )
    {
        return name;
    }

    public void setName( String deptName )
    {
        this.name = deptName;
    }

    public Set getEmployeeCollection() {
        return employeeCollection;
    }

    public void setEmployeeCollection(Set employeeCollection) {
        this.employeeCollection = employeeCollection;
    }
}
Entity Class Employee:
 
package com.byteslounge.spring.tx.model;

import javax.persistence.*;

/**
 * Created by nostra on 1/14/15.
 */
@Entity
public class Employee
{
    @Id
    @GeneratedValue( strategy= GenerationType.AUTO )
    private int eid;
    private String ename;
    private double salary;
    private String deg;
    @ManyToOne
    private Department department;

    public Employee(int eid,
                    String ename, double salary, String deg)
    {
        super( );
        this.eid = eid;
        this.ename = ename;
        this.salary = salary;
        this.deg = deg;
    }

    public Employee( )
    {
        super();
    }

    public int getEid( )
    {
        return eid;
    }
    public void setEid(int eid)
    {
        this.eid = eid;
    }

    public String getEname( )
    {
        return ename;
    }
    public void setEname(String ename)
    {
        this.ename = ename;
    }

    public double getSalary( )
    {
        return salary;
    }
    public void setSalary(double salary)
    {
        this.salary = salary;
    }

    public String getDeg( )
    {
        return deg;
    }
    public void setDeg(String deg)
    {
        this.deg = deg;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}
Java Code :
 
      List <department> listDeprt= sess.createQuery("from department").list();
             for(Department dept : listDeprt){
            for(Employee emp : dept.getEmployeeCollection()){
                //do Something
            }
        }

Hibernate akan mengeksekusi 1+ N (jumlah row di Department) select statement. 1 Untuk mendapatkan data Department dan N untuk Employee. Jika ada 20 data pada tabel Master maka hibernate akan mengeksekusi 1+20 select statement.

Dan untuk solusi ini adalah:

Pertama dengan menggunakan @BatchSize
@OneToMany(mappedBy = "eid",fetch = FetchType.EAGER)
@BatchSize(size = 10) 
private Set<Employee> employeeCollection;
Jika terdapat 20 data pada tabel master maka select statement yang dihasilkan adalah 3 statement, Keterangan:

  • Select statement untuk mendapatkan semua data Department(Master).
  • Select statement untuk 10 data pertama.
  • Select statement untuk 10 data selanjutnya.

Kedua dengan menggunakan @Fetch(FetchMode.JOIN)
  @OneToMany(mappedBy = "eid")
  @Fetch(FetchMode.JOIN)
  private Set employeeCollection;
Maka hibernate akan mengeksekusi satu query (join column) .


Sekian blog dari saya, semoga bermanfaat :)

No comments:

Post a Comment