في أحد الأيام، تعذر فتح صفحة الويب على الخادم، وتم الإبلاغ عن الخطأ التالي بشكل متكرر.
2007-3-18 1:08:26 org.apache.tomcat.util.threads.ThreadPool logFull
خطير: جميع المواضيع (150) مشغولة حاليًا، في انتظار زيادة الحد الأقصى للخيوط (150) أو التحقق من حالة servlet،
لقد وجدت بعض الإجابات عبر الإنترنت، والتي أعتقد أنها صحيحة:
1. أعتقد أن بعض مواردك لم يتم تحريرها وهي عالقة بسبب التراكم.
2. مشكلة تجمع الاتصال
3. يجب أن يكون السبب هو وقت المعالجة الطويل لسلسلة الرسائل التي تستجيب للطلب من جانب الخادم
:
كان هناك شخصان فقط يستخدمان الموقع في ذلك الوقت، لذلك كان من المستحيل وصول 150 سلسلة رسائل متزامنة إلى الإنترنت. لذلك لا ينبغي أن تكون مشكلة في قاعدة البيانات.
انطلاقًا من مطالبات الخطأ، يجب أن يكون سببها الاستخدام غير المعقول لتجمع الاتصال، أو لم يتم تعيين تجمع الاتصال على الإطلاق. يتم توصيل الجزء المتصل بقاعدة البيانات باستخدام مصدر بيانات Spring JDBC، كما يلي:
<فاصوليا>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- برنامج تشغيل MySQL-->
<property name="driverClassName"><value>org.gjt.mm.mysql.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8</value></property>
<property name="username"><value>اختبار</value></property>
<property name="password"><value>اختبار</value></property>
</beans>
يجب أن تحدث المشكلة مع برنامج Spring's DriverManagerDataSource، المسؤول عن إدارة هذه الاتصالات.
وفيما يلي شرح لبرنامج DriverManagerDataSource
DriverManagerDataSource في Spring Framework
javax.sql Interface DataSource
تنفيذ SmartDataSource الذي يقوم بتكوين برنامج تشغيل JDBC قديم عادي عبر
bean، ويعيد اتصالًا جديدًا في كل مرة،
وهو مفيد أيضًا لبيئات الاختبار أو المستقلة خارج حاوية J2EE
كفاصوليا DataSource في سياق التطبيق المعني، أو بالاشتراك مع
بيئة JNDI البسيطة التي تفترض تجمع الاتصال Connection.Close() ستفعل ذلك ببساطة
أغلق الاتصال، لذلك يجب أن يعمل أي رمز استمراري مدرك لـ DataSource
في حاوية J2EE، يوصى باستخدام JNDI DataSource المقدم من
يمكن تصدير حاوية DataSource هذه كحبة DataSource في ملف
ApplicationContext عبر JndiObjectFactoryBean، للتبديل السلس من وإلى
حبة DataSource محلية مثل هذه الفئة
إذا كنت بحاجة إلى تجمع اتصال "حقيقي" خارج حاوية J2EE، ففكر في ذلك
Apache's Jakarta Commons DBCP، وهو BasicDataSource عبارة عن تجمع اتصال كامل
Bean، وتدعم نفس الخصائص الأساسية لهذه الفئة بالإضافة إلى إعدادات محددة.
يمكن استخدامه كبديل لمثيل هذه الفئة فقط عن طريق التغيير
اسم فئة تعريف الفول ل
"org.apache.commons.dbcp.BasicDataSource
--------------------------------------
".--------- ----------
تدعم العديد من مشاريع جاكرتا التفاعل مع قاعدة البيانات العلائقية
يمكن أن يستغرق الاتصال الجديد لكل مستخدم وقتًا طويلاً (غالبًا ما يتطلب عدة اتصالات
ثانية من وقت الساعة)، من أجل إجراء معاملة قاعدة البيانات التي قد
قد يستغرق فتح اتصال لكل مستخدم ميلي ثانية
تطبيق إنترنت مستضاف بشكل عام حيث يمكن لعدد المستخدمين المتزامنين
تكون كبيرة جدًا وفقًا لذلك، غالبًا ما يرغب المطورون في مشاركة "مجموعة" مفتوحة
الاتصالات بين جميع مستخدمي التطبيق الحاليين
عادةً ما يكون تنفيذ الطلب فعليًا في أي وقت صغيرًا جدًا
النسبة المئوية من إجمالي عدد المستخدمين النشطين، وأثناء معالجة الطلب
المرة الوحيدة التي يكون فيها الاتصال بقاعدة البيانات مطلوبًا بالتطبيق نفسه
يقوم بتسجيل الدخول إلى نظام إدارة قواعد البيانات (DBMS)، ويتعامل مع أي مشكلات تتعلق بحساب المستخدم داخليًا.
هناك العديد من تجمعات اتصال قاعدة البيانات المتاحة بالفعل، سواء داخلها
توفر منتجات جاكرتا وأماكن أخرى فرصة
تنسيق الجهود اللازمة لإنشاء والحفاظ على كفاءة،
حزمة غنية بالميزات بموجب ترخيص ASF
تعتمد حزمة commons-dbcp على التعليمات البرمجية الموجودة في حزمة commons-pool لتوفيرها
آليات تجمع الكائنات الأساسية التي تستخدمها
يمكن للتطبيقات استخدام مكون commons-dbcp مباشرة أو من خلال المكونات الموجودة
واجهة الحاوية/إطار الدعم الخاص بهم، على سبيل المثال Tomcat
تقدم حاوية servlet مصدر بيانات DBCP كمصدر بيانات JNDI James (Java
قام Apache Mail Enterprise Server) بدمج DBCP في إطار عمل Avalon A
يتم إنشاء مصدر بيانات بنمط Avalon عن طريق تغليف تطبيق DBCP
منطق التجميع لـ DBCP والتكوين الموجود في كود Avalon's excalibur هو
ما هو مطلوب لإنشاء مصدر بيانات متكامل وموثوق،
بعد قراءة الشرح، الحقيقة هي أنه عند إنشاء اتصال، يقوم DriverManagerDataSource بإنشاء اتصال جديد طالما كان هناك اتصال، ولا يوجد تجمع اتصال على الإطلاق. سيكون من الأفضل التبديل إلى تجمع الاتصال مفتوح المصدر التالي.
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" Destroy-method="Close">
<اسم الخاصية = "driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</خاصية>
<اسم الخاصية = "url">
<value>jdbc:hsqldb:hsql://localhost:9001</value>
</خاصية>
<اسم الخاصية = "اسم المستخدم">
<القيمة>سا</القيمة>
</خاصية>
<اسم الخاصية = "كلمة المرور">
<القيمة></القيمة>
</خاصية>
</bean>
تم اجتياز الاختبار وتم حل المشكلة. إذا لم يكن هناك محرك بحث للعثور على الإجابة، فلن يتم حل المشكلة بهذه السرعة.