เกี่ยวกับคำอธิบายโดยละเอียดเกี่ยวกับปัญหาพูลการเชื่อมต่อระหว่าง 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"
maxWait="5000"
ชื่อผู้ใช้ = "root" // ชื่อผู้ใช้ฐานข้อมูล
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //URL ฐานข้อมูล ซึ่งเป็น URL ที่เพิ่งกล่าวถึง
maxActive="4"/>
ยกเว้นกรณีที่มีความคิดเห็น พารามิเตอร์ทั้งหมดจะถูกใช้เพื่อกำหนดจำนวนการเชื่อมต่อ สถานะการไม่ได้ใช้งาน และสถานะกิจกรรม หากคุณเพียงทำการทดลองการเรียนรู้ คุณไม่จำเป็นต้องเปลี่ยนแปลง ผลของวิธีนี้เทียบเท่ากับการกำหนดค่าการดำเนินการในส่วนติดต่อแบบกราฟิก Tomcat
อีกวิธีหนึ่งคือการเพิ่มโค้ดต่อไปนี้ใน <Context ...></Context> ใน $Tomcat/conf/server.xml:
การตั้งค่าวิธีที่สอง:
<ชื่อทรัพยากร = "jdbc/test" auth = "คอนเทนเนอร์" type = "javax.sql.DataSource"/>
<ชื่อ ResourceParams = "jdbc/test">
<พารามิเตอร์>
<ชื่อ>โรงงาน</ชื่อ>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</พารามิเตอร์>
<พารามิเตอร์>
<ชื่อ>ชื่อผู้ใช้</ชื่อ>
<value>ราก</value>
</พารามิเตอร์>
<พารามิเตอร์>
<ชื่อ>รหัสผ่าน</ชื่อ>
<value>ผู้ดูแลระบบ</value>
</พารามิเตอร์>
<พารามิเตอร์>
<ชื่อ>ชื่อไดรเวอร์คลาส</ชื่อ>
<value>com.mysql.jdbc.ไดรเวอร์</value>
</พารามิเตอร์>
<พารามิเตอร์>
<ชื่อ>URL</ชื่อ>
<value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value>
</พารามิเตอร์>
<พารามิเตอร์>
<ชื่อ>ขนาดเริ่มต้น</ชื่อ>
<ค่า>20</ค่า>
</พารามิเตอร์>
<พารามิเตอร์>
<name>maxActive</name>
<ค่า>30</ค่า>
</พารามิเตอร์>
<พารามิเตอร์>
<name>maxWait</name>
<value>10,000</value>
</พารามิเตอร์>
</ResourceParams>
วัตถุประสงค์ปกติของการตั้งค่านี้คือเพื่ออนุญาตให้นำแหล่งข้อมูลไปใช้ในไดเร็กทอรีการแมปที่แยกต่างหาก ซึ่งโดยปกติแล้วโค้ดนี้จะปรากฏใน <Context docBase=" specific directory (เช่น D:webappsmyjsp) " path= "ชื่อการเข้าถึง (เช่น /myjsp)" reloadable="true"></Context> เพื่อให้คุณสามารถเข้าถึงไฟล์ใน D:webappsmyjsp โดยการเข้าถึง http://localhost:8080/myjsp/ XXX.jsp จากนั้นเพจ jsp จะดึงแหล่งข้อมูลหรือดำเนินการอื่นเพื่อดึงแหล่งข้อมูล
ปัญหาคือไม่ว่าวิธีไหนก็ไม่มีใครเชื่อมต่อ! หากคุณไม่ใช้ ResourceLink bean หรือ bean จะไม่สามารถค้นหารหัสที่คุณตั้งไว้ได้ คุณจะค้นหา 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"
maxWait="5000"
ชื่อผู้ใช้ = "root" // ชื่อผู้ใช้ฐานข้อมูล
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 สิงหาคม 2549
http://blog.csdn.net/mathmagician/archive/2007/03/01/1518689.aspx