لا بد لي من إغلاق () كل EntityManager؟
-
03-07-2019 - |
سؤال
ولقد بدأت للتو المهاجرة بلدي إطار استمرار محلية لنقابة الصحفيين.
وبالنظر إلى أن الأطر استمرار تخفي الكثير من والسباكة، وأنا مهتم في معرفة ما إذا كانت NOT إغلاق EntityManagers سيخلق تسرب الموارد، أو إذا كان الأطر وجمع وإغلاقها بالنسبة لي.
وأنوي في جميع الأماكن لإغلاقها، ولكن لا بد لي من؟
في الوقت الحالي باستخدام TopLink، فقط لأنه يعمل مع نتبيانس بسهولة، ولكن أنا سعيد للتحقيق مقدمي نقابة الصحفيين الآخرين.
المحلول
والامر يعتمد على كيفية حصلت عليه.
إذا قمت بإنشائه باستخدام EntityManagerFactory سيكون لديك لإغلاقه بغض النظر عن الإطار الذي تستخدمه.
إذا كنت الحصول عليها باستخدام حقن التبعية (على سبيل المثال باستخدام EJB والشرحPersistenceContext) يجب أن لا يغلق باليد (AFAIK ذلك سيكون سببا RuntimeException).
نصائح أخرى
ويجب عليك.
وأطر ليس لديهم فكرة عن كيفية كنت تنوي استخدام EM، بحيث لا يمكن إغلاقه (ما عدا، ربما، على وضع اللمسات الأخيرة، والتي لا سند). نعم، وليس إغلاقها من شأنه أن يخلق تسرب الموارد.
والفكرة هي نفس "java.sql.Connection دائما وثيقة" (على الرغم من بعض مصادر البيانات لديها إعدادات إغلاقها تلقائيا بواسطة الخمول) أو "دائما قريبة السبات الجلسة".
وعلاوة على ذلك، إذا كنت تخطط لكتابة التعليمات البرمجية المحمولة، يجب أن لا تعتمد على مزود JPA محدد "تكون ذكيا" - قد تفشل البعض لإغلاق EM في الوقت المناسب
ولقد حصلت EntityManager
باستخدام @PersistenceContext
الشرح في بلدي المخزون. أستطيع أن أرى أنه بعد connectionpools تصل maxPoolSize
لها لا يحصل تنظيف.
ولكن إذا أنا خلق EntityManager
باستخدام EntityManagerFactory
ودعوة entitymanager.close()
ثم يتم الحصول على اتصالات تنظيف. أنا أستخدم c3p0
كما مكتبة connectionpool.