Posts Tagged ‘pool’

Database Connection Pool [part-3]

Friday, January 16th, 2009

Melanjutkan postingan saya sebelumnya tentang Database Connection Pool di sono dan di sini, dan sebagai part terakhir dari trilogy Database Connection Pool *halah, kaya film aja* maka kali ini saya akan paparkan mengenai pembuatan java class yang mampu menangani Database Connection Pool seperti yang dilakukan oleh Application Server atau Web Container.

Untuk bisa malakukan Database Connection Pooling, kita butuh JDBC Wrapper Classes. Wrapper classes ini terdiri dari 3 buah class yang memiliki fungsi sendiri-sendiri. Tiga class tersebut adalah:

  1. Connection Driver Class. Class ini mengimplementasikan java.sql.driver yang menyediakan method untuk me-load driver dan membuat koneksi database.
  2. Connection Pool Class. Class ini menghandle manajemen Pool koneksi. Ketika method getConnection dipanggil, maka Class ini akan mencari Koneksi yang tersedia dalam Pool, jika tidak ada maka akan dibuatkan koneksi baru dan dimasukkan dalam pool. Dalam Class ini juga ada Connection Reaper yang berfungsi untuk melakukan penghapusan koneksi yang sudah tidak terpakai.
  3. Connection Class. Class ini menimplementasikan java.sql.Connection yang merepresentasikan JDBC Connection dalam Connection Pool ini. Class ini memberikan state pada koneksi yang ada, apakah sedang digunakan atau tidak.

Cara penggunaan dari tiga buah class di atas sangat mudah, kita tinggal buat satu Class untuk handle buka koneksi seperti dibawah ini:

package modules;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
* @author satria.permana
*
*/
public class PgInt {
    String foo  = "Not Connected";
    String spbCode = "Not Connected";
    String spbDescription = "Not Connected";
    Connection connection = null;

    public PgInt() {
        try {
            new pool.JDCConnectionDriver(
                "org.postgresql.Driver",
                "jdbc:postgresql://localhost:5432/dbname",
                "dbuser",
                "dbpassword");
        } catch (Exception e) {
        }
    }

    public Connection getConnection() throws SQLException {
        connection = DriverManager.getConnection("jdbc:jdc:jdcpool");
        return connection;
    }
}

setelah itu kita tinggal panggil class tersebut di blok-blok kode kita lainnya. Jika kita ingin panggil dari halaman JSP, mungkin contoh nya seperti ini:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@page import="modules.PgInt"%>
<%@page import="java.sql.Connection"%>
<%@page import="pool.JDCConnection"%>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>

<%
PgInt pg = new PgInt();
JDCConnection conn1 = null, conn2 = null;
conn1 = (JDCConnection) pg.getConnection();
out.println(
    "CONN1" + conn1 + "");
conn1.close();
conn2 = (JDCConnection) pg.getConnection();
conn2.close();
out.println(
    "CONN2" + conn2 + "");
%>

</body>
</html>

Oke selamat mencoba!! :)

Sumber: java.sun.com

Database Connection Pool [part-2]

Sunday, December 28th, 2008

Dalam pemrograman Java, salah satu cara untuk melakukan teknik Database Connection Pooling adalah dengan memanfaatkan konfigurasi server yang kita pakai sebagai host dari aplikasi kita, baik itu application server maupun web container. Nah, sbagai lanjutan dari [part 1], kali ini saia akan coba berbagi tentang bagaimana cara kita mengkonfigurasi server kita agar bisa mendukung teknik Database Connection Pooling ini.

Sebelum masuk ke langkah-langkah konfigurasi, ada baiknya kita tau apa-apa saja yang dibutuhkan untuk proses pengkonfigurasian ini antara lain:

  1. Application Server atau Web Container – saia menggunakan Apache Tomcat 6 sebagai web container
  2. Database yang sudah support Connection Pooling (MySQL, PostgreSQL, Oracle) – saia menggunakan PostgreSQL 8.2
  3. Driver JDBC dari database yang kita gunakan (JDBC v2 or higher) – saia menggunakan postgresql-8.2-509.jdbc3.jar
  4. mm… kira-kira apalagi ya..?? tau ah.. ntar kalo kurang tambahin ndiri yak!! :D

