Memakai Oracles TimesTen Dengan simple-jpa


Oracle TimesTen adalah sebuah database in-memory yang mendukung SQL.   Karena TimesTen masih mendukung SQL, maka ia dapat dipakai pada aplikasi yang menggunakan Java Persistence API (JPA) dalam mengakses database.   Oleh sebab itu, saya akan mencoba melakukan migrasi database pada sebuah aplikasi Griffon yang memakai plugin simple-jpa.   Aplikasi desktop tersebut sebelumnya memakai database MySQL, dan saya ingin mengubahnya agar memakai database Oracle TimesTen.   Apa saja perubahan yang harus dilakukan?

Langkah pertama adalah menambahkan driver JDBC ke proyek saya.   Driver JDBC untuk TimesTen tidak ada di repository global Maven (karena ia bukan produk open-source!) sehingga saya tidak bisa menambahkannya pada file BuildConfig.groovy seperti biasa.   Sebagai alternatifnya, saya akan men-copy file C:\TimesTen\tt1122_32\lib\ttjdbc7.jar secara manual ke folder C:\proyekGriffon\lib.

Langkah berikutnya adalah menyiapkan dialek TimesTen untuk Hibernate JPA.   Setiap database, walaupun mendukung SQL secara umum, masing-masing memiliki sedikit perbedaan.   Sebagai contoh, tipe data tulisan (karaketer) yang disarankan untuk TimesTen dan Oracle Database adalah VARCHAR2, sementara pada MySQL yang tersedia adalah VARCHAR.   Contoh lainnya, untuk melihat tanggal hari ini di MySQL, saya memakai function seperti SELECT CURRENT_DATE. Sementara itu, jika di TimesTen dan Oracle Database, saya akan memakai function SELECT SYSDATE FROM DUAL.

Hibernate JPA dapat mendukung berbagai variasi SQL pada masing-masing database, yang disebutnya sebagai dialek.   Secara bawaan, Hibernate memiliki beberapa dialek yang dapat dipilih dengan cara dilewatkan melalui property hibernate.dialect.  Contoh dialek bawaan adalah MySQLMyISAMDialect, MySQLInnoDBDialect, Oracle9Dialect, PostgreSQL81Dialect, SAPDBDialect, dan sebagainya.   Sayang sekali, dari seluruh dialek bawaan Hibernate, tidak ada dialek untuk TimesTen.  Tapi saya tidak perlu khawatir karena TimesTen telah menyediakan dialek untuk dipakai di Hibernate.   Lokasinya terletak di C:\TimesTen\tt1122_32\quickstart\sample_code\j2ee_orm\config\hibernate4\TimesTenDialect1122.java.   Saya segera membuat folder untuk package org.hibernate.dialect dan meletakkan file tersebut pada folder ini, seperti yang diperlihatkan oleh gambar berikut ini:

Menambah dialek TimesTen untuk Hibernate

Menambah dialek TimesTen untuk Hibernate

Ada sedikit kekurang TimesTenDialect1122 yang perlu saya perbaiki terlebih dahulu.   Sama seperti Oracle Database, TimesTen tidak mendukung tipe data boolean di SQL.   Sementara itu, di MySQL, bila saya mendefinisikan sebuah kolom dengan tipe data boolean, ia akan diterjemahkan menjadi tinyint(1).   Oleh sebab itu, saya menambahkan baris berikut ini pada class TimesTenDialect1122:

registerColumnType(Types.BOOLEAN, "TT_TINYINT");

Sekarang, saya akan melakukan perubahan pada file persistence.xml sehingga terlihat seperti berikut ini:

<persistence ...>
  <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    ...
    <properties>
      <property name="javax.persistence.jdbc.driver" value="com.timesten.jdbc.TimesTenDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:timesten:direct:LATIHAN"/>
      <property name="javax.persistence.jdbc.user" value="solid"/>
      <property name="javax.persistence.jdbc.password" value="snake"/>
      <property name="hibernate.connection.autocommit" value="false"/>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.TimesTenDialect1122"/>
      <property name="jadira.usertype.autoRegisterUserTypes" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

Saya mengubah nilai property hibernate.hbm2dll.auto menjadi create-drop supaya Hibernate membuat tabel baru di database TimesTen yang masih kosong.   Baris ini boleh dihapus bila tidak dibutuhkan lagi.

