วันหนึ่ง ไม่สามารถเปิดหน้าเว็บบนเซิร์ฟเวอร์ได้ และมีการรายงานข้อผิดพลาดต่อไปนี้บ่อยครั้ง
18-03-2550 1:08:26 org.apache.tomcat.util.threads.ThreadPool บันทึกเต็ม
รุนแรง: ขณะนี้เธรดทั้งหมด (150) กำลังยุ่งอยู่ กำลังรอ เพิ่ม maxThreads (150) หรือตรวจสอบสถานะเซิร์ฟเล็ต
ฉันพบคำตอบบางส่วนทางออนไลน์ นี่คือคำตอบที่ฉันคิดว่าถูกต้อง:
1. ฉันคิดว่าทรัพยากรบางส่วนของคุณยังไม่ถูกปล่อยออกมาและติดอยู่เนื่องจากมีงานค้างอยู่
2. ปัญหาพูลการเชื่อมต่อ
3. ควรเกิดจากเวลาการประมวลผลที่ยาวนานของเธรดที่ตอบสนองต่อคำขอทางฝั่งเซิร์ฟเวอร์
:
ในขณะนั้นมีคนใช้เว็บไซต์เพียง 2 คน ดังนั้นจึงเป็นไปไม่ได้ที่ 150 เธรดจะออนไลน์พร้อมกัน ดังนั้นจึงไม่ควรเป็นปัญหาฐานข้อมูล
เมื่อพิจารณาจากข้อความแจ้งข้อผิดพลาด ควรเกิดจากการใช้พูลการเชื่อมต่ออย่างไม่สมเหตุสมผล หรือไม่ได้ตั้งค่าพูลการเชื่อมต่อเลย ส่วนที่เชื่อมต่อกับฐานข้อมูลเชื่อมต่อโดยใช้แหล่งข้อมูล JDBC ของ Spring ดังนี้
<ถั่ว>
<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>
ปัญหาควรเกิดขึ้นกับ DriverManagerDataSource ของ Spring ซึ่งรับผิดชอบในการจัดการการเชื่อมต่อเหล่านี้
ต่อไปนี้เป็นคำอธิบายของ DriverManagerDataSource
DriverManagerDataSource ใน Spring Framework
javax.sql อินเทอร์เฟซ DataSource
การใช้งาน SmartDataSource ที่กำหนดค่าไดรเวอร์ JDBC เก่าธรรมดาผ่าน
คุณสมบัติ bean และส่งคืนการเชื่อมต่อใหม่ทุกครั้ง
มีประโยชน์สำหรับการทดสอบหรือสภาพแวดล้อมแบบสแตนด์อโลนภายนอกคอนเทนเนอร์ J2EE เช่นกัน
เป็น DataSource bean ใน ApplicationContext ที่เกี่ยวข้องหรือร่วมกับ
สภาพแวดล้อม JNDI แบบธรรมดา การเรียกใช้ Connection.close() แบบพูลจะง่ายดาย
ปิดการเชื่อมต่อ ดังนั้นโค้ดการคงอยู่ของ DataSource-aware ใดๆ ควรใช้งานได้
ในคอนเทนเนอร์ J2EE ขอแนะนำให้ใช้ JNDI DataSource ที่จัดเตรียมโดย
คอนเทนเนอร์ DataSource ดังกล่าวสามารถส่งออกเป็น DataSource bean ในไฟล์
ApplicationContext ผ่าน JndiObjectFactoryBean เพื่อการสลับไปมาอย่างราบรื่น
DataSource bean ในเครื่องเช่นคลาสนี้
หากคุณต้องการพูลการเชื่อมต่อ "ของจริง" นอกคอนเทนเนอร์ J2EE ให้พิจารณา
BasicDataSource ของ Apache จาก Jakarta Commons เป็นกลุ่มการเชื่อมต่อเต็มรูปแบบ
bean ซึ่งรองรับคุณสมบัติพื้นฐานเช่นเดียวกับคลาสนี้พร้อมการตั้งค่าเฉพาะ
สามารถใช้แทนอินสแตนซ์ของคลาสนี้ได้เพียงแค่เปลี่ยน
ชื่อคลาสของคำจำกัดความ bean ถึง
"org.apache.commons.dbcp.BasicDataSource"
-------------------------------------- --------- ----------
โครงการจาการ์ตาจำนวนมากสนับสนุนการโต้ตอบกับฐานข้อมูลเชิงสัมพันธ์
การเชื่อมต่อใหม่สำหรับผู้ใช้แต่ละคนอาจใช้เวลานาน (มักต้องใช้หลายรายการ)
วินาทีของเวลานาฬิกา) เพื่อดำเนินการธุรกรรมฐานข้อมูลที่อาจ
ใช้เวลาเป็นมิลลิวินาที การเปิดการเชื่อมต่อต่อผู้ใช้อาจไม่สามารถทำได้ใน
แอปพลิเคชันอินเทอร์เน็ตที่โฮสต์โดยสาธารณะซึ่งจำนวนผู้ใช้พร้อมกันสามารถทำได้
มีขนาดใหญ่มาก ดังนั้น นักพัฒนาจึงมักต้องการแบ่งปัน "พูล" ของการเปิดกว้าง
การเชื่อมต่อระหว่างผู้ใช้ปัจจุบันของแอปพลิเคชันทั้งหมด
การดำเนินการตามคำขอจริง ๆ ในเวลาใดก็ตามมักมีขนาดเล็กมาก
เปอร์เซ็นต์ของจำนวนผู้ใช้ที่ใช้งานอยู่ทั้งหมด และในระหว่างการประมวลผลคำขอคือ
เพียงครั้งเดียวที่จำเป็นต้องมีการเชื่อมต่อฐานข้อมูล
เข้าสู่ระบบ DBMS และจัดการปัญหาบัญชีผู้ใช้ภายใน
มีกลุ่มการเชื่อมต่อฐานข้อมูลหลายรายการอยู่แล้ว ทั้งสองอยู่ภายใน
ผลิตภัณฑ์จากจาการ์ตาและที่อื่นๆ แพ็คเกจ Commons นี้เปิดโอกาสให้
ประสานงานความพยายามที่จำเป็นในการสร้างและรักษาประสิทธิภาพ
แพ็คเกจที่มีฟีเจอร์หลากหลายภายใต้ลิขสิทธิ์ ASF
แพ็คเกจ commons-dbcp อาศัยรหัสในแพ็คเกจคอมมอนส์พูลเพื่อจัดเตรียม
กลไกกลุ่มอ็อบเจ็กต์พื้นฐานที่ใช้ แอปพลิเคชัน
สามารถใช้คอมโพเนนต์ commons-dbcp ได้โดยตรงหรือผ่านคอมโพเนนต์ที่มีอยู่
อินเทอร์เฟซของคอนเทนเนอร์ / เฟรมเวิร์กที่รองรับ เช่น Tomcat
servlet คอนเทนเนอร์นำเสนอ DBCP DataSource เป็นแหล่งข้อมูล JNDI James (Java
Apache Mail Enterprise Server) ได้รวม DBCP เข้ากับเฟรมเวิร์ก Avalon A
แหล่งข้อมูลสไตล์ Avalon ถูกสร้างขึ้นโดยการรวมการใช้งาน DBCP
ตรรกะการรวมกลุ่มของ DBCP และการกำหนดค่าที่พบในโค้ดเอ็กซ์คาลิเบอร์ของ Avalon คือ
สิ่งที่จำเป็นในการสร้างแหล่งข้อมูลที่เชื่อถือได้แบบรวม
หลังจากอ่านคำอธิบายแล้ว ความจริงก็คือเมื่อสร้างการเชื่อมต่อ DriverManagerDataSource จะสร้างการเชื่อมต่อใหม่ตราบใดที่มีการเชื่อมต่อ และไม่มีพูลการเชื่อมต่อเลย จะดีกว่าหากเปลี่ยนไปใช้พูลการเชื่อมต่อโอเพ่นซอร์สต่อไปนี้
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" ทำลายวิธีการ = "ปิด">
<ชื่อคุณสมบัติ="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</คุณสมบัติ>
<ชื่อคุณสมบัติ="url">
<value>jdbc:hsqldb:hsql://localhost:9001</value>
</คุณสมบัติ>
<ชื่อคุณสมบัติ="ชื่อผู้ใช้">
<value>sa</value>
</คุณสมบัติ>
<ชื่อคุณสมบัติ="รหัสผ่าน">
<ค่า></ค่า>
</คุณสมบัติ>
</bean>
การทดสอบผ่านไปแล้วและปัญหาจะหมดไป หากไม่มีเครื่องมือค้นหาที่จะค้นหาคำตอบ ปัญหาก็จะไม่ได้รับการแก้ไขอย่างรวดเร็ว