Saia asumsikan bahwa Tomcat 6 dan PostgreSQL 8.2 sudah terinstall di Ubuntu saia. OK sekarang masuk ke langkah-langkah konfigurasi:

  1. Kita letakkan driver JDBC kita ke dalam folder lib yang ada di tempat Tomcat 6 saia terinstall. Berikut ini adalah path dimana Tomcat 6 saia terinstall : /home/satria/Application/apache-tomcat-6.0.14. Jadi berikut adalah path lengkap dari driver JDBC saia: /home/satria/Application/apache-tomcat-6.0.14/lib/postgresql-8.2-509.jdbc3.jar
  2. Setelah itu kita edit file server.xml yang ada diĀ /home/satria/Application/apache-tomcat-6.0.14/conf/server.xml tujuannya adalah supaya environment dari Tomcat Server ini bisa menangani Connection Pool – bahasa gampangnya meregister resource Connection Pool ke Tomcat Server. Caranya adalah dengan menyisipkan tag <resource> diantara tag <context>. Berikut adalah contoh potongan konfigurasinya:
    &lt;Context docBase=&quot;__DBPooling5&quot; path=&quot;/__DBPooling5&quot; reloadable=&quot;true&quot; crossContext=&quot;true&quot;&gt;
        &lt;Resource
            auth=&quot;Container&quot;
            driverClassName=&quot;org.postgresql.Driver&quot;
            maxActive=&quot;100&quot;
            maxIdle=&quot;30&quot;
            maxWait=&quot;10000&quot;
            name=&quot;db_xxxxxx&quot;
            password=&quot;dbapassword&quot;
            type=&quot;javax.sql.DataSource&quot;
            url=&quot;jdbc:postgresql://localhost:5432/db_xxxxxx_test&quot;
        username=&quot;dbauser&quot; /&gt;
    &lt;/Context&gt;
    

    Mungkin beberapa yang perlu diperhatikan antara lain tag-property driverClassName silahkan disesuaikan dengan driver database yang digunakan, url silahkan disesuaikan dengan url database yang dipakai oleh aplikasi, username dan password silahkan disesuaikan dengan username dan password yang terdaftar pada database yang digunakan.

  3. Setelah itu kita konfigurasi file web.xml yang juga ada di folder yang sama dengan file server.xml . Berikut adalah contoh potongan tag
    &lt;resource-ref&gt;
        &lt;description&gt;postgreSQL Datasource&lt;/description&gt;
        &lt;res-ref-name&gt;db_xxxxxx&lt;/res-ref-name&gt;
        &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
        &lt;res-auth&gt;Container&lt;/res-auth&gt;
    &lt;/resource-ref&gt;
    
  4. Jika sudah selesai semua kita restart service Tomcat nya.
  5. Sekarang Tomcat kita sudah support Database Connection Pool, tinggal kita lakukan pengkodean untuk mengakses resource Connection Pool ini.

Pada contoh kali ini, saya membuat sebuah class yang menangani permintaan koneksi dan pengembalian koneksi ke Pool dengan nama PgPoolTomcat.java

package modules;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

/**
* @author satria.permana
*
*/
public class PgPoolTomcat {
    DataSource ds = null;

    public PgPoolTomcat() {
        init();
    }

