7.1 Kumpulan koneksi

Hari ini kita akan belajar bagaimana bekerja dengan database secara lebih profesional. Dan sekarang kita akan berbicara tentang kumpulan utas, atau kumpulan koneksi dalam bahasa Inggris.

Menghubungkan ke database membutuhkan waktu. Apalagi jika basis datanya jauh. Jika kita membuat koneksi ke database untuk setiap permintaan, maka respons aplikasi kita akan sangat lambat. Belum lagi sumber daya yang akan dikonsumsinya.

Sebagai solusi untuk masalah seperti itu, diusulkan untuk menyimpan koneksi ke basis dalam beberapa set, yang disebut kumpulan utas.

Saat kami meminta koneksi baru, kumpulan koneksi membuatnya, dan ketika ditutup, itu tidak menutupnya, tetapi menyimpannya di kumpulan koneksi. Dan jika kami meminta koneksi dari kumpulan koneksi lagi, itu akan memberi kami salah satu yang lama alih-alih membuat yang baru.

Faktanya, aplikasi bekerja melalui driver khusus, yang merupakan pembungkus driver JDBC biasa dan yang memiliki fungsi tambahan untuk bekerja dengan kumpulan. Situasi ini dapat direpresentasikan sebagai berikut:

kolam koneksi

Pemrogram dapat mengatur pengaturan untuk kumpulan koneksi secara manual: jumlah koneksi aktif, batas waktu, dll.

Untuk situasi yang sangat ekstrem, Anda dapat menulis kumpulan koneksi Anda sendiri: kelas yang akan memiliki daftar koneksi. Ini akan mengesampingkan fungsi tutup, yang akan mengembalikan koneksi kembali ke daftar, dan akan ada banyak hal lain seperti pengatur waktu koneksi terbuka. Ketika tidak ada koneksi untuk waktu yang lama, koneksi ditutup.

7.2* Antarmuka DataSource dan ConnectionPoolDataSource

Kumpulan utas biasanya bekerja bersama-sama dengan objek DataSource. Objek ini dapat dianggap sebagai abstraksi dari basis data jarak jauh. Nama Sumber Data dapat secara harfiah diterjemahkan sebagai Sumber Data. Yang agak mengisyaratkan.

Objek DataSource digunakan untuk mendapatkan koneksi fisik ke database dan merupakan alternatif dari DriverManager. Tidak perlu mendaftarkan driver JDBC. Anda hanya perlu mengatur parameter yang sesuai untuk membuat koneksi danjalankan metode getConnection().

Saat membuat objek bertipe DataSource secara lokal (langsung di aplikasi), parameter koneksi diatur dengan metode yang sesuai yang disediakan oleh penyedia driver JDBC. Metode ini tidak ditentukan oleh antarmuka DataSource, karena parameter untuk menghubungkan ke DBMS dari vendor yang berbeda mungkin berbeda baik dalam jenis maupun jumlahnya (misalnya, tidak semua DBMS memerlukan jenis driver atau protokol jaringan untuk ditentukan).

Jadi, saat bekerja dengan Oracle DBMS, untuk menggunakan metode set dan get yang sesuai, Anda perlu mendapatkan objek bertipe OracleDataSource, yang merupakan turunan dari kelas dengan nama yang sama yang mengimplementasikan antarmuka DataSource. Oleh karena itu, cara membuat objek bertipe DataSource ini membuat kode Anda kurang portabel dan kurang bergantung pada implementasi spesifik driver.

Berikut ini adalah contoh kode yang mengilustrasikan penggunaan lokal objek bertipe DataSource.

import java.sql.*;
import javax.sql.*;
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DataSource {
    public static void main(String[] args) {
    	try {
        	OracleDataSource ods = new OracleDataSource();

        	ods.setUser("root");
        	ods.setPassword("secret");
        	ods.setDriverType("thin");
        	ods.setDatabaseName("test");
        	ods.setServerName("localhost");
        	ods.setPortNumber(1521);

        	Connection connection = ods.getConnection();
        	System.out.println("Connection successful!!!");

    	} catch (SQLException se) {
        	se.printStackTrace();
    	}
    	System.out.println("Goodbye!");
	}
}

7.3* Antarmuka JNDI

Kemampuan penuh objek bertipe DataSource dimanifestasikan dalam kombinasi dengan penggunaan antarmuka JNDI. JNDI adalah layanan khusus (seperti direktori) untuk aplikasi server besar yang memungkinkan satu layanan membuat koneksi dengan yang lain.

Menggunakan layanan nama dan direktori memungkinkan Anda untuk menyimpan objek dari tipe DataSource yang sebelumnya dibuat oleh administrator sistem dengan parameter koneksi yang telah ditentukan sebelumnya. Berikut ini adalah beberapa nama properti standar (parameter) yang dikembangkan oleh Sun:

