سؤال

لدي إعداد مثيل Tomcat ولكن اتصال قاعدة البيانات الذي قمت بتكوينه فيه context.xml يستمر في الموت بعد فترات من عدم النشاط.

عندما أتحقق من السجلات أحصل على الخطأ التالي:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:الحزمة الأخيرة التي تم استلامها بنجاح من الخادم كان 68051 ثانية.كانت الحزمة الأخيرة التي تم إرسالها بنجاح إلى الخادم قبل 68051 ثانية ، وهي أطول من القيمة التي تم تكوينها من الخادم "wait_timeout".يجب أن تفكر إما في انتهاء الصلاحية و/أو اختبار صحة الاتصال قبل الاستخدام في التطبيق الخاص بك ، أو زيادة القيم التي تم تكوين الخادم لمهلات العميل ، أو استخدام خاصية Connector/J Connection 'AutorEconnect = true' لتجنب هذه المشكلة.

هنا هو التكوين في context.xml:

<Resource name="dataSourceName" 
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000" 
        username="username" 
        password="********"
        removeAbandoned = "true"
        logAbandoned = "true"
        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8"  />

انا استخدم autoReconnect=true كما يقول الخطأ، لكن الاتصال يستمر في الموت.لم أرى هذا يحدث من قبل

لقد تحققت أيضًا من إغلاق جميع اتصالات قاعدة البيانات بشكل صحيح.

هل كانت مفيدة؟

المحلول

توثيق القط

يستخدم DBCP تجمع اتصال قاعدة بيانات Jakarta-Commons.ويعتمد على عدد من مكونات جاكرتا-كومنز:

* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool

هذه السمة قد تساعدك.

removeAbandonedTimeout="60"

أنا أستخدم نفس عناصر تجميع الاتصال وأقوم بتعيين هذه الخصائص لمنع نفس الشيء الذي لم يتم تكوينه من خلال Tomcat.ولكن إذا لم ينجح الأمر الأول، فجرّب هذه الخطوات.

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

نصائح أخرى

فقط لتوضيح السبب الحقيقي لذلك.يقوم MySQL افتراضيًا بإنهاء الاتصالات المفتوحة بعد 8 ساعات من عدم النشاط.ومع ذلك، سيحتفظ تجمع اتصال قاعدة البيانات بالاتصالات لفترة أطول من ذلك.

لذلك، من خلال تعيين timeBetweenEvictionRunsMillis=300000، فإنك تقوم بتوجيه تجمع الاتصال للتشغيل من خلال الاتصالات وطرد الاتصالات الخاملة وإغلاقها كل 5 دقائق.

تم إهمال خيار RemoveAbandoned اعتبارًا من DBCP 1.2 (على الرغم من ذلك لا تزال موجودة في الفرع 1.3). هناإنه تفسير غير رسمي.

لا أعرف ما إذا كانت الإجابة أعلاه تفعل نفس الشيء بشكل أساسي، ولكن بعض أنظمتنا تستخدم اتصال قاعدة البيانات مرة واحدة تقريبًا في الأسبوع وقد رأيت أننا نقدم علامة -Otimeout أو شيء من هذا القبيل إلى mysql لتعيين الاتصال نفذ الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top