    private void init() {
        try {
            Context ctx = new InitialContext();
            if (ctx == null) {
                throw new Exception(&quot;Boom - No Context&quot;);
            }
            ds = (DataSource) ctx.lookup(&quot;java:comp/env/db_xxxxxx&quot;);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() {
        Connection conn = null;
        if (ds != null) {
            try {
                conn = ds.getConnection();
            } catch(SQLException sqlE) {
            }
        }
        return conn;
    }
}

Silahkan simpan file ini di folder source web-project Anda pada package modules. Selanjutnya kita buat sebuah halaman JSP yang memanfaatkan Class PgPoolTomcat.java ini untuk melakukan request koneksi dari Pool. Berikut adalah contoh file JSP :

&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;%@page import=&quot;java.sql.Connection&quot;%&gt;
&lt;%@page import=&quot;pool.JDCConnection&quot;%&gt;
&lt;%@page import=&quot;modules.PgPoolTomcat&quot;%&gt;
&lt;%@page import=&quot;java.sql.Statement&quot;%&gt;
&lt;%@page import=&quot;java.sql.ResultSet&quot;%&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
    &lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
PgPoolTomcat pg = new PgPoolTomcat();
Connection conn1 = pg.getConnection();
Statement st1 = conn1.createStatement();
// Silahkan sesuaikan query dibawah ini dengan query yang sesuai dengan database Anda
ResultSet rs1 = st1.executeQuery(&quot;SELECT * FROM master_ma.item LIMIT 10&quot;);
while(rs1.next()) {
    out.println(&quot;[] &quot;+conn1+&quot; - &quot; + rs1.getString(&quot;code&quot;) + &quot;&lt;br/&gt;&quot;);
    Statement st2 = conn1.createStatement();
    ResultSet rs2 = st2.executeQuery(&quot;SELECT * FROM master_ma.item LIMIT 1&quot;);
    if (rs2.next()) {
        out.println        (&quot;|| &quot;+conn1+&quot; - &quot; + rs2.getString(&quot;code&quot;) + &quot;&lt;br/&gt;&quot;);
    }
    rs2.close();
    st2.close();
    try {
        Thread.sleep(1000);
    } catch(InterruptedException iE) {
    }
}
conn1.close();
%&gt;
&lt;/body&gt;
&lt;/html&gt;

OK.. kini semua sudah siap, dan sekarang saatnya kita melakukan test terhadap Connection Pool yang sudah kita konfigurasi. Pertama silahkan periksa Server database PostgreSQL apakah sudah berjalan dengan baik, dan pastikan ada atau tidak koneksi yang terbentuk pada saat ini.

pg_service

Setelah itu kita periksa apakah servis Tomcat 6 kita sudah berjalan dengan baik pada port 8080.

tomcat_service

Jika sudah, kini saatnya kita lakukan testing Connection Pool dengan cara mengakses halaman index_tomcat.jsp yang sudah kita buat tadi melalui web browser. Kalau ingin lebih meyakinkan silahkan buka 2 buah browser dan lakukan pengaksesan halaman yang sama secara hampir bersamaan.

index_tomcat

Ketika proses di halaman web masih berlangsung, silahkan periksa resource koneksi yang terjadi pada Server database PostgreSQL melalui perintah ps -ax di console linux. Disana kita akan bisa melihat ada satu resource Connection Pool yang digunakan untuk mengakses database.

service_pg_pooled

Seharusnya koneksi yang dibuat tidak akan muncul sebanyak jumlah client yang melakukan request seperti halnya pada aplikasi biasa yang tidak menerapkan Connection Pooling. Satu resource Connection Pool tersebut akan di-release ketika Server Tomcat atau Server Database kita restart. Jadi dalam hal ini, kita sudah bisa melakukan penghematan resource untuk melakukan buka-tutup koneksi yang “mahal” harganya. Semoga bermafaat.. :)

Database Connection Pool [part-1]

Monday, December 22nd, 2008

Bagi para developerĀ  aplikasi basis data mungkin sudah sering mendengar istilah Connection Pooling atau biasa disebut Pooling. Tapi bagi developer lainnya mungkin istilah tersebut juga sering terdengar, tapi hanya sebatas kulit saja belum sampai kedalam-dalamnya. Ya…, dalam dunia software engineering, Connection Pooling adalah sebuah cache terhadap koneksi database.

Connection Pool ini sebenarnya pertama kali diperkenalkan oleh Microsoft IIS yang kemudian idenya juga dikembangkan oleh vendor-vendor web server lainnya. Ide awal munculnya penggunaan Connection Pooling ini didasari pada besarnya resource yang dibutuhkan ketika satu user / client melakukan pembukaan koneksi, proses transaksi, lalu kemudian penutupan koneksi database. Mungkin jika interaksi aplikasi dengan database tidak terlalu intens, problem ini tidak terlalu kerasa. Namun untuk aplikasi yang basically adalah database-driven sering koneksi ke database problem ini akan sangat-sangat terasa apalagi client yang melakukan koneksi sangat banyak.

Jadi, pada Connection Pooling ini, setelah koneksi database dibuat, koneksi tersebut akan diletakkan di pool dan terus menerus digunakan oleh banyak user. Sehingga setiap ada user atau klien yang butuh koneksi database, tidak perlu membuat koneksi database baru, cukup merequest koneksi yang ada dalam pool tadi. Baru ketika semua koneksi dalam pool sedang digunakan, maka baru dibuat koneksi database yang baru.

connection_pooling

connection_pooling

Connection Pooling umumnya digunakan di aplikasi berbasis web dan aplikasi enterprise dimana penanganan Connection Pool ini ditangani oleh application server atau web container. Sehingga pada masing-masing halaman dynamic-web bisa dilakukan pengkodean untuk melakukan buka-tutup koneksi seperti biasa, tetapi dibalik itu bukanlah buka-tutup koneksi yang dilakukan melainkan request koneksi dan mengembalikan koneksi pada pool setelah selesai digunakan. Untuk bisa menangani Connection Pool, perlu dilakukan konfigurasi pada environtment aplikasi server atau web container.

Selain ditangani oleh aplikasi server atau web container, Connection Pool juga bisa ditangani sendiri secara manual oleh aplikasi yang bersangkutan. Namun untuk bisa membuat sebuah framework yang mampu menangani Connection Pool sangatlah kompleks tapi bukan berarti mustahil. keuntungan dari jenis Connection Pool yang ini adalah bisa dilakukan secara Runtime, karena tidak lagi bergantung pada konfigurasi aplikasi server atau web container lagi, tetapi cukup menggunakan API Framework tersebut.

Jadi untuk para pengembang aplikasi database, mungkin ini adalah salah satu solusi untuk mengatasi masalah membengkaknya resource akibat banyaknya prosesn buka-tutup koneksi database. Semoga bermanfaat… :) Oiya, di postingan selanjutnya saya akan coba berikan contoh pengaplikasian 2 jenis Connection Pool yang sudah saya sebutkan. So.. ditunggu yah…