Nama properti tipe data jawa Tujuan
namadatabase Rangkaian Nama basis data
nama server Rangkaian Nama server
pengguna Rangkaian Nama pengguna / ID)
kata sandi Rangkaian Kata sandi pengguna
portNumber int nomor port server DBMS

Kombinasi antarmuka DataSource dan JNDI memainkan peran kunci dalam pengembangan aplikasi perusahaan multi-tier berdasarkan teknologi komponen J2EE.

Jika Anda menggunakan kombinasi antarmuka DataSource dan JNDI dalam kode aplikasi, Anda hanya perlu meminta objek bertipe DataSource dari layanan penamaan dan direktori. Dalam hal ini, detail koneksi dan kode program yang bergantung pada implementasi driver tertentu disembunyikan dari aplikasi di objek yang disimpan dalam nama dan layanan direktori.

Dengan demikian, berbagi objek bertipe DataSource dan JNDI melibatkan dua langkah yang dilakukan secara independen satu sama lain:

  1. Anda harus menyimpan objek bernama dari tipe DataSource di layanan penamaan dan direktori menggunakan Context.bind().javax.naming
  2. Minta objek bertipe DataSource dari layanan penamaan dan direktori dalam aplikasi menggunakan Context.lookup(). Setelah itu, Anda dapat menggunakan metodenya DataSource.getConnection()untuk mendapatkan koneksi ke database.

Berikut ini adalah contoh penggunaan antarmuka JNDI dan objek bertipe OracleDataSource secara bersamaan.

// Create a key JNDI object
Hashtable env = new Hashtable();
env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put (Context.PROVIDER_URL, "file:JNDI");
Context ctx = new InitialContext(env);

// Get the DataSource object by its name
DataSource ods = (DataSource) ctx.lookup("myDatabase");

// Get the Connection from the DataSource object
Connection connection = ods.getConnection();
System.out.println("Connection successful!!!");

Kami tidak akan menganalisis karya JNDI. Ini di luar ruang lingkup kursus ini. Saya hanya ingin Anda tahu bahwa pendekatan ini sangat umum dalam aplikasi besar. Jangan tersesat jika Anda melihat kode seperti ini di masa mendatang.

Tidak peduli bagaimana cara kerjanya. Anda hanya perlu tahu bahwa dengan layanan JNDI Anda bisa mendapatkan objek proxy dari layanan apa pun yang terdaftar di direktori layanan. Inilah cara Anda mendapatkan objek DataSource dan menggunakannya untuk bekerja dengan database.

7.4 Contoh Pool Koneksi

Mari kita kembali ke tempat kita memulai - kumpulan koneksi.

Pemrogram Java dalam programnya sangat sering menggunakan pustaka yang berisi berbagai implementasi kumpulan koneksi. Di antara mereka ada tiga yang paling populer:

  • Apache Commons DBCP
  • C3PO
  • HikariCP

Proyek Apache adalah yang pertama membuat kumpulan koneksi yang baik, itu juga digunakan di dalam server web Tomcat. Contoh bekerja dengannya:

public class DBCPDataSource {

    private static BasicDataSource ds = new BasicDataSource();
    static {
    	ds.setUrl("jdbc:h2:mem:test");
    	ds.setUsername("user");
    	ds.setPassword("password");
    	ds.setMinIdle(5);
    	ds.setMaxIdle(10);
    	ds.setMaxOpenPreparedStatements(100);
    }

    public static Connection getConnection() throws SQLException {
    	return ds.getConnection();
    }

    private DBCPDataSource(){ }
}

Kumpulan kedua yang sangat populer adalah C3PO . Nama yang aneh, saya setuju. Nama C3PO mengacu pada robot c3po dari Star Wars. Dan juga CP adalah kependekan dari Connection Pool.

public class C3p0DataSource {

    private static ComboPooledDataSource cpds = new ComboPooledDataSource();
    static {
    	try {
        	cpds.setDriverClass("org.h2.Driver");
        	cpds.setJdbcUrl("jdbc:h2:mem:test");
        	cpds.setUser("user");
        	cpds.setPassword("password");
    	} catch (PropertyVetoException e) {
            // handle the exception
    	}
    }

    public static Connection getConnection() throws SQLException {
    	return cpds.getConnection();
    }

    private C3p0DataSource(){}
}

Dokumentasi untuk itu dapat ditemukan di halaman resmi .

Dan terakhir, Connection Pool paling populer saat ini adalah HikariCP :

public class HikariCPDataSource {

    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
    	config.setJdbcUrl("jdbc:h2:mem:test");
    	config.setUsername("user");
    	config.setPassword("password");
    	config.addDataSourceProperty("cachePrepStmts", "true");
    	config.addDataSourceProperty("prepStmtCacheSize", "250");
    	config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
    	ds = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
    	return ds.getConnection();
    }

    private HikariCPDataSource(){}
}

Berikut adalah halaman GitHub resminya .

Dan artikel bagus tentang konfigurasi.