سريعة وبسيطة وموثوقة. HikariCP عبارة عن تجمع اتصال JDBC جاهز للإنتاج "بدون حمل". تبلغ مساحة المكتبة 165 كيلو بايت تقريبًا، وهي خفيفة جدًا. اقرأ عن كيفية القيام بذلك هنا.
"البساطة شرط أساسي للموثوقية."
- د. إدسجر ديكسترا
مهم
لتجنب حدوث حالة نادرة حيث يصل التجمع إلى الصفر ولا يتم استعادته، من الضروري تكوين TCP keepalive . تدعم بعض برامج تشغيل JDBC هذا عبر الخصائص، على سبيل المثال tcpKeepAlive=true
على PostgreSQL، ولكن على أي حال يمكن تهيئتها أيضًا على مستوى نظام التشغيل. راجع إعداد OS TCP Keepalive و/أو TCP keepalive للحصول على تجربة PostgreSQL أفضل.
Java 11+ قطعة أثرية مخضرمة:
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP</ artifactId >
< version >6.2.1</ version >
</ dependency >
قطعة أثرية Java 8 maven ( وضع الصيانة ):
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP</ artifactId >
< version >4.0.3</ version >
</ dependency >
قطعة أثرية Java 7 ( وضع الصيانة ):
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP-java7</ artifactId >
< version >2.4.13</ version >
</ dependency >
قطعة أثرية Java 6 ( وضع الصيانة ):
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP-java6</ artifactId >
< version >2.3.13</ version >
</ dependency >
أو التحميل من هنا .
تم إنشاء Microbenchmarks لعزل وقياس الحمل العام للمجمعات باستخدام إطار عمل JMH microbenchmark. يمكنك الاطلاع على مشروع معيار HikariCP للحصول على التفاصيل ومراجعة/تشغيل المعايير بنفسك.
DataSource.getConnection()
/ Connection.close()
واحدة.Connection.prepareStatement()
و Statement.execute()
و Statement.close()
.تحليل HikariCP v2.6، مقارنة بالمجموعات الأخرى، فيما يتعلق بحمل "الطلب المتزايد" الفريد.
فرضت بيئة العميل تكلفة عالية للحصول على اتصال جديد، ومتطلبات مجموعة ذات حجم ديناميكي، ولكن مع ذلك هناك حاجة إلى الاستجابة لطلبات الارتفاع. اقرأ عن التعامل مع الطلب المتزايد هنا.
AKA "ما ربما لم تكن تعرفه عن حجم تجمع الاتصال" . شاهد مقطع فيديو من مجموعة Oracle Real-world Performance، وتعرف على سبب عدم ضرورة أن تكون اتصالات قاعدة البيانات كثيرة كما هي الحال غالبًا. في الواقع، يكون لعدد كبير جدًا من الاتصالات تأثير سلبي واضح يمكن إثباته على الأداء؛ فرق 50x في حالة عرض Oracle. تابع القراءة لمعرفة ذلك.
نود أن نشكر العاملين في WIX على الكتابة العميقة وغير المرغوب فيها حول HikariCP على مدونتهم الهندسية. نلقي نظرة إذا كان لديك الوقت.
اقرأ تحدي تجمع "قاعدة البيانات معطلة" المثير للاهتمام.
البرمجيات مفتوحة المصدر مثل HikariCP، مثل أي منتج، تتنافس في السوق الحرة. لقد حصلنا عليه. نحن ندرك أن تطويرات المنتجات، بمجرد أن تصبح عامة، غالبًا ما يتم اختيارها. ونحن نفهم أن الأفكار يمكن أن تنشأ من روح العصر؛ في وقت واحد وبشكل مستقل. لكن الجدول الزمني للابتكار، خاصة في المشاريع مفتوحة المصدر، واضح أيضًا ونريد أن يفهم مستخدمونا اتجاه تدفق الابتكار في مجالنا. قد يكون من المحبط أن نرى نتيجة مئات الساعات من التفكير والبحث يتم اختيارها بهذه السهولة، وربما يكون هذا متأصلًا في السوق الحرة، لكننا لا نشعر بالإحباط. نحن متحمسون. لتوسيع الفجوة.
يأتي HikariCP مزودًا بإعدادات افتراضية معقولة تؤدي أداءً جيدًا في معظم عمليات النشر دون إجراء تعديلات إضافية. كل خاصية هي اختيارية، باستثناء "الأساسيات" الموضحة أدناه.
؟ يستخدم HikariCP ميلي ثانية لجميع القيم الزمنية.
يعتمد HikariCP على مؤقتات دقيقة لكل من الأداء والموثوقية. من الضروري أن تتم مزامنة الخادم الخاص بك مع مصدر زمني مثل خادم NTP. خاصة إذا كان الخادم الخاص بك يعمل داخل جهاز افتراضي. لماذا؟ اقرأ المزيد هنا. لا تعتمد على إعدادات برنامج Hypervisor "لمزامنة" ساعة الجهاز الظاهري. قم بتكوين مزامنة مصدر الوقت داخل الجهاز الظاهري. إذا أتيت لطلب الدعم بشأن مشكلة تبين أن سببها عدم مزامنة الوقت، فسوف يتم الاستهزاء بك علنًا على تويتر.
؟ dataSourceClassName
هذا هو اسم فئة DataSource
التي يوفرها برنامج تشغيل JDBC. راجع الوثائق الخاصة ببرنامج تشغيل JDBC الخاص بك للحصول على اسم الفئة هذا، أو راجع الجدول أدناه. ملاحظة: مصادر بيانات XA غير مدعومة. يتطلب XA مدير معاملات حقيقي مثل bitronix. لاحظ أنك لا تحتاج إلى هذه الخاصية إذا كنت تستخدم jdbcUrl
لتكوين برنامج تشغيل JDBC المستند إلى DriverManager "المدرسة القديمة". الافتراضي: لا شيء
- أو -
؟ jdbcUrl
تقوم هذه الخاصية بتوجيه HikariCP لاستخدام التكوين "المستند إلى DriverManager". نشعر أن التكوين المستند إلى DataSource (أعلاه) متفوق لعدة أسباب (انظر أدناه)، ولكن بالنسبة للعديد من عمليات النشر، لا يوجد فرق كبير يذكر. عند استخدام هذه الخاصية مع برامج التشغيل "القديمة"، قد تحتاج أيضًا إلى تعيين الخاصية driverClassName
، ولكن جربها أولاً بدونها. لاحظ أنه إذا تم استخدام هذه الخاصية، فلا يزال بإمكانك استخدام خصائص DataSource لتكوين برنامج التشغيل الخاص بك، وهي في الواقع موصى بها عبر معلمات برنامج التشغيل المحددة في عنوان URL نفسه. الافتراضي: لا شيء
؟ username
تقوم هذه الخاصية بتعيين اسم مستخدم المصادقة الافتراضي المستخدم عند الحصول على الاتصالات من برنامج التشغيل الأساسي. لاحظ أنه بالنسبة لمصادر البيانات، يعمل هذا بطريقة حتمية للغاية عن طريق استدعاء DataSource.getConnection(*username*, password)
على مصدر البيانات الأساسي. ومع ذلك، بالنسبة للتكوينات المستندة إلى برنامج التشغيل، يختلف كل برنامج تشغيل عن الآخر. في حالة الاعتماد على برنامج التشغيل، سيستخدم HikariCP خاصية username
هذه لتعيين خاصية user
في Properties
التي تم تمريرها إلى استدعاء DriverManager.getConnection(jdbcUrl, props)
لبرنامج التشغيل. إذا لم يكن هذا هو ما تحتاجه، فتخطى هذه الطريقة تمامًا واستدعِ addDataSourceProperty("username", ...)
، على سبيل المثال. الافتراضي: لا شيء
؟ password
تقوم هذه الخاصية بتعيين كلمة مرور المصادقة الافتراضية المستخدمة عند الحصول على الاتصالات من برنامج التشغيل الأساسي. لاحظ أنه بالنسبة لـ DataSources، يعمل هذا بطريقة حتمية للغاية عن طريق استدعاء DataSource.getConnection(username, *password*)
على DataSource الأساسي. ومع ذلك، بالنسبة للتكوينات المستندة إلى برنامج التشغيل، يختلف كل برنامج تشغيل عن الآخر. في حالة الاعتماد على برنامج التشغيل، سيستخدم HikariCP خاصية password
هذه لتعيين خاصية password
في Properties
التي تم تمريرها إلى استدعاء DriverManager.getConnection(jdbcUrl, props)
لبرنامج التشغيل. إذا لم يكن هذا هو ما تحتاجه، فتخطى هذه الطريقة تمامًا واستدعِ addDataSourceProperty("pass", ...)
، على سبيل المثال. الافتراضي: لا شيء
✅ autoCommit
تتحكم هذه الخاصية في سلوك الالتزام التلقائي الافتراضي للاتصالات التي يتم إرجاعها من التجمع. إنها قيمة منطقية. الافتراضي: صحيح
⏳ connectionTimeout
تتحكم هذه الخاصية في الحد الأقصى لعدد المللي ثانية التي سينتظرها العميل (هذا أنت) للاتصال من التجمع. إذا تم تجاوز هذا الوقت دون أن يصبح الاتصال متاحًا، فسيتم طرح SQLException. أدنى مهلة اتصال مقبولة هي 250 مللي ثانية. الافتراضي: 30000 (30 ثانية)
⏳ idleTimeout
تتحكم هذه الخاصية في الحد الأقصى من الوقت الذي يُسمح فيه للاتصال بالبقاء خاملاً في التجمع. ينطبق هذا الإعداد فقط عندما يتم تعريف minimumIdle
على أنه أقل من maximumPoolSize
. لن يتم إيقاف الاتصالات الخاملة بمجرد وصول المجموعة إلى minimumIdle
من الاتصالات الخاملة. سواء تم سحب الاتصال كخمول أم لا، فإنه يخضع لتغير بحد أقصى +30 ثانية، ومتوسط تباين +15 ثانية. لن يتم إيقاف الاتصال أبدًا باعتباره خاملاً قبل انتهاء هذه المهلة. تعني القيمة 0 أنه لا تتم إزالة الاتصالات الخاملة من التجمع أبدًا. الحد الأدنى للقيمة المسموح بها هو 10000 مللي ثانية (10 ثوانٍ). الافتراضي: 600000 (10 دقائق)
⏳ keepaliveTime
تتحكم هذه الخاصية في عدد المرات التي يحاول فيها HikariCP الحفاظ على الاتصال حيًا، وذلك لمنع انتهاء مهلة الاتصال بواسطة قاعدة البيانات أو البنية التحتية للشبكة. يجب أن تكون هذه القيمة أقل من قيمة maxLifetime
. لن يحدث "keepalive" إلا في حالة وجود اتصال خامل. عندما يحين وقت "البقاء على قيد الحياة" مقابل اتصال معين، ستتم إزالة هذا الاتصال من التجمع، و"إجراء اتصال به"، ثم يتم إعادته إلى التجمع. يعد "ping" واحدًا من أحد الأمرين: استدعاء الأسلوب JDBC4 isValid()
، أو تنفيذ connectionTestQuery
. عادةً، يجب قياس المدة خارج التجمع بالمللي ثانية المكونة من رقم واحد أو حتى بالمللي ثانية فرعية، وبالتالي يجب أن يكون لها تأثير ملحوظ على الأداء قليل أو معدوم. الحد الأدنى للقيمة المسموح بها هو 30000 مللي ثانية (30 ثانية)، ولكن القيمة في نطاق الدقائق تكون مرغوبة للغاية. الافتراضي: 120000 (دقيقتان)
⏳ maxLifetime
تتحكم هذه الخاصية في الحد الأقصى لعمر الاتصال في التجمع. لن يتم إيقاف الاتصال قيد الاستخدام أبدًا، ولن تتم إزالته إلا عند إغلاقه. على أساس كل اتصال على حدة، يتم تطبيق التوهين السلبي الطفيف لتجنب الانقراض الجماعي في المجمع. نوصي بشدة بتعيين هذه القيمة، ويجب أن تكون أقصر بعدة ثوانٍ من الحد الأقصى لوقت الاتصال الذي تفرضه قاعدة البيانات أو البنية التحتية. تشير القيمة 0 إلى عدم وجود حد أقصى للعمر (عمر لا نهائي)، ويخضع بالطبع لإعداد idleTimeout
. الحد الأدنى للقيمة المسموح بها هو 30000 مللي ثانية (30 ثانية). الافتراضي: 1800000 (30 دقيقة)
؟ connectionTestQuery
إذا كان برنامج التشغيل الخاص بك يدعم JDBC4، فنوصي بشدة بعدم تعيين هذه الخاصية. هذا مخصص لبرامج التشغيل "القديمة" التي لا تدعم JDBC4 Connection.isValid() API
. هذا هو الاستعلام الذي سيتم تنفيذه قبل أن يتم منحك اتصالاً من التجمع للتحقق من أن الاتصال بقاعدة البيانات لا يزال حيًا. مرة أخرى، حاول تشغيل المجمع بدون هذه الخاصية، وسوف يقوم HikariCP بتسجيل خطأ إذا كان برنامج التشغيل الخاص بك غير متوافق مع JDBC4 لإعلامك بذلك. الافتراضي: لا شيء
؟ minimumIdle
تتحكم هذه الخاصية في الحد الأدنى لعدد الاتصالات الخاملة التي يحاول HikariCP الاحتفاظ بها في التجمع. إذا انخفضت الاتصالات الخاملة إلى ما دون هذه القيمة وكان إجمالي الاتصالات في التجمع أقل من maximumPoolSize
، فسيبذل HikariCP قصارى جهده لإضافة اتصالات إضافية بسرعة وكفاءة. ومع ذلك، للحصول على أقصى قدر من الأداء والاستجابة للطلبات المتزايدة، نوصي بعدم تعيين هذه القيمة والسماح لـ HikariCP بدلاً من ذلك بالعمل كتجمع اتصال ذي حجم ثابت . الافتراضي: نفس الحد الأقصى لحجم PoolSize
؟ maximumPoolSize
تتحكم هذه الخاصية في الحد الأقصى للحجم الذي يُسمح للتجمّع بالوصول إليه، بما في ذلك الاتصالات الخاملة وقيد الاستخدام. ستحدد هذه القيمة بشكل أساسي الحد الأقصى لعدد الاتصالات الفعلية بالواجهة الخلفية لقاعدة البيانات. يتم تحديد القيمة المعقولة لهذا بشكل أفضل من خلال بيئة التنفيذ الخاصة بك. عندما يصل التجمع إلى هذا الحجم، ولا تتوفر أي اتصالات خاملة، سيتم حظر المكالمات إلى getConnection() لمدة تصل إلى connectionTimeout
مللي ثانية قبل انتهاء المهلة. يرجى القراءة عن حجم حمام السباحة. الافتراضي: 10
؟ metricRegistry
هذه الخاصية متاحة فقط من خلال التكوين البرمجي أو حاوية IoC. تسمح لك هذه الخاصية بتحديد مثيل Codahale/Dropwizard MetricRegistry
ليتم استخدامه بواسطة المجمع لتسجيل المقاييس المختلفة. راجع صفحة ويكي المقاييس للحصول على التفاصيل. الافتراضي: لا شيء
؟ healthCheckRegistry
هذه الخاصية متاحة فقط من خلال التكوين البرمجي أو حاوية IoC. تسمح لك هذه الخاصية بتحديد مثيل Codahale/Dropwizard HealthCheckRegistry
ليتم استخدامه بواسطة المجمع للإبلاغ عن المعلومات الصحية الحالية. راجع صفحة Wiki الخاصة بالفحوصات الصحية للحصول على التفاصيل. الافتراضي: لا شيء
؟ poolName
تمثل هذه الخاصية اسمًا محددًا من قبل المستخدم لتجمع الاتصال وتظهر بشكل أساسي في التسجيل ووحدات تحكم إدارة JMX لتحديد التجمعات وتكوينات التجمع. الافتراضي: تم إنشاؤه تلقائيًا
⏳ initializationFailTimeout
تتحكم هذه الخاصية في ما إذا كان التجمع "سيفشل بسرعة" إذا لم يكن من الممكن دمج التجمع مع اتصال أولي بنجاح. يتم اعتبار أي رقم موجب هو عدد المللي ثانية لمحاولة الحصول على اتصال أولي؛ سيتم حظر موضوع التطبيق خلال هذه الفترة. إذا تعذر الحصول على اتصال قبل انتهاء هذه المهلة، فسيتم طرح استثناء. يتم تطبيق هذه المهلة بعد فترة connectionTimeout
. إذا كانت القيمة صفر (0)، فسيحاول HikariCP الحصول على اتصال والتحقق من صحته. إذا تم الحصول على اتصال، ولكن فشل التحقق من الصحة، فسيتم طرح استثناء ولن يبدأ التجمع. ومع ذلك، إذا تعذر الحصول على اتصال، سيبدأ التجمع، ولكن قد تفشل الجهود اللاحقة للحصول على اتصال. ستتجاوز القيمة الأقل من الصفر أي محاولة اتصال أولية، وسيبدأ التجمع فورًا أثناء محاولة الحصول على الاتصالات في الخلفية. وبالتالي، قد تفشل الجهود اللاحقة للحصول على اتصال. الافتراضي: 1
❎ isolateInternalQueries
تحدد هذه الخاصية ما إذا كان HikariCP يعزل استعلامات التجمع الداخلي، مثل اختبار الاتصال المباشر، في معاملته الخاصة. وبما أن هذه الاستعلامات عادةً ما تكون للقراءة فقط، فمن النادر أن يكون من الضروري تضمينها في المعاملة الخاصة بها. تنطبق هذه الخاصية فقط في حالة تعطيل autoCommit
. الافتراضي: خطأ
allowPoolSuspension
تتحكم هذه الخاصية فيما إذا كان من الممكن تعليق التجمع واستئنافه من خلال JMX. يعد هذا مفيدًا لبعض سيناريوهات أتمتة تجاوز الفشل. عندما يتم تعليق التجمع، لن تنتهي مهلة استدعاءات getConnection()
وسيتم تعليقها حتى يتم استئناف التجمع. الافتراضي: خطأ
❎ readOnly
تتحكم هذه الخاصية فيما إذا كانت الاتصالات التي تم الحصول عليها من التجمع في وضع القراءة فقط بشكل افتراضي. لاحظ أن بعض قواعد البيانات لا تدعم مفهوم وضع القراءة فقط، بينما توفر قواعد بيانات أخرى تحسينات للاستعلام عند ضبط الاتصال على وضع القراءة فقط. يعتمد ما إذا كنت بحاجة إلى هذه الخاصية أم لا إلى حد كبير على التطبيق وقاعدة البيانات الخاصة بك. الافتراضي: خطأ
❎ registerMbeans
تتحكم هذه الخاصية فيما إذا كانت JMX Management Beans ("MBeans") مسجلة أم لا. الافتراضي: خطأ
؟ catalog
تقوم هذه الخاصية بتعيين الكتالوج الافتراضي لقواعد البيانات التي تدعم مفهوم الكتالوجات. إذا لم يتم تحديد هذه الخاصية، فسيتم استخدام الكتالوج الافتراضي المحدد بواسطة برنامج تشغيل JDBC. الافتراضي: السائق الافتراضي
؟ connectionInitSql
تقوم هذه الخاصية بتعيين عبارة SQL التي سيتم تنفيذها بعد كل إنشاء اتصال جديد قبل إضافتها إلى التجمع. إذا كان SQL هذا غير صالح أو يطرح استثناءً، فسيتم التعامل معه على أنه فشل في الاتصال وسيتم اتباع منطق إعادة المحاولة القياسي. الافتراضي: لا شيء
؟ driverClassName
سيحاول HikariCP حل برنامج التشغيل من خلال DriverManager استنادًا إلى jdbcUrl
فقط، ولكن بالنسبة لبعض برامج التشغيل الأقدم، يجب أيضًا تحديد driverClassName
. احذف هذه الخاصية إلا إذا حصلت على رسالة خطأ واضحة تشير إلى عدم العثور على برنامج التشغيل. الافتراضي: لا شيء
؟ transactionIsolation
تتحكم هذه الخاصية في مستوى عزل المعاملة الافتراضي للاتصالات التي يتم إرجاعها من التجمع. إذا لم يتم تحديد هذه الخاصية، فسيتم استخدام مستوى عزل المعاملة الافتراضي المحدد بواسطة برنامج تشغيل JDBC. استخدم هذه الخاصية فقط إذا كانت لديك متطلبات عزل محددة شائعة لجميع الاستعلامات. قيمة هذه الخاصية هي الاسم الثابت من فئة Connection
مثل TRANSACTION_READ_COMMITTED
و TRANSACTION_REPEATABLE_READ
وما إلى ذلك. الافتراضي: برنامج التشغيل الافتراضي
⏳ validationTimeout
تتحكم هذه الخاصية في الحد الأقصى للوقت الذي سيتم فيه اختبار الاتصال من أجل البقاء. يجب أن تكون هذه القيمة أقل من connectionTimeout
. أقل مهلة مقبولة للتحقق من الصحة هي 250 مللي ثانية. الافتراضي: 5000
⏳ leakDetectionThreshold
تتحكم هذه الخاصية في مقدار الوقت الذي يمكن أن يكون فيه الاتصال خارج التجمع قبل تسجيل رسالة تشير إلى احتمال تسرب الاتصال. القيمة 0 تعني أنه تم تعطيل اكتشاف التسرب. أدنى قيمة مقبولة لتمكين اكتشاف التسرب هي 2000 (ثانيتين). الافتراضي: 0
➡ dataSource
هذه الخاصية متاحة فقط من خلال التكوين البرمجي أو حاوية IoC. تسمح لك هذه الخاصية بتعيين مثيل DataSource
مباشرة ليتم تغليفه بواسطة المجمع، بدلاً من قيام HikariCP بإنشائه عبر الانعكاس. يمكن أن يكون هذا مفيدًا في بعض أطر حقن التبعية. عند تحديد هذه الخاصية، سيتم تجاهل خاصية dataSourceClassName
وجميع الخصائص الخاصة بـ DataSource. الافتراضي: لا شيء
؟ schema
تقوم هذه الخاصية بتعيين المخطط الافتراضي لقواعد البيانات التي تدعم مفهوم المخططات. إذا لم يتم تحديد هذه الخاصية، فسيتم استخدام المخطط الافتراضي المحدد بواسطة برنامج تشغيل JDBC. الافتراضي: السائق الافتراضي
➡ threadFactory
هذه الخاصية متاحة فقط من خلال التكوين البرمجي أو حاوية IoC. تسمح لك هذه الخاصية بتعيين مثيل java.util.concurrent.ThreadFactory
الذي سيتم استخدامه لإنشاء كافة سلاسل الرسائل التي يستخدمها المجمع. إنه ضروري في بعض بيئات التنفيذ المقيدة حيث لا يمكن إنشاء سلاسل العمليات إلا من خلال ThreadFactory
التي توفرها حاوية التطبيق. الافتراضي: لا شيء
➡المنفذ scheduledExecutor
هذه الخاصية متاحة فقط من خلال التكوين البرمجي أو حاوية IoC. تسمح لك هذه الخاصية بتعيين مثيل java.util.concurrent.ScheduledExecutorService
الذي سيتم استخدامه لمختلف المهام المجدولة داخليًا. في حالة تزويد HikariCP بمثيل ScheduledThreadPoolExecutor
، فمن المستحسن استخدام setRemoveOnCancelPolicy(true)
. الافتراضي: لا شيء
➡ exceptionOverride
هذه الخاصية متاحة فقط من خلال التكوين البرمجي أو حاوية IoC. تسمح لك هذه الخاصية بتعيين مثيل لفئة، وتنفيذ واجهة com.zaxxer.hikari.SQLExceptionOverride
، والتي سيتم استدعاؤها قبل سحب الاتصال من التجمع بسبب شروط استثناء محددة. عادةً، عند طرح SQLException
، يتم طرد الاتصالات من التجمع عند وجود SQLStates أو ErrorCodes محددة. سيتم استدعاء الأسلوب adjudicate()
على مثيل SQLExceptionOverride
، والذي قد يُرجع واحدًا مما يلي: Override.CONTINUE_EVICT
. Override.DO_NOT_EVICT
أو Override.MUST_EVICT
. باستثناء حالات محددة جدًا، يجب إرجاع Override.CONTINUE_EVICT
، مما يسمح بتنفيذ منطق الإخلاء/عدم الإخلاء الافتراضي. الافتراضي: لا شيء
؟ exceptionOverrideClassName
تسمح لك هذه الخاصية بتحديد اسم الفئة التي يوفرها المستخدم والتي تنفذ واجهة com.zaxxer.hikari.SQLExceptionOverride
. سيتم إنشاء مثيل للفئة بواسطة المجمع للفصل في عمليات إخلاء الاتصال. راجع exceptionOverride
الخاصية أعلاه للحصول على وصف كامل. الافتراضي: لا شيء
يحتوي HikariCP على الكثير من "المقابض" التي يمكن تشغيلها كما ترون أعلاه، ولكنها أقل نسبيًا من بعض المجمعات الأخرى. هذه هي فلسفة التصميم. جمالية تصميم HikariCP هي البساطة. تماشيًا مع فلسفة التصميم البسيطة أفضل أو الأقل هو الأفضل ، تم استبعاد بعض محاور التكوين عمدًا.
توفر العديد من تجمعات الاتصال، بما في ذلك Apache DBCP وVibur وc3p0 وغيرها، إمكانية التخزين PreparedStatement
. HikariCP لا. لماذا؟
في طبقة تجمع الاتصال، لا يمكن تخزين PreparedStatements
مؤقتًا إلا لكل اتصال . إذا كان تطبيقك يحتوي على 250 استعلامًا يتم تنفيذه بشكل شائع ومجموعة مكونة من 20 اتصالاً، فإنك تطلب من قاعدة البيانات الخاصة بك الاحتفاظ بـ 5000 خطة تنفيذ استعلام - وبالمثل يجب على المجمع تخزين هذا العدد الكبير من PreparedStatements
والرسم البياني للكائنات ذات الصلة بها.
تحتوي معظم برامج تشغيل JDBC الرئيسية لقاعدة البيانات على ذاكرة تخزين مؤقت للبيان يمكن تهيئتها، بما في ذلك PostgreSQL وOracle وDerby وMySQL وDB2 وغيرها الكثير. تتمتع برامج تشغيل JDBC بوضع فريد لاستغلال الميزات الخاصة بقاعدة البيانات، كما أن جميع تطبيقات التخزين المؤقت تقريبًا قادرة على مشاركة خطط التنفيذ عبر الاتصالات . وهذا يعني أنه بدلاً من 5000 عبارة في الذاكرة وخطط التنفيذ المرتبطة بها، فإن استعلاماتك الـ 250 التي يتم تنفيذها بشكل شائع تؤدي إلى 250 خطة تنفيذ بالضبط في قاعدة البيانات. لا تحتفظ التطبيقات الذكية حتى بكائنات PreparedStatement
في الذاكرة على مستوى برنامج التشغيل، ولكنها بدلاً من ذلك تقوم فقط بإرفاق مثيلات جديدة بمعرفات الخطة الموجودة.
يعد استخدام ذاكرة التخزين المؤقت للبيان في طبقة التجميع أمرًا مضادًا للنمط، وسيؤثر سلبًا على أداء التطبيق الخاص بك مقارنةً بذاكرة التخزين المؤقت التي يوفرها برنامج التشغيل.
مثل التخزين المؤقت للبيانات، يدعم معظم موردي قواعد البيانات الرئيسيين تسجيل البيانات من خلال خصائص برنامج التشغيل الخاص بهم. يتضمن ذلك Oracle وMySQL وDerby وMSSQL وغيرها. حتى أن البعض يدعم التسجيل البطيء للاستعلام. بالنسبة لقواعد البيانات القليلة التي لا تدعمها، تتوفر العديد من الخيارات. لقد تلقينا تقريرًا يفيد بأن p6spy يعمل بشكل جيد، ولاحظنا أيضًا توفر log4jdbc وjdbcdslog-exp.
يرجى قراءة دليل الاسترداد السريع للحصول على تفاصيل حول كيفية تكوين برنامج التشغيل والنظام الخاص بك للاسترداد المناسب من إعادة تشغيل قاعدة البيانات وأحداث قسم الشبكة.
يمكنك استخدام فئة HikariConfig
مثل 1 :
HikariConfig config = new HikariConfig ();
config . setJdbcUrl ( "jdbc:mysql://localhost:3306/simpsons" );
config . setUsername ( "bart" );
config . setPassword ( "51mp50n" );
config . addDataSourceProperty ( "cachePrepStmts" , "true" );
config . addDataSourceProperty ( "prepStmtCacheSize" , "250" );
config . addDataSourceProperty ( "prepStmtCacheSqlLimit" , "2048" );
HikariDataSource ds = new HikariDataSource ( config );
1 مثال خاص بـ MySQL، لا تنسخ حرفيًا.
أو إنشاء نسخة مباشرة من HikariDataSource
كما يلي:
HikariDataSource ds = new HikariDataSource ();
ds . setJdbcUrl ( "jdbc:mysql://localhost:3306/simpsons" );
ds . setUsername ( "bart" );
ds . setPassword ( "51mp50n" );
...
أو ملف الملكية على أساس:
// Examines both filesystem and classpath for .properties file
HikariConfig config = new HikariConfig ( "/some/path/hikari.properties" );
HikariDataSource ds = new HikariDataSource ( config );
مثال لملف الملكية:
dataSourceClassName =org.postgresql.ds.PGSimpleDataSource
dataSource.user =test
dataSource.password =test
dataSource.databaseName =mydb
dataSource.portNumber =5432
dataSource.serverName =localhost
أو java.util.Properties
على أساس:
Properties props = new Properties ();
props . setProperty ( "dataSourceClassName" , "org.postgresql.ds.PGSimpleDataSource" );
props . setProperty ( "dataSource.user" , "test" );
props . setProperty ( "dataSource.password" , "test" );
props . setProperty ( "dataSource.databaseName" , "mydb" );
props . put ( "dataSource.logWriter" , new PrintWriter ( System . out ));
HikariConfig config = new HikariConfig ( props );
HikariDataSource ds = new HikariDataSource ( config );
هناك أيضًا خاصية نظام متاحة، hikaricp.configurationFile
، والتي يمكن استخدامها لتحديد موقع ملف الخصائص. إذا كنت تنوي استخدام هذا الخيار، فقم بإنشاء مثيل HikariConfig
أو HikariDataSource
باستخدام المُنشئ الافتراضي وسيتم تحميل ملف الخصائص.
نصائح حول أداء MySQL
نوصي باستخدام dataSourceClassName
بدلاً من jdbcUrl
، ولكن أيًا منهما مقبول. سنقول ذلك مرة أخرى، إما مقبول .
ملاحظة: يحتاج مستخدمو التكوين التلقائي لـ Spring Boot إلى استخدام التكوين المستند إلى jdbcUrl
.
من المعروف أن MySQL DataSource معطل فيما يتعلق بدعم مهلة الشبكة. استخدم تكوين jdbcUrl
بدلاً من ذلك.
فيما يلي قائمة بفئات JDBC DataSource لقواعد البيانات الشائعة:
قاعدة البيانات | سائق | فئة مصدر البيانات |
---|---|---|
أباتشي ديربي | ديربي | org.apache.derby.jdbc.ClientDataSource |
فايربيرد | جايبيرد | org.firebirdsql.ds.FBSimpleDataSource |
جوجل المفك | مفتاح البراغي | com.google.cloud.spanner.jdbc.JdbcDriver |
H2 | H2 | org.h2.jdbcx.JdbcDataSource |
HSQLDB | HSQLDB | org.hsqldb.jdbc.JDBCDataSource |
آي بي إم DB2 | آي بي إم جي سي سي | com.ibm.db2.jcc.DB2SimpleDataSource |
آي بي إم إنفورميكس | آي بي إم إنفورميكس | com.informix.jdbcx.IfxDataSource |
خادم MS SQL | مايكروسوفت | com.microsoft.sqlserver.jdbc.SQLServerDataSource |
موصل/ج | ||
ماريا دي بي | ماريا دي بي | org.mariadb.jdbc.MariaDbDataSource |
أوراكل | أوراكل | oracle.jdbc.pool.OracleDataSource |
OrientDB | OrientDB | com.orienttechnologies.orient.jdbc.OrientDataSource |
PostgreSQL | pgjdbc-ng | com.impossibl.postgres.jdbc.PGDataSource |
PostgreSQL | PostgreSQL | org.postgresql.ds.PGSimpleDataSource |
ساب ماكس دي بي | ساب | com.sap.dbtech.jdbc.DriverSapDB |
سكليتي | xerial | org.sqlite.SQLiteDataSource |
سايبيس | jConnect | com.sybase.jdbc4.jdbc.SybDataSource |
ملاحظة يستخدم الإصدار 2.4 من Play الآن HikariCP بشكل افتراضي. لقد ظهر مكون إضافي جديد لإطار عمل Play؛ play-hikaricp. إذا كنت تستخدم إطار اللعب الممتاز، فإن تطبيقك يستحق HikariCP. شكرا فريق Edulify!
تم إنشاء غلاف Clojure جديد بواسطة tomekw ويمكن العثور عليه هنا.
تم إنشاء غلاف JRuby جديد بواسطة tomekw ويمكن العثور عليه هنا.
مجموعة مناقشة Google HikariCP هنا، الأسئلة الشائعة المتزايدة.
لا تنسَ Wiki للحصول على معلومات إضافية مثل:
⇒ Java 8+ (عناصر Java 6/7 موجودة في وضع الصيانة)
⇒ مكتبة slf4j
لا يمكن للمشاريع عالية الأداء أن تحتوي على عدد كبير جدًا من الأدوات! ونود أن نشكر الشركات التالية:
شكرًا لشركة ej-technologies على ملف التعريف الشامل والممتاز، JProfiler.
يدعم YourKit المشاريع مفتوحة المصدر من خلال ملف تعريف Java كامل الميزات. انقر فوق شعار YourKit أدناه لمعرفة المزيد.
يرجى إجراء التغييرات وإرسال طلبات السحب من فرع dev
بدلاً من master
. يرجى ضبط المحرر الخاص بك لاستخدام المسافات بدلاً من علامات التبويب، والالتزام بالنمط الواضح للكود الذي تقوم بتحريره. يكون فرع dev
دائمًا أكثر "حداثة" من master
إذا كنت تتطلع إلى عيش الحياة على الحافة.