Kelas induk abstrak ObjectPool
Copy kode kodenya sebagai berikut:
impor java.util.Iterator;
impor java.util.Vector;
kelas abstrak publik ObjectPool<T> {
private Vector<T> terkunci, tidak terkunci; // terkunci adalah kumpulan objek yang ditempati, tidak terkunci adalah kumpulan objek yang tersedia
Kolam Objek publik() {
terkunci = Vektor baru<T>();
tidak terkunci = Vektor baru<T>();
}
//Buat objek
abstrak yang dilindungi T create();
// Verifikasi validitas objek
validasi boolean abstrak publik(T o);
// Membatalkan validitas objek
abstrak publik batal kedaluwarsa(T o);
// Periksa: ambil objek dari kumpulan objek
T checkOut yang disinkronkan publik() {
Tt;
if (tidak terkunci.ukuran() > 0) {
Iterator<T> iter = tidak terkunci.iterator();
while(iter.hasNext()) {
t = iter.next();
if(validate(t)) {// Objeknya valid
tidak terkunci.hapus(t);
terkunci.tambahkan(t);
kembali t;
}
else {// Objek telah kadaluwarsa
tidak terkunci.hapus(t);
kadaluwarsa (t);
}
}
}
// Tidak ada objek yang tersedia di kolam objek, buat objek baru
t = buat();
terkunci.tambahkan(t);
kembali(t);
}
// Check in: Melepaskan objek kembali ke kumpulan objek
check-in kekosongan tersinkronisasi publik (T t) {
terkunci.hapus(t);
if(validate(t)) { // Jika objek masih valid, masukkan kembali ke koleksi objek yang tersedia
tidak terkunci.add(t);
}
else { // Jika tidak, objek akan menjadi tidak valid
kadaluwarsa (t);
}
}
}
Subkelas JDBCConnectionPool
Copy kode kodenya sebagai berikut:
impor java.sql.Koneksi;
impor java.sql.DriverManager;
impor java.sql.SQLException;
kelas publik JDBCConnectionPool memperluas ObjectPool<Connection> {
url String pribadi, usr, pwd;
public JDBCConnectionPool(String driver, String url, String usr, String pwd) {
super();
//Muat driver database yang sesuai
mencoba {
Kelas.forName(driver).newInstance();
}
tangkapan(Pengecualian e) {
e.printStackTrace();
}
ini.url = url;
ini.usr = usr;
ini.pwd = pwd;
}
@Mengesampingkan
Pembuatan Koneksi dilindungi() {
mencoba {
kembalikan DriverManager.getConnection(url, usr, pwd);
}
menangkap(SQLException e) {
e.printStackTrace();
}
kembalikan nol;
}
@Mengesampingkan
validasi boolean publik(Koneksi o) {
mencoba {
kembali o.isClosed();
}
menangkap(SQLException e) {
e.printStackTrace();
}
kembali salah;
}
@Mengesampingkan
public void expired(Koneksi o) {
mencoba {
o.tutup();
}
menangkap(SQLException e) {
e.printStackTrace();
}
Akhirnya {
o = nol;
}
}
public static void main(String[] args) {
JDBCConnectionPool dbConnPool = JDBCConnectionPool baru("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");
// Dapatkan objek koneksi database
Sambungan koneksi = dbConnPool.checkOut();
//Gunakan objek koneksi database
// ...
// Lepaskan objek koneksi database
dbConnPool.checkIn(sambungan);
}
}
Copy kode kodenya sebagai berikut:
kumpulan kelas {
MAX_AVAILABLE akhir statis pribadi = 100;
Semafor akhir pribadi tersedia = Semafor baru (MAX_AVAILABLE, true);
Objek publik getItem() melempar InterruptedException {
tersedia.acquire();
kembalikan getNextAvailableItem();
}
public void putItem(Objek x) {
jika (tandai SebagaiTidak Digunakan(x))
tersedia.rilis();
}
// Bukan struktur data yang efisien hanya untuk demo
protected Object[] items = ... jenis item apa pun yang dikelola
boolean yang dilindungi[] digunakan = boolean baru[MAX_AVAILABLE];
objek tersinkronisasi yang dilindungi getNextAvailableItem() {
untuk (int i = 0; i < MAX_AVAILABLE; ++i) {
jika (!digunakan[i]) {
digunakan[i] = benar;
mengembalikan barang[i];
}
}
kembali nol; // tidak tercapai
}
boolean tersinkronisasi yang dilindungi markAsUnused(Item objek) {
untuk (int i = 0; i < MAX_AVAILABLE; ++i) {
jika (barang == barang[i]) {
jika (digunakan[i]) {
digunakan[i] = salah;
kembali benar;
} kalau tidak
kembali salah;
}
}
kembali salah;
}
}