1. Apa itu kumpulan koneksi JDBC?
Dalam koneksi JDBC tradisional, setiap kali Anda mendapatkan koneksi koneksi, Anda perlu memuat beberapa kode rumit untuk diperoleh, seperti kode berikut:
Public Static Connection getConn () {Connection conn = null; String url = "jdbc: mysql: // localhost: 3306/test"; String user = "root"; String password = "root"; coba {class.forname ("com.mysql.jdbc.driver"); conn = driverManager.getConnection (url, pengguna, kata sandi); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; }Operasi rumit seperti itu hanya untuk mendapatkan koneksi. Tentu saja, kita dapat merangkumnya ke dalam kelas alat untuk mengakses (gambar di atas merangkum koneksi koneksi), tetapi apakah itu buang -buang kinerja untuk memuat setiap koneksi? Untuk mengoptimalkan kinerja, kumpulan koneksi muncul.
Ketika kumpulan koneksi diinisialisasi, beberapa koneksi dibuat untuk kami gunakan. Ketika kita perlu terhubung, kita hanya perlu mendapatkan koneksi yang ada dari kumpulan koneksi. Ketika tidak ada koneksi yang diinisialisasi, koneksi akan diciptakan kembali. Setelah menggunakan koneksi, koneksi tidak akan dihancurkan, tetapi akan dikembalikan ke kumpulan koneksi untuk digunakan nanti. (Tentu saja, pengumpulan koneksi bukan hanya sederhana, berikut adalah perkenalannya)
Kolam koneksi yang umum digunakan termasuk DBCP dan C3P0. Yang paling utama sekarang adalah kumpulan koneksi Druid Alibaba, dan kumpulan koneksi JNDI milik Tomcat sendiri.
2. Kustomisasi kumpulan koneksi sederhana
Analisis kumpulan koneksi khusus:
1.2. Karena ini adalah kumpulan koneksi, kita perlu mengimplementasikan antarmuka DataSource dan mengimplementasikan metode di dalamnya. Berdasarkan situasi kami, kami tentang metode getConnection ();
2. Karena kami ingin menyimpan beberapa objek koneksi, kami menggunakan koleksi untuk menyimpannya. Berdasarkan operasi yang sering ditambahkan dan dihapus, kemudian gunakan LinkedList;
3. Penghancuran koneksi bukan untuk menghancurkan koneksi, tetapi untuk mengembalikan koneksi ke kumpulan koneksi.
Coding:
1. Buat kelas myDataSource dan terapkan antarmuka DataSource
Ketika kelas ini dimuat, perlu memiliki wadah untuk menyimpan koneksi, jadi tentukan properti statis:
Daftar statis pribadi <nection> ConnectionList = new LinkedList <> ();
2. Karena kita perlu mendapatkan koneksi database, kami merangkum metode untuk mendapatkan koneksi database.
koneksi publik getOneConnection () {koneksi conn = null; Coba {// Data yang diperoleh di sini diperoleh melalui file properti eksternal, yang lebih fleksibel. InputStream in = myDataSource.class.getClassLoader (). getResourceAsstream ("jdbc/jdbc.properties"); Properti pro = properti baru (); pro.Load (dalam); driver = pro.getProperty ("driver"); url = pro.getProperty ("url"); nama pengguna = pro.getProperty ("pengguna"); kata sandi = pro.getProperty ("kata sandi"); Class.forname (driver); conn = driverManager.getConnection (url, nama pengguna, kata sandi); } catch (Exception e) {e.getStackTrace (); } return conn; }Perhatikan bahwa data yang saya peroleh melalui file properti dapat dipilih sesuai dengan situasi aktual.
3. Inisialisasi beberapa koneksi dan masukkan ke dalam wadah. Ini dapat diimplementasikan menggunakan blok kode statis, tetapi jika sumber data ini tidak digunakan, itu akan menyebabkan limbah sumber daya, jadi saya mempertimbangkan untuk menempatkan implementasi menginisialisasi beberapa koneksi ke dalam konstruktornya, yaitu, ketika kumpulan koneksi ini diperlukan, itu akan membuat beberapa koneksi yang sesuai. sebagai berikut:
MyDataSource publik () {untuk (int i = 0; i <5; i ++) {koneksi conn = getOneConnection (); // Panggil metode untuk membuat connectionList.add (conn); }}4. Sekarang mulailah menimpa metode eksternal ke GetConnection () untuk mendapatkan koneksi dari kumpulan koneksi ini
@Override Public Connection getConnection () melempar sqlexception {connection conn = null; if (connectionList == null || connectionList.size () <= 0) {koneksi koneksi = getConnection (); ConnectionList.Add (koneksi); } conn = ConnectionList.Remove (0); return conn; }5. Buat metode pengembalian objek, masukkan koneksi yang digunakan ke dalam kumpulan koneksi
public void backconnection (Connection conn) {connectionList.add (conn); }Oke, ini melengkapi kumpulan koneksi khusus sederhana, dan kode uji adalah sebagai berikut:
public static void main (string [] args) melempar sqlexception {mydataSource dataSource = myDataSource baru (); Koneksi conn = DataSource.getConnection (); String sql = "pilih * dari pengguna di mana u_id =?"; Disiapkan ps = null; Hasil rs = null; coba {ps = conn.prepareStatement (sql); ps.setint (1, 1); rs = ps.executeQuery (); while (rs.next ()) {System.out.println ("id ="+rs.getint (1)); System.out.println ("username ="+rs.getString (2)); System.out.println ("kata sandi ="+rs.getString (3)); }} catch (sqlexception e) {e.printstacktrace (); } akhirnya {DataSource.BackConnection (Conn); }}Karena abaikan, tidak ada dua objek lain dalam kode saya untuk ditutup.
Sekarang ada masalah kecil bahwa koneksi penutupan kita dicapai melalui metode kumpulan koneksi. Namun, jika pengguna memanggil metode dekat objek koneksi, koneksi dihancurkan dan tidak dikembalikan ke kumpulan koneksi. Kemudian kami mengoptimalkannya sehingga pengguna tidak akan menghancurkan koneksi, tetapi mengembalikan koneksi.
Di antara mereka, ada banyak solusi, dan di sini ada model dekoratif.
Optimalisasi:
1. Buat MyConnection kelas baru untuk mengimplementasikan antarmuka koneksi, di mana jenis atributnya adalah koneksi dan LIIS <nection>.
koneksi pribadi Conn; daftar pribadi <nection> pool; MyConnection public (Connection Conn, Daftar <snection> pool) {this.conn = conn; this.pool = pool; }2. Kemudian implementasikan metode tutup antarmuka
@Override public void close () melempar sqlexception {System.out.println ("Recycle Connection"); pool.add (Conn); }3. Kemudian terapkan metode untuk mendapatkan pernyataan. Jika tidak diimplementasikan, maka kesalahan pointer nol akan terjadi saat mendapatkan pernyataan ini. Saya hanya mengimplementasikan metode untuk mendapatkan persiapan disiapkan.
@Override Publik Persiapan Persiapan Persiapan (String SQL) melempar SQLException {System.out.println ("Get Get Pernyataan"); return conn.preparestatement (SQL); }4. Kemudian hapus metode backconnection dari kelas MyDataSource untuk mengembalikan koneksi, dan memodifikasi konstruktor dan metode untuk mendapatkan koneksi sebagai berikut
public myDataSource2 () {for (int i = 0; i <5; i ++) {connection conn = getOneConnection (); MyConnection myConn = MyConnection baru (Conn, ConnectionList); ConnectionList.Add (MyConn); }} @Override Public Connection getConnection () melempar sqlexception {connection conn = null; if (connectionList == null || connectionList.size () <= 0) {koneksi koneksi = getConnection (); MyConnection myconn = myConnection baru (koneksi, connectionList); ConnectionList.Add (MyConn); } conn = ConnectionList.Remove (0); return conn; }OK, sehingga pengguna tidak akan menghancurkan koneksi dengan menghubungi metode dekat koneksi kami secara langsung, dan akan mengembalikannya ke kumpulan koneksi dengan benar. Anda dapat mengujinya dengan membuat sedikit modifikasi ke kode uji.
Artikel di atas adalah seluruh konten yang telah saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.