BAB II KAJIAN PUSTAKA Pada bab dua ini akan dibahas mengenai definisi dan konsep dari fault tolerance, RDBMS, MySQL, database transaction, JDBC, database connection, dan database session, serta hasil eksplorasi terhadap MySQL Connector/J dan MySQL. Landasan teori ini akan memberikan pemahaman yang lebih mendalam mengenai topik-topik yang disebutkan sehingga akan mempermudah proses analisis penyelesaian masalah pada bab selanjutnya.
2.1 Fault Tolerance Fault tolerance merupakan properti yang memungkinkan suatu sistem dapat terus beroperasi ketika terjadi kegagalan pada salah satu atau lebih komponennya. Properti fault tolerance sangat diperlukan terutama pada highly available atau life critical system. Implementasi fault tolerance pada suatu sistem dapat dilakukan dengan beberapa strategi berikut [SHO87]: 1. Menyediakan beberapa instan identik dari sistem atau subsistem, mengarahkan task atau request ke seluruh instan secara paralel, lalu memilih hasil terbaik berdasarkan quorum. 2. Menyediakan beberapa instan identik dari sistem atau subsistem dan beralih ke instan lainnya ketika terjadi kegagalan pada instan utama (failover). 3. Menyediakan beberapa implementasi yang berbeda untuk suatu spesifikasi dan menggunakannya seperti sistem tereplikasi untuk mengatasi error pada implementasi tertentu.
Pada MySQL Cluster, fault tolerance pada DBMS MySQL diimplementasikan dengan replikasi synchronous dengan mekanisme two-phase commit untuk menjamin penulisan data pada seluruh node ketika commit. Ketika terjadi kegagalan pada salah satu replika, sistem masih dapat menggunakan replika lainnya.
II-1
II-2
2.2 RDBMS (Relational Database Management System) RDBMS merupakan sebuah sistem kompleks yang mendukung penyimpanan dan retrieval data berdasarkan model relasional. Model relasional merepresentasikan data sebagai komponen informasi yang saling terkait (atribut) dari suatu entitas. Set nilai dari atribut-atribut sebuah entitas disimpan sebagai tuple yang akan dikumpulkan dalam sebuah tabel. Sebuah tabel dapat memiliki relasi dengan tabel lainnya dengan batasan (constraint) domain, key, atribut, atau tuple.
Karakteristik utama database relasional adalah pemisahan mutlak antara data fisik dan data lojik. Akses terhadap data dilakukan melalui suatu model lojik seperti SQL (Structured Query Language) tanpa perlu menspesifikasikan lokasi fisik penyimpanan data. Salah satu faktor pendukung kemudahan akses data secara lojik tersebut adalah arsitektur RDBMS yang rumit.
Umumnya RDBMS dikembangkan dengan arsitektur client/server, di mana aplikasi client dikembangkan sebagai program terpisah yang terhubung ke database melalui jalur komunikasi seperti socket atau pipe, misalnya MySQL. MySQL berjalan sebagai server yang menyediakan akses ke database bagi sejumlah client sekaligus secara konkuren. Aplikasi client MySQL dapat terhubung ke database melalui berbagai metode komunikasi yang ditangani secara identik, antara lain Unix domain socket (umumnya /tmp/mysql.sock atau /var/run/mysqld/mysql.sock), Windows named pipe (umumnya \\hostname\pipe\mysql), shared memory, atau port TCP (umumnya port 3306).
Selain itu terdapat embedded database system yang memungkinkan client terhubung langsung ke database, karena database system merupakan bagian dari aplikasi client. Operasi terhadap database dilakukan oleh aplikasi dengan mengeksekusi prosedur tertentu. Embedded database system banyak digunakan untuk pengembangan sistem yang membutuhkan respon dan informasi dari database segera tanpa delay.
RDBMS yang dikembangkan sebagai client/server umumnya memiliki protokol tertentu yang mendefinisikan metode komunikasi client dan dan database server. Protokol komunikasi tersebut menentukan data dan format yang harus dikirimkan
II-3
client untuk melakukan request koneksi ke suatu database, mengirimkan command ke database, dan melakukan pemutusan koneksi. Protokol komunikasi biasanya spesifik untuk setiap database.
Pada protokol MySQL versi 10, setiap client message dikirim sebagai sebuah paket MySQL, sedangkan respon server bisa terdiri dari beberapa paket. Paket MySQL ini tidak berhubungan dengan paket network layer yang digunakan, bahkan banyak paket respon dari server yang hanya berupa sebuah IP datagram. Setiap paket memiliki header sepanjang empat byte. Tiga byte pertama header menunjukkan ukuran paket. Byte terakhir header menunjukkan nomor urut paket, diawali dengan 0.
Secara garis besar terdapat dua jenis interaksi antara client dan server, yaitu interaksi handshake yang dilakukan pada saat client membentuk koneksi ke server dan interaksi perintah setelah terbentuk koneksi. Interaksi selengkapnya diilustrasikan pada Gambar II-4. Berikut langkah-langkah handshake setelah terbentuk koneksi di level transport : 1.
Server mengirimkan Handshake Initialization Packet ke client yang berisi informasi mengenai versi protokol, versi server, dan thread id.
2.
Client mengirimkan Client Authentication Packet ke server yang berisi informasi mengenai username, password, dan nama database yang akan digunakan.
3.
Server mengirimkan OK packet atau Error packet kepada client. Setelah menerima OK packet, client dapat mulai mengirimkan Command Packet. Sebaliknya, jika client menerima Error packet, client akan menutup koneksi.
Ketika memberikan perintah ke server, client akan mengirimkan Command Packet yang berisi satu byte perintah dan n byte argumen. Server akan mengirimkan simple response berupa OK Packet jika perintah berhasil dilakukan, tabular response berupa Result Set Packet jika perintah mengembalikan data, atau Error Packet jika ditemukan kesalahan.
Untuk mempermudah client mengakses database tanpa perlu mengetahui detil protokol komunikasinya, biasanya vendor database menyediakan modul yang
II-4 berfungsi sebagai ”interpreter” antara aplikasi client dan database server. Modul yang disebut database connector tersebut terdiri dari API, library pendukung API tersebut, dan database driver yang spesifik untuk setiap DBMS. Aplikasi client dapat mengirim perintah SQL ke database server melalui database connector, kemudian database connector akan mengirimkan perintah tersebut ke database server sesuai protokol network yang dispesifikasikan oleh driver dan mengembalikan hasil eksekusi perintah ke client.
Gambar II-1 Komunikasi aplikasi client dan database server [BEL07]
MySQL menyediakan konektivitas untuk aplikasi client yang dikembangkan dengan bahasa Java melalui JDBC driver, yang dikenal dengan nama MySQL Connector/J. MySQL Connector/J merupakan JDBC driver tipe 4, yaitu driver yang merupakan implementasi murni dari protokol MySQL dan tidak bergantung pada library client MySQL yang digunakan.
Suatu RDBMS dapat menangani operasi atomik maupun transaksi. Transaksi memungkinkan eksekusi sekumpulan operasi seakan-akan sebagai sebuah operasi atomik. Suatu transaksi biasanya diawali dengan statement begin transaction dan diakhiri dengan statement end transaction. Operasi-operasi terkait transaksi berada di antara kedua statement tersebut.
Transaksi merupakan salah satu cara untuk menjamin fault tolerance pada data management tier karena memiliki properti ACID (Atomicity, Consistency, Isolation, dan Durability) yang menjamin integritas dari data.
II-5
Database system harus mampu menjaga properti dari transaksi sebagai berikut: 1. Atomicity: Semua operasi dalam transaksi harus tereksekusi atau tidak sama sekali. 2. Consistency: Data yang akan disimpan di database hanyalah data yang valid. 3. Isolation: Jika terdapat beberapa transaksi yang berjalan secara konkuren, transaksi tersebut tidak boleh saling menginterferensi. 4. Durability: Setelah transaksi selesai dieksekusi, perubahan yang dilakukan oleh transaksi tersebut terhadap database permanen walaupun terjadi kegagalan sistem.
Gambar II-2 State diagram transaksi [SIL02]
Pada state diagram di atas (Gambar II-2), setiap transaksi akan berada di salah satu state berikut: 1. Active: Keadaan awal, setiap transaksi berada pada state ini ketika eksekusi. 2. Partially Commited: State di mana operasi terakhir dari sebuah transaksi telah dieksekusi. 3. Failed: State setelah ditemukan kegagalan pada transaksi. 4. Aborted: Transaksi telah di-roll-back dan database kembali ke kondisi sebelum transaksi dieksekusi. 5. Commited: Transaksi berhasil dan semua perubahan menjadi permanen.
II-6
MySQL mengelola dua jenis transaksi, yaitu transaksi statement yang memperlakukan setiap statement sebagai sebuah transaksi dan transaksi normal. Transaksi statement dimulai setiap kali sebuah statement diterima oleh database, akan commit jika statement tersebut berhasil dieksekusi atau roll-back jika statement gagal dieksekusi. Transaksi normal diawali dan diakhiri secara eksplisit oleh user, terdiri dari sejumlah statement di antara statement begin dan end transaksi. Penentuan commit atau rollback suatu transaksi normal ditentukan oleh user atau storage engine terkait. Pada mode autocommit, transaksi normal akan diperlakukan sebagai sejumlah transaksi statement.
Untuk setiap koneksi client, MySQL menyimpan state transaksi statement dan transaksi normal di thd->transaction. Struktur thd->transaction memiliki dua atribut bertipe THD_TRANS, yaitu thd->transaction.stmt yang memuat list of engines yang terlibat pada suatu statement dan thd->transaction.all yang memuat list of engines yang terlibat pada seluruh statement pada transaksi normal. Setiap elemen list merupakan pointer ke storage engine, data transaksional, dan flag transaksi.
Pada transaksi yang autocommit, data pada thd->transaction.all akan kosong. Sebaliknya, data pada thd->transaction.stmt diperlukan untuk menentukan commit/roll-back pada transaksi normal, sehingga transaksi nomal tidak akan pernah commit jika belum semua transaksi statement di dalamnya commit. Setiap kali suatu statement
commit atau roll-back,
list
pada thd->transaction.stmt
akan
dikosongkan, siap untuk digunakan oleh statement berikutnya. List pada thd>transaction.all
akan dikosongkan setelah transaksi normal commit. Jika koneksi
terputus saat transaksi normal sedang berjalan, maka transaksi tersebut akan di-rollback.
2.3 JDBC (Java Database Connectivity) JDBC merupakan teknologi yang memungkinkan program Java melakukan manipulasi data pada database. Terdapat empat komponen utama pada JDBC, yaitu:
II-7
1.
JDBC API (Application Programming Interface) JDBC API merupakan API Java yang terdiri dari beberapa kelas dan interface untuk mengakses database relasional. JDBC API memudahkan suatu aplikasi Java untuk membentuk koneksi ke data source, mengirim statement query dan update ke data source, dan memproses hasil eksekusi statement tersebut dari data source. Dengan menggunakan JDBC API, aplikasi menjadi independen terhadap database yang digunakan, sebuah program dapat digunakan untuk mengakses berbagai jenis data source berbeda. Pada JDBC 4.0, terdapat dua jenis API, yaitu JDBC 4.0 Core API, dan JDBC 4.0 Standard Extension. JDBC 4.0 Core API wajib digunakan dalam pembentukan koneksi dan terdapat dalam package java.sql. Sedangkan JDBC 4.0 Standard Extension API terdapat dalam package javax.sql, merupakan alternatif lain dari JDBC 4.0 Core API karena memiliki fungsi tambahan yang bersifat opsional.
2.
JDBC Driver Manager JDBC Driver Manager yang merupakan backbone dari arsitektur JDBC adalah sebuah kelas yang bekerja di antara user dan driver JDBC. Driver Manager berfungsi menghubungkan aplikasi Java dengan driver JDBC yang tepat saat pembentukan koneksi ke database.
3.
JBDC Test Suite JDBC Test Suite bertugas menguji kemampuan suatu JDBC driver untuk menjalankan program user dengan mengeksekusi berbagai fitur esensial pada JDBC API.
4.
JDBC-ODBC Bridge JDBC-ODBC Bridge memungkinkan penggunaan driver ODBC sebagai driver JDBC. JDBC-ODBC Bridge akan menerjemahkan method call JDBC menjadi function call ODBC, sehingga dapat digunakan untuk berkomunikasi dengan database apapun yang memiliki driver ODBC. Implementasi JDBCODBC Bridge terdapat dalam package sun.jdbc.odbc yang berisi native library untuk mengakses ODBC.
II-8
Gambar II-3 Arsitektur JDBC [HAE02]
2.3.1 JDBC API JDBC API memungkinkan independensi pengembangan aplikasi terhadap database yang digunakan, karena implementasi dari interface yang didefinisikan di API tersebut disediakan oleh vendor database. Terdapat beberapa kelas dan interface utama pada JDBC API, antara lain: 1. java.sql.DriverManager Kelas yang mengelola JDBC driver pada list jdbc.drivers, digunakan untuk membentuk koneksi ke data source. Pembentukan koneksi dilakukan dengan menggunakan method getConnection. 2. javax.sql.DataSource Interface
yang
merupakan
alternatif
dari
java.sql.DriverManager ,
implementasinya disediakan oleh vendor JDBC driver. Terdapat beberapa tipe implementasi yang memungkinkan pembentukan objek Connection standar, objek Connection yang secara otomatis berpartisipasi dalam connection pooling, atau objek Connection yang dapat digunakan pada distributed transaction. Serupa dengan DriverManager, pembentukan koneksi ke data source dilakukan dengan menggunakan method getConnection.
II-9 3. java.sql.Driver Interface yang merepresentasikan JDBC driver, implementasinya bergantung pada database. Sebelum pembentukan koneksi ke database, Driver harus diload dan di-register ke DriverManager terlebih dahulu dengan menggunakan method Class.forName. Untuk membentuk koneksi database ke suatu URL, digunakan method connect yang akan mengembalikan objek Connection atau null jika driver tersebut tidak sesuai. 4. java.sql.Connection Interface yang merepresentasikan suatu koneksi (session) ke database. Eksekusi dan pengembalian hasil eksekusi statement SQL hanya dapat dilakukan dalam konteks ini dengan menggunakan method createStatement. 5. java.sql.Statement Interface yang mendukung eksekusi statement SQL ke database. Untuk mengeksekusi statement SELECT, dapat digunakan method executeQuery yang menerima parameter statement SQL dan mengembalikan objek ResultSet.
Method executeUpdate yang menerima parameter statement
DML (Data Manipulation Language) SQL atau statement DDL (Data Definition Language) SQL dapat digunakan untuk mengeksekusi statement INSERT, UPDATE,
atau DELETE.
6. java.sql.ResultSet Interface yang merepresentasikan sebuah tabel data hasil eksekusi sebuah statement SQL. ResultSet memiliki sejumlah method getter yang dapat digunakan untuk me-retrieve data dari setiap baris tabel.
2.3.2 JDBC Driver Agar suatu program Java yang menggunakan JDBC dapat berkomunikasi dengan database diperlukan suatu driver yang berfungsi mengubah request dari program menjadi format yang sesuai dengan protokol yang dimengerti oleh database. Translation layer inilah yang mendukung dependensi suatu aplikasi terhadap database. Jika database di back-end berubah, hanya diperlukan penggantian driver JDBC dengan driver yang sesuai dan sedikit perubahan pada kode aplikasi. Terdapat empat tipe implementasi driver JDBC, yaitu:
II-10
1. JDBC-ODBC Bridge plus ODBC Driver Driver tipe 1 ini menyediakan akses JDBC melalui driver ODBC (Open Database Connectivity). Pada driver tipe ini, method call JDBC akan dikonversi menjadi function call ODBC. JDBC-ODBC Bridge plus ODBC Driver bersifat platform-independent, namun sangat bergantung pada native library dari sistem operasi. 2. Native-API Partly-Java Driver Driver tipe 2 ini mengubah JDBC call menjadi database specific call dengan memanfaatkan client-side library dari database. Driver tipe ini bersifat platform-dependent. 3. JDBC-Net Pure Java Driver Driver tipe 3 ini mengubah JDBC call menjadi format yang sesuai dengan suatu protokol network yang independen terhadap DBMS untuk selanjutnya diubah menjadi format yang sesuai protokol DBMS oleh middleware server. JDBC-Net Pure Java Driver merupakan tipe driver yang paling fleksibel karena dapat menghubungkan client ke berbagai database berbeda. 4. Native-Protocol Pure Java Driver Driver tipe 4 ini mengubah JDBC call menjadi format yang sesuai protokol network yang digunakan oleh DBMS. Implementasi seperti ini memungkinkan client berhubungan langsung dengan database server, sehingga lebih cepat dibandingkan driver tipe lainnya. Kekurangannya, Native-Protocol Pure Java Driver merupakan tipe driver yang sangat bergantung kepada database.
2.3.3 Connection Connection
merupakan sebuah objek pada JDBC yang merepresentasikan koneksi ke
sebuah database, yaitu metode yang memungkinkan client software berkomunikasi dengan database server pada mesin yang sama atau berbeda. Koneksi fisik ke database umumnya menggunakan socket atau pipe. Suatu aplikasi dapat memiliki beberapa koneksi sekaligus ke sebuah database atau ke sejumlah database berbeda.
Untuk
menghidupkan
objek
Connection,
com.mysql.jdbc.DriverManager.getConnection .
biasanya
digunakan
method
Sebelumnya, driver JDBC yang
II-11
sesuai harus di-load dan di-register terlebih dahulu dengan mengeksekusi method Class.forName.
Method tersebut menerima parameter sebuah nama driver dan
mengembalikan objek com.mysql.jdbc.Driver. // load MySQL Connector/J Driver Class.forName(“com.mysql.jdbc.Driver”).newInstance();
Kode II-1 Proses load dan register MySQL Connector/J driver
Terdapat tiga overload method getConnection yang dapat digunakan, yaitu: 1. getConnection(String
url)
yang menerima parameter JDBC URL
(Uniform Resource Locator). 2. getConnection(String
url,
Properties
info)
yang
menerima
parameter JDBC URL dan properti. 3. getConnection(String url, String user, String password) yang menerima parameter JDBC URL, username, dan password. // connection to MySQL using DriverManager Connection conn = DriverManager.getConnection(“jdbc:mysql://hostname/databasename”, “username”, “password”);
Kode II-2 Pembentukan koneksi ke MySQL dengan DriverManager
JDBC URL merupakan metode pengalamatan data source yang memiliki sintaks standar sebagai berikut. jdbc:[subprotocol]://[host][,failoverhost…][:port]/[database][?proper tyName1=propertyValue1][&propertyName2=propertyValue2]…
Tabel II-1 Komponen JDBC URL Komponen subprotocol
Fungsi menspesifikasikan nama driver atau nama mekanisme konektivitas database
host
menspesifikasikan nama host (localhost jika server berada pada komputer lokal)
II-12
Komponen
Fungsi menspesifikasikan nama host opsional yang
failoverhost
akan digunakan jika koneksi ke host sebelumnya tidak berhasil menspesifikasikan nomor port (port default
:port
adalah 3306) /database
menspesifikasikan nama database default menspesifikasikan parameter opsional terkait koneksi dan otentikasi seperti user, password, useCompression; terkait
jaringan seperti tcpRcvBuf, tcpSndBuf ; terkait availabilitas dan clustering seperti autoReconnect, roundRobinLoadBalance ;
terkait keamanan seperti ?propertyName1=propertyValue1
allowMultiQueries, useSSL; terkait
performansi seperti metadataCacheSize, useFastIntParsing; terkait debugging
dan
profiling seperti logger, maxQuerySizeToLog; atau useUnicode, maxRows.
lainnya seperti
Seluruh parameter
opsional beserta nilai default-nya dilampirkan di lampiran A. &propertiName2=propertyValue2
menspesifikasikan parameter opsional tambahan
Selanjutnya, kelas DriverManager yang merupakan management layer pada JDBC akan memeriksa setiap driver pada list jdbc.drivers yang dikelolanya sampai menemukan driver
yang
mampu
membentuk
koneksi ke
database
yang
direpresentasikan oleh JDBC URL tersebut. Pembentukan koneksi dilakukan dengan memanggil method connect dari setiap objek Driver pada list tersebut.
Selain menggunakan kelas DriverManager, objek Connection dapat diperoleh dengan menggunakan interface javax.sql.DataSource. DataSource merupakan
II-13
metode pembentukan koneksi untuk mendukung fungsi yang lebih rumit seperti connection pooling 1 dan transaksi terdistribusi. Berbeda dengan DriverManager, DataSource
memiliki properti yang mengidentifikasikan dan mendeskripsikan data
source yang direpresentasikannya, sehingga meningkatkan portabilitas data source tanpa perlu melakukan perubahan pada kode yang mengakses data source tersebut. Dari properti yang telah di-set, DataSource akan membentuk JDBC URL yang terdiri dari serverName, portNumber, dan databaseName. JDBC URL tersebut, bersama dengan user dan password, akan digunakan sebagai parameter method connect dari JDBC driver.
Penggunaan
pada
DataSource
MySQL
dilakukan
pertama
kali
dengan
menginstansiasi kelas com.mysql.jdbc.jdbc2.optional.MysqlDataSource , lalu memanggil
method
setServerName
untuk
menspesifikasikan
properti data
source
seperti
dan setDatabaseName. Koneksi akan dibentuk setelah pemanggilan
method getConnection yang menerima parameter username dan password dan mengembalikan objek Connection. // connection to MySQL using DataSource com.mysql.jdbc.jdbc2.optional.MysqlDataSource ds; Connection conn; ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource(); ds.setServerName(“hostname”); ds.setDatabaseName(“databasename”); conn = ds.getConnection(“username”, “password”);
Kode II-3 Pembentukan koneksi ke MySQL dengan DataSource
Tabel II-2 Properti standar data source Nama properti databaseName
Tipe String
Deskripsi nama database nama lojik yang digunakan pada
dataSourceName
String
implementasi connection pooling atau transaksi terdistribusi
1
Connection pooling merupakan mekanis me manajemen seju mlah koneksi yang memungkin kan suatu koneksi yang sedang idle dimanfaatkan oleh thread yang memerlu kan.
II-14
Nama properti
Tipe
description
String
networkProtocol
String
Deskripsi deskripsi data source protokol network yang digunakan untuk berkomunikasi dengan server
password
String
portNumber
int
password user nomor port yang digunakan server untuk menangani request koneksi
roleName
String
nama role
serverName
String
nama database server
user
String
nama user
Konfigurasi objek Connection dapat dilakukan melalui method yang tersedia, seperti setAutoCommit
atau setTransactionIsolation. Aktifnya mode autocommit dari
objek Connection akan mengakibatkan setiap statement SQL dieksekusi dan dicommit seakan-akan sebuah transaksi individual. Sebaliknya, pada objek Connection yang tidak autocommit, seluruh statement SQL pada konteks tersebut dianggap sebagai sebuah transaksi yang hanya akan berakhir setelah pemanggilan method commit
atau method rollback. Method commit akan menjadikan seluruh perubahan
pada konteks tersebut menjadi permanen, sedangkan method rollback akan membatalkan seluruh perubahan. Kedua method tersebut akan melepaskan lock terhadap database yang digunakan oleh objek Connection terkait.
2.3.4 Session Eksekusi statement SQL terhadap database hanya bisa dilakukan dalam suatu session. Oleh karena itu, user perlu membuka session dari suatu koneksi yang telah terbentuk dengan cara melakukan login ke database. JDBC merepresentasikan koneksi dan session sebagai objek Connection, yang didapat dengan memanggil method getConnection.
Setelah user memperoleh objek Connection, maka secara otomatis
session untuk user tersebut telah terbentuk. Session dapat diakhiri secara manual oleh user dengan melakukan logout atau oleh DBMS ketika telah melampaui timeout.
II-15
Setelah terbentuk session atas nama suatu user, user tersebut dapat mengirimkan statement SQL ke database dengan menggunakan salah satu dari tiga interface berikut: 1.
Statement,
dihidupkan dengan method Connection.createStatement .
Objek Statement digunakan untuk mengirim statement SQL tanpa parameter. 2.
PreparedStatement,
dihidupkan
Connection.prepareStatement .
dengan
method
Objek PreparedStatement digunakan
untuk statement SQL yang precompiled. 3.
CallableStatement,
Objek
dihidupkan dengan method Connection.prepareCall.
CallableStatement
digunakan
untuk
mengeksekusi
stored
procedures. Untuk setiap session umumnya DBMS akan menyimpan data terkait transaksi, database yang digunakan, koneksi, lock terhadap data, dan query. MySQL menyimpan data tersebut pada objek THD.
2.4 Interaksi
MySQL
Connector/J
dan
MySQL
pada
Pembentukan Koneksi
JDBC4C onnection
My sqlIO
my sqld
sql_parse
1 : handle_con nection s_sockets ()
2 : createN ewIO () <
> 3 : My sqlIO ()
Hands hake
7 : doH andshake
Initialization Packet
4 : create_new _thread 5 : handle_one_connectio n() 6 : check_con nection
Client Authentication Packet
8 : check_user
Gambar II-4 Interaksi MySQL Connector/J dan MySQL pada pembentukan koneksi
II-16
Pembentukan koneksi ke database MySQL melalui MySQL Connector/J dilakukan melalui mekanisme berikut. 1.
Program utama MySQL server yaitu mysqld handle_connections_socket
mengeksekusi fungsi
untuk menangani pembentukan koneksi dari
client. 2.
Objek
dari
Connection
MySQL
Connector/J
membentuk
channel
Input/Output ke MySQL server melalui pemanggilan method createNewIO. 3.
Method createNewIO menghidupkan objek MysqlIO yang bertanggung jawab terhadap pembentukan koneksi TCP melalui java.net.Socket.
4.
Setelah mendeteksi adanya koneksi dari client, MySQL server akan menyediakan sebuah thread untuk menangani koneksi tersebut dengan memanggil fungsi create_new_thread. Setiap koneksi yang telah terbentuk selanjutnya akan ditangani oleh fungsi handle_one_connection.
5.
Fungsi
handle_one_connection
check_connection
akan
mengeksekusi
fungsi
yang bertugas melakukan handshaking dan otentikasi
koneksi dari client. 6.
Pada fungsi check_connection,
MySQL server akan
mengirimkan
Handshake Initialization Packet ke client sebagai identifikasi server. 7.
Objek Connection akan memanggil method doHandshake untuk menerima Handshake Initialization Packet dari server dan mengirimkan Client Authentication Packet ke server.
8.
Setelah MySQL server menerima Client Authentication Packet, akan dilakukan parsing terhadap paket tersebut dan otentikasi client dengan mengeksekusi fungsi check_user.
9.
Koneksi yang berhasil diotentikasi selanjutnya siap digunakan untuk mengirimkan perintah ke database.
Tabel II-3 Body dari Handshake Initialization Packet Bytes
Nama
Deskripsi Versi protokol, diambil dari
1
protocol_version
PROTOCOL_VERSION
pada
/include/mysql_version.h .
II-17
Bytes
Nama
Deskripsi Versi MySQL server, diambil dari
n (null
server_version
terminated)
MYSQL_SERVER_VERSION
pada
/include/mysql_version.h ,
diakhiri
dengan byte 0x00. 4
thread_number
8
scramble_buff
1
(filler) always 0x00
Id dari thread server yang menangani koneksi ini. Bagian pertama dari salt yang digunakan pada mekanisme enkripsi password. Kapabilitas server, diambil dari /include/mysql_com.h, meliputi
2
server_capabilities
1
server_language
CLIENT_LONG_PASSWORD, CLIENT_FOUND_ROWS, CLIENT_LONG_FLAG, CLIENT_CONNECT_WITH_DB, CLIENT_NO_SCHEMA, CLIENT_COMPRESS, CLIENT_ODBC, CLIENT_LOCAL_FILES, CLIENT_IGNORE_SPACE, CLIENT_PROTOCOL_41, CLIENT_INTERACTIVE, CLIENT_SSL, CLIENT_IGNORE_SIGPIPE, CLIENT_TRANSACTIONS, CLIENT_RESERVED, CLIENT_SECURE_CONNECTION, CLIENT_MULTI_STATEMENTS, dan CLIENT_MULTI_RESULTS.
Character set yang digunakan. Status autocommit server, meliputi
server_status
2
SERVER_STATUS_IN_TRANS
dan
SERVER_STATUS_AUTOCOMMIT .
13
(filler) always 0x00
-
13
rest of scramble_buff
Bagian terakhir dari salt.
Tabel II-4 Body dari Client Authentication Packet Bytes
Nama
Deskripsi Kapabilitas server yang ingin digunakan
4
client_flags
oleh client, meliputi server_capabilities
Initialization Packet.
pada Handshake
II-18
Bytes
Nama
Deskripsi Jumlah byte maksimum dalam setiap
4
max_packet_size
1
charset_number
Character set yang digunakan.
23
(filler) always 0x00
-
paket untuk client.
n (null
Identifikasi, maksimal 16 byte, diakhiri
user
terminated)
dengan byte 0x00.
(1 + x)
scramble_buff
1
(filler) always 0x00
Password yang telah dienkripsi dengan salt dari server (opsional). Nama database yang akan digunakan
y (null
databasename
(opsional), maksimal 64 byte, diakhiri
terminated)
dengan byte 0x00.
2.4.1 Implementasi Pembentukan Koneksi pada MySQL Connector/J Pada MySQL Connector/J yang merupakan connector untuk program Java ke database MySQL, mekanisme pembentukan koneksi secara garis besar adalah sebagai berikut. 1.
Kelas com.mysql.jdbc.Driver akan memanggil method connect untuk menginstansiasi
kelas
com.mysql.jdbc.ConnectionImpl
yang
merepresentasikan koneksi ke MySQL server. 2.
Pada instansiasi tersebut, dilakukan pula instansiasi kelas turunannya, yaitu com.mysql.jdbc.JDBC4Connection .
Kelas ini mencakup fitur tambahan
yang disediakan oleh JDBC 4.0. 3.
Selanjutnya dilakukan pembentukan koneksi TCP ke MySQL server oleh kelas com.mysql.jdbc.MysqlIO. Kelas ini juga menangani handshaking antara client dan MySQL server, dengan menerima Handshake Initialization Packet dari MySQL server dan merespon dengan Client Authentication Packet.
II-19
Penjelasan mekanisme pembentukan koneksi pada MySQL Connector/J secara detil terdapat pada lampiran B.
2.4.2 Penanganan Koneksi pada MySQL Penanganan koneksi dari client pada MySQL dilakukan oleh program utama yang bernama mysqld. Mekanisme penanganan koneksi tersebut secara garis besar adalah sebagai berikut. 1.
Program utama melakukan initial check, menginisialisasi komponen, melakukan listen di port yang ditentukan, serta menunggu koneksi dari client.
2.
Setiap mendeteksi koneksi dari client, akan dibuat thread baru dan objek THD yang akan mengelola informasi mengenai thread tersebut.
3.
Selanjutnya dilakukan
handshaking
dengan
mengirimkan
Handshake
Initialization Packet dan otorisasi client dengan membaca respon dari client berupa Client Authentication Packet. 4.
Setelah handshaking berhasil, akan dilakukan pemeriksaan user dan password yang diberikan oleh client.
Penjelasan mekanisme penanganan koneksi oleh MySQL secara detil terdapat pada lampiran C.