ObjectPool فئة الأصل مجردة
انسخ رمز الكود كما يلي:
import java.util.Iterator;
import java.util.Vector;
فئة مجردة عامة ObjectPool<T> {
ناقل خاص<T> مقفل، غير مقفل؛ // مقفل هو مجموعة من الكائنات المشغولة، وغير مقفل هو مجموعة من الكائنات المتاحة
كائن عام عام () {
مقفل = ناقل جديد<T>();
unlocked = new Vector<T>();
}
// إنشاء كائن
الملخص المحمي T create();
// التحقق من صحة الكائن
التحقق المنطقي الملخص العام (T o)؛
// إبطال الكائن
تنتهي صلاحية الملخص العام (T o)؛
// السحب: احصل على الكائن من تجمع الكائنات
T checkOut العامة المتزامنة () {
تي تي؛
إذا (unlocked.size() > 0) {
Iterator<T> iter = unlocked.iterator();
بينما(iter.hasNext()) {
t = iter.next();
if(validate(t)) { // الكائن صالح
unlocked.remove(t);
lock.add(t);
العودة ر؛
}
else { // انتهت صلاحية الكائن
unlocked.remove(t);
تنتهي (ر)؛
}
}
}
// لا يوجد كائن متاح في بركة الكائنات، قم بإنشاء كائن جديد
ر = إنشاء ()؛
lock.add(t);
العودة (ر)؛
}
// تسجيل الدخول: قم بتحرير الكائن مرة أخرى إلى تجمع الكائنات
تسجيل الدخول الفارغ المتزامن العام (T t) {
lock.remove(t);
if(validate(t)) { // إذا كان الكائن لا يزال صالحًا، فأعده إلى مجموعة الكائنات المتاحة
unlocked.add(t);
}
else { // خلاف ذلك يبطل الكائن
تنتهي (ر)؛
}
}
}
JDBCConnectionPool فئة فرعية
انسخ رمز الكود كما يلي:
استيراد java.sql.Connection؛
استيراد java.sql.DriverManager؛
استيراد java.sql.SQLException؛
الطبقة العامة JDBCConnectionPool تمتد ObjectPool<Connection> {
سلسلة خاصة url، usr، pwd؛
public JDBCConnectionPool(String driver, String url, String usr, String pwd) {
ممتاز()؛
// قم بتحميل برنامج تشغيل قاعدة البيانات المقابل
يحاول {
Class.forName(driver).newInstance();
}
قبض (استثناء ه) {
printStackTrace();
}
this.url = url;
this.usr = usr;
this.pwd = pwd;
}
@تجاوز
إنشاء اتصال محمي () {
يحاول {
إرجاع DriverManager.getConnection(url, usr, pwd);
}
قبض على (SQLException ه) {
printStackTrace();
}
عودة فارغة؛
}
@تجاوز
التحقق من صحة منطقية عامة (اتصال س) {
يحاول {
إرجاع o.isClosed();
}
قبض على (SQLException ه) {
printStackTrace();
}
عودة كاذبة.
}
@تجاوز
انتهاء الصلاحية العامة (الاتصال س) {
يحاول {
o.Close();
}
قبض على (SQLException ه) {
printStackTrace();
}
أخيراً {
س = فارغة؛
}
}
public static void main(String[] args) {
JDBCConnectionPool dbConnPool = new JDBCConnectionPool("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");
// احصل على كائن اتصال قاعدة البيانات
اتصال conn = dbConnPool.checkOut();
// استخدم كائن اتصال قاعدة البيانات
// ...
// حرر كائن اتصال قاعدة البيانات
dbConnPool.checkIn(conn);
}
}
انسخ رمز الكود كما يلي:
تجمع الطبقة {
نهائي ثابت خاص MAX_AVAILABLE = 100؛
الإشارة النهائية الخاصة المتاحة = إشارة جديدة (MAX_AVAILABLE، صحيح)؛
الكائن العام getItem() يلقي InterruptedException {
متاح.اكتساب()؛
إرجاع getNextAvailableItem();
}
public void putItem(Object x) {
إذا (markAsUnused(x))
متاح. الإصدار ()؛
}
// ليست بنية بيانات فعالة بشكل خاص للعرض التوضيحي
protected Object[] items = ... مهما كانت أنواع العناصر التي تتم إدارتها
منطقية محمية[] مستعملة = منطقية جديدة[MAX_AVAILABLE];
كائن متزامن محمي getNextAvailableItem() {
لـ (int i = 0; i < MAX_AVAILABLE; ++i) {
إذا (! مستعملة[i]) {
المستخدمة[i] = صحيح؛
إرجاع العناصر[i];
}
}
إرجاع فارغ؛ // لم يتم الوصول إليه
}
علامة منطقية متزامنة محمية (عنصر الكائن) {
لـ (int i = 0; i < MAX_AVAILABLE; ++i) {
إذا (العنصر == العناصر[i]) {
إذا (المستخدمة[i]) {
مستخدم[i] = خطأ؛
عودة صحيحة؛
} آخر
عودة كاذبة.
}
}
عودة كاذبة.
}
}