ฉันมีปัญหาเดียวกันในสองโปรแกรมของฉัน ข้อผิดพลาดของฉันคือ:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
ฉันใช้เวลาหลายวันเพื่อแก้ปัญหานี้ ฉันได้ทดสอบวิธีการมากมายที่ได้กล่าวถึงในเว็บไซต์ต่าง ๆ แต่ไม่ใช่วิธีการทำงาน ในที่สุดฉันก็เปลี่ยนรหัสและพบว่าปัญหาคืออะไร ฉันจะพยายามที่จะบอกคุณเกี่ยวกับวิธีการที่แตกต่างกันและรวมพวกเขาขึ้นที่นี่
ในขณะที่ฉันกำลังค้นหาอินเทอร์เน็ตเพื่อค้นหาวิธีแก้ไขปัญหาสำหรับข้อผิดพลาดนี้ฉันพบว่ามีวิธีแก้ไขปัญหามากมายที่ใช้งานได้อย่างน้อยหนึ่งคน แต่คนอื่นบอกว่าไม่เหมาะกับพวกเขา! ทำไมมีหลายวิธีในการแก้ไขข้อผิดพลาดนี้?
ดูเหมือนว่าข้อผิดพลาดนี้สามารถเกิดขึ้นได้โดยทั่วไปเมื่อมีปัญหาในการเชื่อมต่อไปยังเซิร์ฟเวอร์ บางทีปัญหาอาจเกิดจากสตริงข้อความค้นหาที่ไม่ถูกต้องหรือมีการเชื่อมต่อกับฐานข้อมูลมากเกินไป
ดังนั้นฉันขอแนะนำให้คุณลองใช้โซลูชันทั้งหมดทีละตัวและอย่ายอมแพ้!
นี่คือคำตอบที่ฉันพบบนอินเทอร์เน็ตและสำหรับแต่ละคนมีอย่างน้อยในคนที่ปัญหาของเขาได้รับการแก้ไขด้วยวิธีแก้ปัญหานั้น
จุด: สำหรับโซลูชั่นที่คุณต้องเปลี่ยนการตั้งค่า MySQL คุณสามารถดูได้จาก:
นี่คือโซลูชั่น:
- การเปลี่ยนแอตทริบิวต์ "bind-address"
แอตทริบิวต์ Uncomment "bind-address" หรือเปลี่ยนเป็นหนึ่งใน Ips ต่อไปนี้:
ผูกอยู่ = "127.0.0.1"
หรือ
ผูกอยู่ = "0.0.0.0"
- แสดงความคิดเห็นออก "ข้ามเครือข่าย"
หากมีบรรทัด "การข้ามเครือข่าย" ในไฟล์ MySQL config ของคุณให้แสดงความคิดเห็นโดยเพิ่มเครื่องหมาย "#" ที่จุดเริ่มต้นของบรรทัดนั้น
- เปลี่ยน "wait_timeout" และ "interactive_timeout"
เพิ่มบรรทัดเหล่านี้ไปยังไฟล์ MySQL config:
wait_timeout = จำนวน
interactive_timeout = จำนวน
connect_timeout = หมายเลข
- ตรวจสอบการตั้งค่าพร็อกซีของระบบปฏิบัติการ
ตรวจสอบให้แน่ใจว่าไฟร์วอลหรือซอฟต์แวร์ป้องกันไวรัสไม่ปิดกั้นบริการ MySQL
ตรวจสอบสตริงการสืบค้นของคุณ สตริงการเชื่อมต่อของคุณควรเป็นดังนี้:
dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
ตรวจสอบให้แน่ใจว่าคุณไม่มีช่องว่างในสตริง สตริงการเชื่อมต่อทั้งหมดควรดำเนินการต่อโดยไม่มีอักขระเว้นวรรค
ลองแทนที่ "localhost" ด้วยพอร์ตของคุณเช่น 127.0.0.1 ลองเพิ่มหมายเลขพอร์ตในสตริงการเชื่อมต่อของคุณเช่น:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
โดยปกติแล้วพอร์ตเริ่มต้นสำหรับ MySQL คือ 3306
อย่าลืมเปลี่ยนชื่อผู้ใช้และรหัสผ่านเป็นชื่อผู้ใช้และรหัสผ่านของเซิร์ฟเวอร์ MySQL ของคุณ
- อัพเดตไฟล์ไลบรารีไดรเวอร์ JDK ของคุณ
- ทดสอบ JDK และ JREs ที่แตกต่างกัน (เช่น JDK 6 และ 7)
- อย่าเปลี่ยน max_allowed_packet
" max_allowed_packet " เป็นตัวแปรในไฟล์ MySQL config ที่ระบุขนาดแพ็คเก็ตสูงสุดไม่ใช่จำนวนแพ็คเก็ตสูงสุด ดังนั้นจะไม่ช่วยแก้ไขข้อผิดพลาดนี้
เปลี่ยน TOMCAT6_SECURITY = ใช่เป็น TOMCAT6_SECURITY = ไม่
- ใช้คุณสมบัติ validationQuery
ใช้ validationQuery = "select now ()" เพื่อให้แน่ใจว่าแบบสอบถามแต่ละคำตอบ
เพิ่มรหัสนี้ในสตริงการเชื่อมต่อของคุณ:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
แม้ว่าวิธีการเหล่านี้จะไม่เหมาะกับฉัน แต่ฉันขอแนะนำให้คุณลองใช้ เพราะมีบางคนแก้ปัญหาด้วยการทำตามขั้นตอนเหล่านี้
แต่สิ่งที่แก้ปัญหาของฉันได้อย่างไร ปัญหาของฉันคือฉันมี SELECT จำนวนมากบนฐานข้อมูล ทุกครั้งที่ฉันสร้างการเชื่อมต่อแล้วปิด แม้ว่าฉันจะปิดการเชื่อมต่อทุกครั้ง แต่ระบบต้องเผชิญกับการเชื่อมต่อจำนวนมากและทำให้ฉันมีข้อผิดพลาด สิ่งที่ฉันทำคือฉันกำหนดตัวแปรการเชื่อมต่อของฉันเป็นตัวแปรสาธารณะ (หรือส่วนตัว) สำหรับชั้นเรียนทั้งหมดและเริ่มต้นได้ในตัวสร้าง จากนั้นทุกครั้งที่ฉันใช้การเชื่อมต่อนั้น มันแก้ปัญหาของฉันและยังเพิ่มความเร็วของฉันอย่างมาก
ข้อสรุป
ไม่มีวิธีที่ง่ายและไม่เหมือนใครในการแก้ปัญหานี้ ฉันแนะนำให้คุณคิดถึงสถานการณ์ของคุณและเลือกวิธีแก้ไขปัญหาข้างต้น หากคุณใช้ข้อผิดพลาดนี้ที่จุดเริ่มต้นของโปรแกรมและคุณไม่สามารถเชื่อมต่อกับฐานข้อมูลได้ทั้งหมดคุณอาจมีปัญหาในสตริงการเชื่อมต่อของคุณ แต่ถ้าคุณใช้ข้อผิดพลาดนี้หลังจากประสบความสำเร็จหลายครั้งในการโต้ตอบกับฐานข้อมูลปัญหาอาจเกิดจากจำนวนการเชื่อมต่อและคุณอาจคิดถึงการเปลี่ยน "wait_timeout" และการตั้งค่า MySQL อื่น ๆ หรือเขียนรหัสของคุณใหม่