تجميع الاتصالات باستخدام HikariCP
إعادة استخدام الاتصالات بكفاءة
تجميع الاتصالات باستخدام HikariCP درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
لماذا نستخدم تجمّع الاتصالات؟
فتح اتصال بقاعدة البيانات مكلف: فقد تستغرق مصافحة TCP والمصادقة وإعداد الجلسة عشرات المللي ثانية.
يحتفظ تجمّع الاتصالات بمجموعة من الاتصالات المفتوحة والجاهزة. تستعير الشفرة اتصالًا وتستخدمه ثم تعيده، فتحوّل عملية فتح مكلفة إلى عملية استعارة سريعة.
تعرّفوا إلى HikariCP
يُعد HikariCP المعيار الفعلي لتجمّعات الاتصالات في Java. فهو صغير وسريع، وهو الإعداد الافتراضي في Spring Boot.
ويطبّق javax.sql.DataSource، لذلك تبقى بقية شفرة JDBC كما هي؛ وكل ما يتغير هو أنكم تحصلون على الاتصالات من التجمّع بدلًا من DriverManager.
تهيئة التجمّع
تُهيئون HikariCP باستخدام كائن HikariConfig: عنوان JDBC، وبيانات الاعتماد، وحجم التجمّع.
ثم تنشئون منه HikariDataSource. وعادةً ما يتم ذلك مرة واحدة عند بدء التطبيق، ثم تتم مشاركة المصدر.
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class Main {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/shop");
config.setUsername("app");
config.setPassword("secret");
config.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(config);
System.out.println("Pool ready, max size " + config.getMaximumPoolSize());
ds.close();
}
}استعارة اتصال
استدعوا ds.getConnection() لاستعارة اتصال، وضعوه داخل try-with-resources كالمعتاد.
إليكم الفكرة الأساسية: إغلاق اتصال مُدار بالتجمّع لا يغلق المقبس الفعلي، بل يعيد الاتصال إلى التجمّع لإعادة استخدامه.
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
public class Main {
public static void main(String[] args) {
DataSource ds = new HikariDataSource();
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT count(*) FROM users");
ResultSet rs = ps.executeQuery()) {
if (rs.next()) System.out.println("Users: " + rs.getInt(1));
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}تعني close() الإعادة
قد يربك هذا الأمر كثيرًا من المطورين. عند استخدام تجمّع:
- يعيد
conn.close()الاتصال إلى التجمّع. - يُبقي التجمّع المقبس الحقيقي مفتوحًا للمستعير التالي.
لذلك ينبغي أن تواصلوا الإغلاق دائمًا؛ فاستخدام try-with-resources هو الأسلوب الصحيح. أنتم تعيدون الاتصال، ولا تتلفونه.
تحديد حجم التجمّع
الحجم الأكبر ليس أفضل. فالتجمّع الكبير جدًا يحمّل قاعدة البيانات بأعمال متزامنة تفوق قدرتها.
وتوصي إرشادات HikariCP بتجمّع صغير، غالبًا بحجم يقارب (core_count * 2) + effective_spindle_count، إذ يتفوق عادةً على التجمّع الضخم. يحدد maximumPoolSize الحد الأقصى، بينما يُبقي minimumIdle عددًا قليلًا من الاتصالات جاهزًا.
public class Main {
public static void main(String[] args) {
int cores = 4;
int spindles = 1; // SSD-ish
int recommended = (cores * 2) + spindles;
System.out.println("Suggested max pool size: " + recommended);
}
}المهلات الرئيسية
يوفر HikariCP مهلات تحمي تطبيقكم من قاعدة بيانات متوقفة عن الاستجابة:
connectionTimeout— مدة انتظار استعارة الاتصال قبل فشلها (الافتراضي 30 ثانية).idleTimeout— مدة بقاء الاتصال الخامل.maxLifetime— يتقاعد الاتصال بعد بلوغه هذا العمر (أبقوه أقل من مهلة قاعدة البيانات نفسها).
التحقق من صلاحية الاتصال
قد تقطع الشبكات الاتصالات دون إشعار. ويمكن لـ HikariCP التحقق من صلاحية الاتصال قبل تسليمه.
تستخدم برامج تشغيل JDBC الحديثة Connection.isValid(timeout)؛ ويستدعيها HikariCP تلقائيًا. ويمكنكم أيضًا ضبط connectionTestQuery لبرامج التشغيل القديمة التي لا تتضمن isValid.
اكتشاف تسرّب الاتصالات
يحدث تسرّب اتصال عندما تستعير الشفرة اتصالًا ولا تغلقه؛ وفي النهاية ينفد التجمّع وتنتهي مهلات جميع عمليات الاستعارة.
اضبطوا leakDetectionThreshold، مثلًا على 20000 مللي ثانية، وسيسجّل HikariCP تتبع المكدس لأي اتصال يُحتفظ به مدة أطول من ذلك، ليوجّهكم مباشرةً إلى الشفرة المتسببة في المشكلة.
تجمّع واحد لكل تطبيق
أنشئوا HikariDataSource مرة واحدة وأعيدوا استخدامه طوال عمر التطبيق.
إنشاء تجمّع جديد لكل طلب يُفقد الفكرة غايتها؛ إذ ستدفعون تكلفة بدء التشغيل في كل مرة. أغلقوا التجمّع فقط عند إيقاف التطبيق باستخدام ds.close().
مراقبة التجمّع
يوفر HikariCP مقاييس وقت التشغيل، حتى تتمكنوا من مراقبة صحة التجمّع.
- الاتصالات النشطة والخاملة والإجمالية.
- الخيوط التي تنتظر اتصالًا حاليًا.
ويتكامل مع Micrometer وDropwizard Metrics وJMX. ويشير الارتفاع المستمر في عدد الخيوط المنتظرة إلى أن التجمّع صغير جدًا أو أن الاتصالات محتجزة مدة أطول من اللازم.
تحقق سريع
عند استخدام HikariCP، ماذا يفعل استدعاء close() على اتصال مستعار؟
مراجعة
يجعل HikariCP إعادة استخدام الاتصالات فعّالة:
- هيئوا
HikariDataSourceمرة واحدة عند بدء التشغيل. - استعيروا الاتصال باستخدام
getConnection()داخل try-with-resources؛ إذ يعيدهclose()إلى التجمّع. - أبقوا
maximumPoolSizeمعتدلًا. - اضبطوا
connectionTimeoutوmaxLifetimeوالتحقق من الصلاحية. - استخدموا
leakDetectionThresholdلاكتشاف الاتصالات التي لم تُعَد.
الأسئلة الشائعة
هل درس «تجميع الاتصالات باستخدام HikariCP» مجاني؟
نعم — نص درس «تجميع الاتصالات باستخدام HikariCP» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «تجميع الاتصالات باستخدام HikariCP»؟
إعادة استخدام الاتصالات بكفاءة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تجميع الاتصالات باستخدام HikariCP»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات JDBC
- PreparedStatement
- المعاملات
- تجميع الاتصالات باستخدام HikariCP