عن الشرح التفصيلي لمشكلة تجمع الاتصال بين Tomcat وMySQL (الأصلي)
، وأخيراً حصلت على شيء ما وآمل أن يكون مفيدًا للجميع. أولاً، يرجى ملاحظة ما يلي: نناقش هنا على وجه التحديد المشكلات التي تمت مواجهتها في إصدار Tomcat 5.5. لماذا هذا الإصدار محدد بشكل خاص، سأشرح ذلك بعد قليل.
السؤال 1: لا يمكن إنشاء برنامج تشغيل JDBC من الفئة '' لعنوان URL للاتصال 'null'
إجابة:
[تحليل السبب]
اكتشف العديد من الأصدقاء أن الخطأ أعلاه حدث عند استدعاء تجمع الاتصال بعد تكوين $Tomcat/conf/server.xml أو $Tomcat/conf/context.xml أو حتى WEB-INF/web.xml. عند تحليل سبب الخطأ، يكون ذلك عمومًا لأننا لم نربط مصدر البيانات (السبب الفعلي للخطأ هو أن إعدادات driverClassName وurl فارغة، لكننا بالتأكيد لن ننسى تعيين هذا المكان، لذلك يجب علينا أكملت الإعدادات دون الاتصال!). عادةً ما تكون هناك طريقتان لتكوين مصدر البيانات (وليس فقط طريقة الإعداد في $Tomcat/conf/context.xml). إحداهما هي إضافة الكود التالي قبل </GlobalNamingResources> في $Tomcat/conf/server.xml:
طريقة الإعداد الأولى:
<الموارد
name="jdbc/test" // اسم مصدر البيانات
اكتب = "javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" // هذا هو إعداد driverClassName الذي ذكرته للتو
كلمة المرور = "المشرف" // كلمة مرور قاعدة البيانات
الحد الأقصى = "2"
الحد الأقصى للانتظار = "5000"
اسم المستخدم = "الجذر" // اسم مستخدم قاعدة البيانات
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" // عنوان URL لقاعدة البيانات، وهو عنوان url المذكور للتو
maxActive="4"/>
باستثناء الحالات التي توجد فيها تعليقات، يتم استخدام جميع المعلمات لتعيين عدد الاتصالات وحالة الخمول وحالة النشاط. إذا كنت تقوم فقط بتجربة تعليمية، فلن تحتاج إلى تغييرها. تأثير هذه الطريقة يعادل تكوين العمليات في واجهة Tomcat الرسومية.
هناك طريقة أخرى وهي إضافة الكود التالي إلى <Context ...></Context> في $Tomcat/conf/server.xml:
طريقة الإعداد الثانية:
<اسم المورد = "jdbc/test" auth = "الحاوية" نوع = "javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<المعلمة>
<الاسم>المصنع</الاسم>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</المعلمة>
<المعلمة>
<الاسم>اسم المستخدم</الاسم>
<القيمة>الجذر</القيمة>
</المعلمة>
<المعلمة>
<الاسم>كلمة المرور</الاسم>
<value>المسؤول</value>
</المعلمة>
<المعلمة>
<الاسم>اسم فئة السائق</الاسم>
<value>com.mysql.jdbc.Driver</value>
</المعلمة>
<المعلمة>
<الاسم>عنوان URL</الاسم>
<value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value>
</المعلمة>
<المعلمة>
<الاسم>الحجم الأولي</الاسم>
<القيمة>20</القيمة>
</المعلمة>
<المعلمة>
<الاسم>ماكس أكتيف</الاسم>
<القيمة>30</القيمة>
</المعلمة>
<المعلمة>
<name>maxWait</name>
<القيمة>10000</القيمة>
</المعلمة>
</ResourceParams>
الغرض المعتاد من هذا الإعداد هو السماح بتنفيذ مصدر البيانات في دليل تعيين منفصل، أي عادة ما يظهر هذا الرمز في <Context docBase = "الدليل المحدد (مثل D:webappsmyjsp) " path= "اسم الوصول (مثل /myjsp)" reloadable="true"></Context>، بحيث يمكنك الوصول إلى ملف في D:webappsmyjsp عن طريق الوصول إلى http://localhost:8080/myjsp/ XXX.jsp تقوم صفحة jsp بعد ذلك باسترداد مصدر البيانات أو إجراء عمليات أخرى لاسترداد مصدر البيانات.
المشكلة هي، بغض النظر عن الطريقة، لا أحد متصل! إذا لم تستخدم ResourceLink، فلن تتمكن الحبة أو الحبة من العثور على الكود الذي قمت بتعيينه. كيف يمكنك العثور على driverClassName وعنوان url؟ في الواقع، لن يتم العثور على أي من إعدادات المعلمة!
[حل]
وبمجرد معرفة السبب، سيكون الحل أسهل. بغض النظر عن الطريقة التي تستخدمها.
الحل الأول:
إذا كنت تريد تنفيذ ResourceLink في دليل التعيين، أضف <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource" في منتصف <Context...></Context> "/>، يرجى ملاحظة أنه إذا لم تفهم علاقة الكود، فيجب عليك كتابتها بعناية بعد <Context...>.
الحل الثاني:
إذا كنت تريد جعله عالميًا وقابلاً للاستخدام في جميع أدلة الخرائط، فما عليك سوى كتابته في $Tomcat/conf/context.xml وسيكون كل شيء على ما يرام.
بشكل عام، يقوم الجميع بتعيين "اسم مصدر البيانات" و"الاسم المعين" ليكونا متماثلين، على سبيل المثال، قمت بتعيينه على النحو التالي: <ResourceLink global="jdbc/test" name="jdbc/test" type="javax. sql.DataSource" "/>.
بالإضافة إلى ذلك، تجدر الإشارة إلى أنه في Tomcat5.5، إذا قمت بإعداد الطريقة الثانية أعلاه، حتى إذا قمت بإضافة ResourceLink، فسوف تواجه مشكلة عدم التشغيل بشكل صحيح.
السؤال 2: javax.naming.NameNotFoundException: الاسم XXX غير مرتبط بهذا السياق
إجابة:
[تحليل السبب]
في Tomcat5.5، لا يعمل تعيين مصدر البيانات في <Context...><Context> بشكل صحيح. لقد قرأت منشورًا كتبه شخص أجنبي. مستواي في اللغة الإنجليزية ليس مرتفعًا، لكن يمكنني فهمه. وقال إن هذا لأنه في الإصدارات الأعلى (يجب أن يكون Tomcat وdbcp)، تم تغيير قيمة المصنع من org.apache.commons.dbcp.BasicDataSourceFactory إلى org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory. لكني جربته ولم يحل المشكلة. ووجدت أن الإصدار القياسي من Tomcat5.5 يأتي مزودًا بـ dbcp، الموجود في $Tomcatcommonlib. قرأت شرحًا لأحد مستخدمي الإنترنت، فقال إن طريقة الإعداد الثانية غير ممكنة. يوضح هذا أن طريقة الإعداد الثانية تنطبق فقط على الإصدارات السابقة، ولا أعرف الجزء الذي يجب إجراء التغييرات عليه في الإصدار الحالي، ولكن سبب الخطأ هو أنني أريد إعداده معًا، ولا يمكن للخادم العثور عليه. مصدر البيانات المطابق لـ "اسم مصدر البيانات".
[حل]
يمكنك حلها إذا كنت تعرف السبب. ويبدو أنها تعمل فقط إذا تم الإعلان عن مصدر البيانات في <GlobalNamingResources>. لذلك يمكن للجميع إعداد Tomcat5.5 وفقًا لطريقة الإعداد الأولى (ولهذا السبب أتحدث عن Tomcat5.5 على وجه الخصوص).
السؤال 3: لا يمكن تحميل فئة برنامج تشغيل JDBC "com.mysql.jdbc.Driver"
إجابة:
[تحليل السبب]
ليس فقط لـ mysql، ولكن أيضًا لقواعد البيانات الأخرى، طالما أنه لا يمكن العثور عليه، سيتم طرح هذا الخطأ "لا يمكن تحميل فئة برنامج تشغيل JDBC"، فلماذا لا يمكن العثور على فئة برنامج تشغيل قاعدة البيانات؟ كيفية العثور عليه؟ انها في الواقع بسيطة جدا.
[حل]
ما عليك سوى نسخ jdbc إلى $Tomcatcommonlib.
السؤال 4: لا يمكن الاتصال، حمام السباحة مرهق
[تحليل السبب]
الأمر بسيط للغاية. لا يمكن إنشاء الاتصال ويفيض تجمع الاتصال، مما يعني إهدار موارد الاتصال الخاصة بك لأنك لم تقم بإعادة تدويرها في الوقت المناسب.
[حل]
استخدم طريقة Close() بشكل سريع وصحيح لتحرير ResultSet وStatement وConnection. لن أخوض في العبارات المحددة، ومن المستحسن كتابتها أخيرًا.
ملخص: لذا، إذا كنت تريد استخدام Tomcat5.5 لإنشاء تجمع اتصال مصدر بيانات، فهناك ثلاث خطوات فقط.
أولاً: قم بتعيين مصدر البيانات. يوصى باستخدام واجهة التشغيل الرسومية إذا قمت بذلك يدويًا، فأضف الكود التالي قبل </GlobalNamingResources> في $Tomcat/conf/server.xml:
<Resource.
name="jdbc/test" // اسم مصدر البيانات
اكتب = "javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" // هذا هو إعداد driverClassName الذي ذكرته للتو
كلمة المرور = "المشرف" // كلمة مرور قاعدة البيانات
الحد الأقصى = "2"
الحد الأقصى للانتظار = "5000"
اسم المستخدم = "الجذر" // اسم مستخدم قاعدة البيانات
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" // عنوان URL لقاعدة البيانات، وهو عنوان url المذكور للتو
maxActive="4"/>
إلى معلمات التعليق الخاصة بك.
ثانياً: إعداد اتصال الموارد. يوصى بكتابة <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource"/> في $Tomcat/conf/context.xml إذا كنت تريد تعيينه في ملف منفصل تتم كتابة تنفيذ الدليل بعد <Context...> في الدليل الذي يجب تعيينه في $Tomcat/conf/server.xml.
ثالثًا: انسخ JDBC إلى $Tomcatcommonlib
بالإضافة إلى ذلك، لن أشرح بالتفصيل كيفية استدعاء مصدر البيانات هنا. هذه المشكلة بسيطة نسبيًا، لكن يرجى ملاحظة أن DataSource ds=(DataSource)envCtx.lookup(" مصدر البيانات المرجعي ")؛ "مصدر البيانات المشار إليه" في البيان هو فقط "الاسم المعين"، وليس "اسم مصدر البيانات"، لذلك أقترح عليك تعيين الاسمين ليكونا متماثلين من أجل الراحة. وإيلاء اهتمام خاص لتحرير الموارد الخاملة في الوقت المناسب، وإلا فسوف يفيض تجمع الاتصال!
ما ورد أعلاه هو بعض نتائج بحثي اليوم، وأنا لا أزال مبتدئًا وآمل أن يكون هذا المقال مفيدًا للجميع. إذا كان لديك أي أسئلة، يرجى الاتصال بي بريدي الإلكتروني هو: [email protected] (الأشخاص الذين يحبون رؤية أضواء النيون). هذه المقالة أصلية لموقع neonlight.bokee.com (CSDN_MathMagician) ولا يمكن إعادة إنتاجها! 11 أغسطس 2006
http://blog.csdn.net/mathmagician/archive/2007/03/01/1518689.aspx