Lalu, apa langkah berikutnya? Cukup sampai disini!   Saya tidak perlu mengubah kode program karena saya tidak memberikan perintah SQL secara langsung, melainkan melalui melalui dynamic finders dan JP QL (bahasa query untuk JPA).   Dengan demikian, saya tidak perlu khawatir dengan SQL yang tidak compatible antara MySQL dan TimesTen (selama dialek Hibernate-nya tidak bermasalah!).

Tapi ada satu pandangan naif yang perlu dihindari, terutama bagi programmer yang tidak mau berurusan dengan cara kerja database, yaitu menganggap bahwa dengan memakai sebuah database ‘keren’ maka kinerja aplikasi secara otomatis akan meningkat.   Ini adalah sebuah pandangan yang salah karena masing-masing database memiliki karakteristik tersendiri.   Terkadang aplikasi harus menyesuaikan dengan karakteristik database.   Sebagai contoh, ada dua ‘aliran‘ dalam mengakses data di memori.   Sebuah tabel terdiri atas dua dimensi (baris dan kolom) dengan data seperti:

        Kolom1   Kolom2   Kolom3
---------------------------------
Baris1   A1      B1       C1
Baris2   A2      B2       C2
Baris3   A3      B3       C3   
---------------------------------

Skema di atas adalah visualisasi tabel dalam benak manusia. Tapi saat disimpan di memori dan piringan harddisk, segala sesuatunya disimpan dalam blok per blok (anggap setiap blok adalah sebuah kotak yang dapat diisi).  Setiap blok di memori (atau blok di sektor harddisk) memiliki alamat berupa posisi offset, misalnya dari  0 hingga ke byte terakhir di offset 0xffffffff.   Jadi, di media penyimpanan, struktur tabel yang dua dimensi (baris dan kolom) harus disimpan ke dalam struktur satu dimensi (kumpulan blok).  Perancang database (pembuat DBMS) dapat memilih menyimpan data tabel per baris sehingga data akan terlihat seperti: A1 B1 C1 A2 B2 C2 A3 B3 C3.   Tapi ia juga dapat memilih menyimpan per kolom sehingga data di memori akan terlihat seperti: A1 A2 A3 B1 B2 B3 C1 C2 C3.   Tabel yang disimpan per kolom memungkinkan query yang cepat (seperti agregasi per kolom) dan memungkinkan kompresi kolom.   Tapi kelemahannya adalah proses penambahan data baru menjadi lebih lambat.   Hal ini menyebabkan DBMS yang menyimpan data per baris lebih tepat dipakai untuk aplikasi OLTP (pemrosesan transaksi), sementara DBMS yang menyimpan data per kolom lebih tepat dipakai untuk aplikasi OLAP (analisa dan laporan).  Contoh sederhana ini menunjukkan bahwa sebaiknya aplikasi mengerti karakteristik database sehingga dapat menggunakannya secara maksimal.

Kembali ke aplikasi saya, saat setelah mengganti database dari MySQL ke TimesTen, saya mencoba menguji perbedaan kecepatannya.   Saya membuat kode program yang menambah 94.521 faktur (termasuk diantaranya query untuk mencari konsumen berdasarkan kode, mencari barang berdasarkan kode, dan menambah pembayaran).   Saat memakai database MySQL, transaksi tersebut selesai dalam waktu 13 menit. Sementara bila memakai TimesTen, dibutuhkan waktu hingga mencapai 14 menit!   Mengapa TimesTen lebih lambat dibanding MySQL??

Investigasi lebih lanjut menunjukkan bahwa TimesTen kesulitan menangani transaksi yang isinya sangat besar.   Pada percobaan pertama, 94.521 faktur tersebut merupakan bagian dari sebuah transaksi tunggal.   Untuk percobaan kedua, saya menjadikan setiap proses penyimpanan masing-masing faktur menjadi sebuah transaksi tunggal.   Hasilnya? Oracle TimesTen berhasil memproses seluruh faktur dalam waktu 10 menit!   MySQL malah kewalahan melakukan banyak commit sehingga pada percobaan kedua ini, ia membutuhkan waktu hingga 49 menit.   Kali ini, TimesTen hampir lima kali lebih cepat dibandingkan dengan MySQL.

Perihal Solid Snake
I'm nothing...

One Response to Memakai Oracles TimesTen Dengan simple-jpa

  1. Ping-balik: Memakai Full-Text Search Di MySQL Server | Programming Logic And Technology

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: