7.1 Kolam sambungan

Dina iki kita bakal sinau carane nggarap database malah luwih profesional. Lan saiki kita bakal ngomong babagan kolam benang, utawa kolam sambungan ing basa Inggris.

Nyambung menyang database njupuk sawetara wektu. Utamane yen database adoh. Yen kita nggawe sambungan menyang database kanggo saben panyuwunan, mula respon aplikasi kita bakal cepet banget. Ora kanggo sebutno sumber daya sing bakal digunakake.

Minangka solusi kanggo masalah kasebut, diusulake kanggo nyimpen sambungan menyang pangkalan ing sawetara set, sing diarani blumbang benang.

Nalika kita njaluk sambungan anyar, blumbang sambungan nggawe, lan nalika ditutup, iku ora nutup, nanging nyimpen ing blumbang sambungan. Lan yen kita njaluk sambungan saka blumbang sambungan maneh, iku bakal menehi kita siji saka lawas tinimbang nggawe anyar.

Nyatane, aplikasi kasebut bisa digunakake liwat driver khusus, yaiku bungkus kanggo driver JDBC biasa lan duwe fungsi tambahan kanggo nggarap kolam renang. Kahanan iki bisa diwakili kaya ing ngisor iki:

blumbang sambungan

Programmer bisa nyetel setelan kanggo blumbang sambungan kanthi manual: jumlah sambungan aktif, wektu entek, etc.

Kanggo kahanan utamané nemen, sampeyan bisa nulis blumbang sambungan dhewe: kelas sing bakal duwe dhaptar sambungan. Bakal ngilangi fungsi cedhak, sing bakal bali sambungan bali menyang dhaptar, lan bakal ana akeh barang liyane kaya timer sambungan mbukak. Nalika ora ana sambungan kanggo dangu, sambungan ditutup.

7.2* Antarmuka DataSource lan ConnectionPoolDataSource

Kolam benang biasane dianggo bebarengan karo obyek DataSource. Objek iki bisa dianggep minangka abstraksi saka database remot. Jeneng Sumber Data bisa diterjemahake kanthi harfiah minangka Sumber Data. Kang jenis hinting.

Objek DataSource digunakake kanggo entuk sambungan fisik menyang database lan minangka alternatif kanggo DriverManager. Ora perlu ndhaptar driver JDBC. Sampeyan mung kudu nyetel paramèter cocok kanggo netepake sambungan lannglakokake metode getConnection()..

Nalika nggawe obyek saka jinis DataSource sacara lokal (langsung ing aplikasi), paramèter sambungan disetel kanthi cara sing cocog sing diwenehake dening panyedhiya driver JDBC. Cara kasebut ora ditetepake dening antarmuka DataSource, amarga paramèter kanggo nyambungake menyang DBMS saka vendor sing beda-beda bisa uga beda-beda ing jinis lan nomer (contone, ora kabeh DBMS mbutuhake jinis driver utawa protokol jaringan sing bakal ditemtokake).

Mangkono, nalika nggarap Oracle DBMS, kanggo nggunakake pesawat sing cocog lan njaluk cara, iku perlu kanggo njupuk obyek saka jinis OracleDataSource, kang minangka conto saka kelas jeneng sing padha ngleksanakake antarmuka DataSource. Mulane, cara iki nggawe obyek saka jinis DataSource ndadekake kode kurang portabel lan kurang gumantung ing implementasine tartamtu saka driver.

Ing ngisor iki minangka conto kode sing nggambarake panggunaan lokal obyek saka jinis 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

Kapabilitas lengkap obyek saka jinis DataSource diwujudake kanthi kombinasi nggunakake antarmuka JNDI. JNDI minangka layanan khusus (kaya direktori) kanggo aplikasi server gedhe sing ngidini siji layanan nggawe sambungan karo liyane.

Nggunakake layanan jeneng lan direktori ngidini sampeyan nyimpen obyek saka jinis DataSource sing sadurunge digawe dening administrator sistem kanthi paramèter sambungan sing wis ditemtokake. Ing ngisor iki sawetara jeneng properti standar (parameter) sing dikembangake dening Sun:

Jeneng properti Tipe data Jawa tujuane
databaseName String Jeneng database
serverName String Jeneng server
panganggo String Jeneng pangguna (ID)
sandi String Sandi panganggo
portNumber int Nomer port server DBMS

Kombinasi antarmuka DataSource lan JNDI nduweni peran penting ing pangembangan aplikasi perusahaan multi-tier adhedhasar teknologi komponen J2EE.

Yen sampeyan nggunakake kombinasi antarmuka DataSource lan JNDI ing kode aplikasi, sampeyan mung kudu njaluk obyek saka jinis DataSource saka layanan jeneng lan direktori. Ing kasus iki, rincian sambungan lan kode program gumantung ing implementasine tartamtu saka driver didhelikake saka aplikasi ing obyek sing disimpen ing jeneng lan layanan direktori.

Dadi, nuduhake obyek saka jinis DataSource lan JNDI kalebu rong langkah sing ditindakake kanthi mandiri:

  1. Sampeyan kudu nyimpen obyek sing dijenengi saka jinis DataSource ing layanan jeneng lan direktori nggunakake Context.bind()file javax.naming.
  2. Nyuwun obyek saka jinis DataSource saka layanan jeneng lan direktori ing aplikasi nggunakake file Context.lookup(). Sawise iku, sampeyan bisa nggunakake cara DataSource.getConnection()kanggo njaluk sambungan menyang database.

Ing ngisor iki minangka conto nggunakake antarmuka JNDI lan obyek saka jinis OracleDataSource bebarengan.

// 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!!!");

Kita ora bakal nganalisa karya JNDI. Iki ana ing njaba ruang lingkup kursus iki. Aku mung pengin sampeyan ngerti yen pendekatan iki umum banget ing aplikasi gedhe. Aja kesasar yen sampeyan ndeleng kode kaya iki ing mangsa ngarep.

Ora ketompo carane kerjane. Sampeyan mung kudu ngerti manawa kanthi layanan JNDI sampeyan bisa entuk obyek proxy saka layanan apa wae sing didaftar ing direktori layanan. Iki carane sampeyan entuk obyek DataSource lan digunakake kanggo nggarap database.

7.4 Conto Kolam Sambungan

Ayo bali menyang ngendi kita miwiti - pools sambungan.

Programer Java ing program kasebut asring banget nggunakake perpustakaan sing ngemot macem-macem implementasi pools sambungan. Antarane wong-wong mau ana telung paling populer:

  • Apache Commons DBCP
  • C3PO
  • HikariCP

Proyek Apache minangka sing pisanan nggawe kolam sambungan sing apik, uga digunakake ing server web Tomcat. Conto nggarap:

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(){ }
}

Kolam renang nomer loro sing paling populer yaiku C3PO . Jeneng-jeneng aneh, aku setuju. Jeneng C3PO minangka referensi kanggo robot c3po saka Star Wars. Lan uga CP cendhak kanggo 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 bisa ditemokake ing kaca resmi .

Lan pungkasane, Kolam Sambungan sing paling populer ing jaman saiki yaiku 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(){}
}

Punika kaca GitHub resminipun .

Lan artikel apik babagan konfigurasi.