Database Abstraction Layer :: Kemudahan Melawan Performa

koneksi antara aplikasi database engine, abstraction layer dan developer/user/application layer
koneksi antara aplikasi database engine, abstraction layer dan developer/user/application layer

Abstraction Layer atau lapisan abstraksi adalah suatu lapisan untuk menyembunyikan kerumitan yang ada pada fungsi-fungsi yang serupa. Begitu pula dengan Database Abstraction Layer, suatu pendekatan penyederhanaan/penyeragaman fungsi dari setiap database engine yang ada, jadi kita tidak perlu mengetahui fungsi API database spesifik yang kita gunakan, yang perlu kita ketahui hanyalah fungsi API dari Database Abstraction Layer yang kita gunakan. Terkesan sederhana. Ya, memang ini menjadikan pekerjaan programmer sederhana.
Mungkin selama ini anda pernah mendengar ODBC, khususnya bagi anda pengguna Windows, karena memang pada awalnya ODBC muncul di sistem operasi ini. ODBC adalah salah satu dari berbagai jenis Database Abstraction Layer yang ada. Jenis lainnya adalah ORM, di PHP tersedia ActiveRecord, Doctrine, dll; di Java ada Hibernate, dll. Juga ada jenis yang lebih sederhana, seperti pada PHP ada PDO(PECL), atau PEAR DB(PEAR).
Dengan pendekatan ini, para programmer akan semakin mudah dalam menghubungkan aplikasi yang mereka buat dengan database, tapi harus kita ingat bahwa setiap pemecahan masalah akan selalu menimbulkan masalah baru. Memang benar bahwa dengan menggunakan Doctrine, kita tidak perlu mengkhawatirkan engine database apa yang kita gunakan, kita bisa menggunakan postgreSQL, MySQL, MSSQL, ataupun juga Oracle; dengan menggunakan Hibernate kita hanya perlu menggunakan fungsi API hibernate saja. Tapi, dengan adanya abstraction layer, artinya ada rutin fungsi lain yang dijalankan, ya, dengan itu berarti aplikasi jadi yang kita buat bisa menjadi lebih lambat dalam mengakses data :(, sayang sekali…
Contohnya mungkin pada skrip php yang menggunakan PDO berikut ini:

<?php
// tentukan $dsn, $username dan $password
$dsn = "mysql:host=localhost;dbname=telepon";
$username = "user";
$passwd = "password";

try{
    $pdo = new PDO($dsn, $username, $passwd);
    $runq = $pdo-&gt;query("SELECT * FROM akun a, telepon t WHERE a.id=t.id_akun");
    foreach ($runq as $row){
        echo $row['nama']." ".$row['telepon']."&lt;br/&gt;";
    }
}catch(PDOException $e){
    echo $e-&gt;getMessage();
}
?>

Ini dia, lihat pada $dsn, disini $dsn bisa diganti dengan driver lain yang disupport oleh PDO, kita bisa mengubahnya menjadi mssql ataupun yang lainnya. Untuk menjalankan query, kita hanya perlu menjalankan $pdo->query($sql), dan lakukan iterasi untuk memunculkan hasilnya.
Namun, lihat pada objek PDO, objek ini menerima berbagai masukan jenis database engine yang ada, tapi mengeluarkan hasil yang sama, artinya ada sesuatu yang kompleks yang terjadi di dalam fungsi objek ini, dan tentunya itu akan makan waktu, yang berharga untuk setiap permintaan query user :(.
Dengan rangkuman bahwa Database Abstraction Layer memiliki:
Kelebihan

  • Waktu pengembangan (yang perlu dilakukan developer hanya mengetahui fungsi DBAL saja)
  • Tidak perlu mengkhawatirkan database engine (selama driver terpenuhi, maka fungsi DBAL akan berjalan sesuai keinginan)

Kekurangan

  • Waktu (karena DBAL menjalankan rutin fungsi yang lebih banyak daripada fungsi native yang disediakan, tentunya waktu query jadi lebih lambat)
  • Fungsi Kompleks Spesifik Engine (mengingat DBAL ini fungsinya untuk menyeragamkan fungsi dan hasil, kita tidak akan menemukan kelebihan spesifik (fungsi kompleks) dari engine database. misal: pengoptimasian query, karena tidak semua database engine menyediakan cara untuk optimasi query (lewat index), jadi DBAL-pun tidak menyertakannya)

dan, itulah garis besar dari database abstraction layer.

14 tanggapan untuk “Database Abstraction Layer :: Kemudahan Melawan Performa”

  1. Untuk PHP memang nyata banget terjadi penurunan performance.
    Tapi di java beda lagi.. 😀 justru sebaliknya, si rdbms ga terus-terusan digeber. Aku baru tau sekarang kenapa Hibernate dikasih nama Hibernate, karena memang cara kerjanya mirip dengan saat kita nge hibernate komputer.

  2. nice inpoh gan…
    mirip penggunaan API Fac…eh boleh sebut merek gak nih?..heu
    penambahan layer bisa ngurangin kebutuhan waktu buat ngembangin aplikasi “ber-database”, tapi kalo masalah kompleksitas karena nambah layer gimana ya gan?
    Mohon penjelasannya nih, maklum masih newbie 😀

    1. sip naw…ay…di, ah, sip deh di! 😀
      iya, memang kurang lebih mirip dengan facebook API, khususnya FQL, tapi karena server facebook ada ribuan lebih maka loading timenya jadi terasa seperti langsung dari server sendiri. Penambahan layer ini tergantung metode yang dipakai, kalau hanya kumpulan fungsi untuk menyederhanakan perintah saja sepertinya akan terjadi penurunan performa yang cukup berarti. Sedangkan berbeda jika seperti yang dikatakan saudara ata sebelumnya, bahwa hibernate memiliki rutin khusus agar operasi fetch database menjadi lebih cepat. Yah, sebenarnya saya belum coba sih 😀

  3. Eh, ngomong-ngomong saia coba melakukan test sederhana untuk INSERT data sederhana pada MySQL (engine InnoDB), berikut codenya:

    native:

    <?php
    $s = microtime(true);
    mysql_connect('127.0.0.1','root','root');
    mysql_select_db('simpleblog');
    foreach(range(1,1000) as $i)
    {
        mysql_query("INSERT INTO user(name,email) VALUES('Ata','mail@ata.web.id')");
    }
    $e = microtime(true);
    echo ($e - $s);
    

    pakai PDO:

    <?php
    $s = microtime(true);
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=simpleblog','root','root');
    foreach(range(1,1000) as $i)
    {
        $pdo->exec("INSERT INTO user(name,email) VALUES('Ata','mail@ata.web.id')");
    }
    $e = microtime(true);
    echo ($e - $s);
    

    Dilakukan masing-masing tiga kali testing, dan hasilnya:

    native:
    0.38668704032898
    0.42286705970764
    0.4378080368042

    PDO:
    0.42233490943909
    0.43034291267395
    0.39354610443115

  4. Kerena masih penasaran, saya lakukan ujicoba lagi, namun kali menggunakan Transaction

    native-nya

    <?php
    $s = microtime(true);
    mysql_connect('127.0.0.1','root','root');
    mysql_select_db('simpleblog');
    mysql_query("START TRANSACTION");
    foreach(range(1,1000) as $i)
    {
        mysql_query("INSERT INTO user(name,email) VALUES('Ata','mail@ata.web.id')");
    }
    mysql_query("COMMIT");
    $e = microtime(true);
    echo ($e - $s);
    

    POD-nya

    <?php
    $s = microtime(true);
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=simpleblog','root','root');
    $pdo->beginTransaction();
    foreach(range(1,1000) as $i)
    {
        $pdo->exec("INSERT INTO user(name,email) VALUES('Ata','mail@ata.web.id')");
    }
    $pdo->commit();
    $e = microtime(true);
    echo ($e - $s);
    

    dan Hasilnya:

    native with Transaction:
    0.11872601509094
    0.13377690315247
    0.10277199745178

    PDO with Transaction:
    0.11157703399658
    0.11124014854431
    0.10987615585327

  5. Kalau yang tadi masih tanpa melalui tahap pengamanan dari SQL Injection, sekarang udah pakai escape:

    native-nya:

    <?php
    $s = microtime(true);
    mysql_connect('127.0.0.1','root','root');
    mysql_select_db('simpleblog');
    mysql_query("START TRANSACTION");
    foreach(range(1,1000) as $i)
    {
        $name = mysql_escape_string("Ata't");
        $email = mysql_escape_string("mail@wata.web.id");
        mysql_query("INSERT INTO user(name,email) VALUES('$name','$email')");
    }
    mysql_query("COMMIT");
    $e = microtime(true);
    echo ($e - $s);
    

    POD-nya:

    <?php
    $s = microtime(true);
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=simpleblog','root','root');
    $pdo->beginTransaction();
    foreach(range(1,1000) as $i)
    {
        $sth = $pdo->prepare("INSERT INTO user(name,email) VALUES(:name,:email)");
        $sth->execute(array("name" => "Ata't","email"=>"mail@ata.web.id"));
    }
    $pdo->commit();
    $e = microtime(true);
    echo ($e - $s);
    

    dan Hasilnya:

    native with escape
    0.13209915161133
    0.12799215316772
    0.12457489967346

    PDO include escape
    0.12290501594543
    0.12156391143799
    0.12350106239319

  6. So bedanya dimana? Mending yang mana? Dengan perbedaan waktu eksekusi yang amat sangat tipis. Saya sih milih pakai PDO, code jadi lebih rapih. Toh sama cepatnya

    O ya, saia melakukan ujicoba di:
    – OS: Linux 2.6.26-1-686 (GNU/Linux Debian Lenny)
    – Apache 2.2
    – PHP 5.3

  7. menarik juga, setelah dilihat hasilnya ternyata bahkan PDO bisa lebih cepat pada penggunaan transaction dan escape, mungkin hal ini disebabkan karena tidak seperti PEAR yang merupakan kelas fungsi php saja, PDO merupakan native library (*.dll, *.so), jadi berjalan setingkat lebih tinggi.
    Akhirnya, fungsi mysql native dihasilkan lewat native library, juga PDO mysql dihasilkan lewat native driver, sehingga mungkin karena itu perbedaan performa tidak begitu terlihat.

Tinggalkan Balasan ke Ahmad Tanwir Batalkan balasan