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 JDBC- ODBC 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, biasanya digunakan method com.mysql.jdbc.drivermanager.getconnection. 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] subprotocol host Komponen Tabel II-1 Komponen JDBC URL Fungsi menspesifikasikan nama driver atau nama mekanisme konektivitas database menspesifikasikan nama host (localhost jika server berada pada komputer lokal)
II-12 Komponen failoverhost :port /database?propertyname1=propertyvalue1 &propertiname2=propertyvalue2 Fungsi menspesifikasikan nama host opsional yang akan digunakan jika koneksi ke host sebelumnya tidak berhasil menspesifikasikan nomor port (port default adalah 3306) 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 allowmultiqueries, usessl; terkait performansi seperti metadatacachesize, usefastintparsing; terkait debugging dan profiling seperti logger, maxquerysizetolog; atau lainnya seperti useunicode, maxrows. Seluruh parameter opsional beserta nilai default-nya dilampirkan di lampiran A. 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 DataSource pada MySQL dilakukan pertama kali dengan menginstansiasi kelas com.mysql.jdbc.jdbc2.optional.mysqldatasource, lalu memanggil method untuk menspesifikasikan properti data source seperti setservername 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 Tipe Deskripsi databasename String nama database datasourcename String nama lojik yang digunakan pada implementasi connection pooling atau transaksi terdistribusi 1 Connection pooling merupakan mekanis me manajemen sejumlah koneksi yang memungkinkan suatu koneksi yang sedang idle dimanfaatkan oleh thread yang memerlukan.
II-14 Nama properti Tipe Deskripsi description String deskripsi data source networkprotocol String password String password user portnumber int protokol network yang digunakan untuk berkomunikasi dengan server 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 dengan method Connection.prepareStatement. Objek PreparedStatement digunakan untuk statement SQL yang precompiled. 3. CallableStatement, dihidupkan dengan method Connection.prepareCall. Objek 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 2 : createnewio () 1 : handle_connections_sockets() <<create>> 3 : My sqlio () 7 : dohandshake Hands hake Initialization Packet Client Authentication 4 : create_new _thread 5 : handle_one_connection() 6 : check_connection 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 mengeksekusi fungsi handle_connections_socket untuk menangani pembentukan koneksi dari client. 2. Objek Connection dari 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 akan mengeksekusi fungsi check_connection 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 n (null terminated) server_version 4 thread_number 8 scramble_buff 1 (filler) always 0x00 - Versi MySQL server, diambil dari MYSQL_SERVER_VERSION pada /include/mysql_version.h, diakhiri dengan byte 0x00. Id dari thread server yang menangani koneksi ini. Bagian pertama dari salt yang digunakan pada mekanisme enkripsi password. 2 server_capabilities Kapabilitas server, diambil dari /include/mysql_com.h, meliputi 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. 1 server_language Character set yang digunakan. 2 server_status 13 (filler) always 0x00 - Status autocommit server, meliputi SERVER_STATUS_IN_TRANS dan SERVER_STATUS_AUTOCOMMIT. 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 pada Handshake Initialization Packet.
II-18 Bytes Nama Deskripsi 4 max_packet_size Jumlah byte maksimum dalam setiap paket untuk client. 1 charset_number Character set yang digunakan. 23 (filler) always 0x00 - n (null terminated) user (1 + x) scramble_buff 1 (filler) always 0x00 - y (null terminated) databasename Identifikasi, maksimal 16 byte, diakhiri dengan byte 0x00. Password yang telah dienkripsi dengan salt dari server (opsional). Nama database yang akan digunakan (opsional), maksimal 64 byte, diakhiri 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.