7.1 Kolam sambungan

Hari ini kita akan belajar cara bekerja dengan pangkalan data dengan lebih profesional. Dan sekarang kita akan bercakap tentang kumpulan benang, atau kumpulan sambungan dalam bahasa Inggeris.

Menyambung ke pangkalan data mengambil sedikit masa. Terutama jika pangkalan data adalah jauh. Jika kami membuat sambungan ke pangkalan data untuk setiap permintaan, maka respons aplikasi kami akan menjadi sangat perlahan dalam kelajuan. Belum lagi sumber yang akan digunakan.

Sebagai penyelesaian kepada masalah sedemikian, adalah dicadangkan untuk menyimpan sambungan ke pangkalan dalam beberapa set, yang dipanggil kolam benang.

Apabila kami meminta sambungan baharu, kolam sambungan menciptanya, dan apabila ditutup, ia tidak menutupnya, tetapi menyimpannya dalam kolam sambungan. Dan jika kami meminta sambungan daripada kumpulan sambungan sekali lagi, ia akan memberikan kami salah satu daripada yang lama dan bukannya mencipta yang baharu.

Malah, aplikasi ini berfungsi melalui pemandu khas, yang merupakan pembalut untuk pemandu JDBC biasa dan yang mempunyai fungsi tambahan untuk bekerja dengan kolam. Keadaan ini boleh diwakili seperti berikut:

kolam sambungan

Pengaturcara boleh menetapkan tetapan untuk kumpulan sambungan secara manual: bilangan sambungan aktif, tamat masa, dsb.

Untuk situasi yang melampau, anda boleh menulis kumpulan sambungan anda sendiri: kelas yang akan mempunyai senarai sambungan. Ia akan mengatasi fungsi tutup, yang akan mengembalikan sambungan kembali ke senarai, dan akan terdapat banyak barang lain seperti pemasa sambungan terbuka. Apabila tiada sambungan untuk masa yang lama, sambungan ditutup.

7.2* Sumber Data Antara Muka dan ConnectionPoolDataSource

Kolam benang biasanya berfungsi seiring dengan objek DataSource. Objek ini boleh dianggap sebagai abstraksi pangkalan data jauh. Nama Sumber Data boleh diterjemahkan secara literal sebagai Sumber Data. Yang semacam membayangkan.

Objek DataSource digunakan untuk mendapatkan sambungan fizikal ke pangkalan data dan merupakan alternatif kepada DriverManager. Tidak perlu mendaftarkan pemandu JDBC. Anda hanya perlu menetapkan parameter yang sesuai untuk mewujudkan sambungan danlaksanakan kaedah getConnection()..

Apabila mencipta objek jenis DataSource secara setempat (secara langsung dalam aplikasi), parameter sambungan ditetapkan oleh kaedah yang sesuai yang disediakan oleh pembekal pemacu JDBC. Kaedah ini tidak ditakrifkan oleh antara muka DataSource, kerana parameter untuk menyambung ke DBMS daripada vendor berbeza mungkin berbeza dari segi jenis dan nombor (contohnya, tidak semua DBMS memerlukan jenis pemacu atau protokol rangkaian untuk ditentukan).

Oleh itu, apabila bekerja dengan Oracle DBMS, untuk menggunakan set yang sepadan dan mendapatkan kaedah, adalah perlu untuk mendapatkan objek jenis OracleDataSource, yang merupakan contoh kelas dengan nama yang sama yang melaksanakan antara muka DataSource. Oleh itu, cara mencipta objek jenis DataSource ini menjadikan kod anda kurang mudah alih dan kurang bergantung pada pelaksanaan khusus pemacu.

Berikut ialah contoh kod yang menggambarkan penggunaan tempatan objek jenis 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* Antara Muka JNDI

Keupayaan penuh objek jenis DataSource ditunjukkan dalam kombinasi dengan penggunaan antara muka JNDI. JNDI ialah perkhidmatan khas (sesuatu seperti direktori) untuk aplikasi pelayan besar yang membolehkan satu perkhidmatan mewujudkan sambungan dengan yang lain.

Menggunakan perkhidmatan nama dan direktori membolehkan anda menyimpan objek jenis DataSource yang sebelum ini dibuat oleh pentadbir sistem dengan parameter sambungan yang telah ditetapkan. Berikut ialah beberapa nama sifat (parameter) standard yang dibangunkan oleh Sun:

Nama harta Jenis data Java Tujuan
Nama pangkalan data Tali Nama pangkalan data
nama pelayan Tali Nama pelayan
pengguna Tali Nama pengguna (ID)
kata laluan Tali Kata laluan pengguna
portNombor int Nombor port pelayan DBMS

Gabungan antara muka DataSource dan JNDI memainkan peranan penting dalam pembangunan aplikasi perusahaan berbilang peringkat berdasarkan teknologi komponen J2EE.

Jika anda menggunakan gabungan antara muka DataSource dan JNDI dalam kod aplikasi anda, anda hanya perlu meminta objek jenis DataSource daripada perkhidmatan penamaan dan direktori. Dalam kes ini, butiran sambungan dan kod program yang bergantung pada pelaksanaan tertentu pemacu disembunyikan daripada aplikasi dalam objek yang disimpan dalam nama dan perkhidmatan direktori.

Oleh itu, perkongsian objek jenis DataSource dan JNDI melibatkan dua langkah yang dilakukan secara berasingan antara satu sama lain:

  1. Anda mesti menyimpan objek bernama jenis DataSource dalam perkhidmatan penamaan dan direktori menggunakan Context.bind().javax.naming
  2. Minta objek jenis DataSource daripada perkhidmatan penamaan dan direktori dalam aplikasi menggunakan Context.lookup(). Selepas itu, anda boleh menggunakan kaedahnya DataSource.getConnection()untuk mendapatkan sambungan ke pangkalan data.

Berikut ialah contoh penggunaan antara muka JNDI dan objek jenis OracleDataSource bersama-sama.

// 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 kerja JNDI. Ini adalah di luar skop kursus ini. Saya hanya mahu anda tahu bahawa pendekatan ini sangat biasa dalam aplikasi besar. Jangan tersesat jika anda melihat kod seperti ini pada masa hadapan.

Tidak kira bagaimana ia berfungsi. Anda hanya perlu tahu bahawa dengan perkhidmatan JNDI anda boleh mendapatkan objek proksi mana-mana perkhidmatan yang didaftarkan dalam direktori perkhidmatan. Beginilah cara anda mendapatkan objek DataSource dan menggunakannya untuk berfungsi dengan pangkalan data.

7.4 Contoh Kolam Sambungan

Mari kita kembali ke tempat kita bermula - kumpulan sambungan.

Pengaturcara Java dalam program mereka sangat kerap menggunakan perpustakaan yang mengandungi pelbagai pelaksanaan kumpulan sambungan. Di antara mereka terdapat tiga yang paling popular:

  • Apache Commons DBCP
  • C3PO
  • HikariCP

Projek Apache adalah yang pertama mencipta kolam sambungan yang baik, ia juga digunakan di dalam pelayan 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(){ }
}

Kolam kedua yang sangat popular ialah C3PO . Nama pelik, saya setuju. Nama C3PO adalah merujuk kepada robot c3po dari Star Wars. Dan juga CP adalah singkatan untuk 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 untuknya boleh didapati di halaman rasmi .

Dan akhirnya, Kolam Sambungan yang paling popular pada zaman kita ialah 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 ialah halaman GitHub rasminya .

Dan artikel yang bagus tentang konfigurasi.