Aynı problemi iki programımda da yaşadım. Benim hatam şuydu:
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.
Bu sorunu çözmek için birkaç gün geçiriyorum. Farklı web sitelerinde bahsedilen birçok yaklaşımı test ettim, ancak bunların hiçbiri işe yaramadı. Sonunda kodumu değiştirdim ve sorunun ne olduğunu öğrendim. Size farklı yaklaşımlardan bahsetmeye ve bunları özetlemeye çalışacağım .
Bu hatanın çözümünü bulmak için internet ararken, en az bir kişi için işe yarayan birçok çözüm olduğunu anladım , ancak diğerleri bunun onlar için işe yaramadığını söylüyor! neden bu hataya birçok yaklaşım var?
Öyle görünüyor bu hata oluşabilir genellikle sunucusuna bağlanırken bir sorun olduğunda . Belki de sorun yanlış sorgu dizesi veya veritabanına çok fazla bağlantıdan kaynaklanıyor olabilir.
Bu yüzden tüm çözümleri tek tek denemenizi ve pes etmemenizi öneririm!
İşte internette bulduğum çözümler ve her biri için en azından probleminin bu çözümle çözüldüğü kişi var.
noktası: MySQL ayarlarını değiştirmeniz gereken çözümler için aşağıdakilere başvurabilirsiniz:
İşte çözümler:
- "bağlama adresi" özelliğini değiştirme
"Bağlama adresi" özelliğini kaldırın veya aşağıdaki Ips'lerden biriyle değiştirin:
bind-address = "127.0.0.1"
veya
bind-address = "0.0.0.0"
- "ağ atlama" için yorum yapma
MySQL yapılandırma dosyanızda "atlama ağı" satırı varsa, bu satırın başına "#" işareti ekleyerek yorum yapın.
- "wait_timeout" ve "interactive_timeout" öğelerini değiştir
Bu satırları MySQL yapılandırma dosyasına ekleyin:
wait_timeout = sayı
interactive_timeout = sayı
connect_timeout = sayı
- İşletim Sistemi proxy ayarlarını kontrol edin
Yangın duvarının veya Anti virüs yazılımlarının MySQL hizmetini engellemediğinden emin olun.
- bağlantı dizesini değiştir
Sorgu dizenizi kontrol edin. bağlantı dizeniz böyle bir şey olmalıdır:
dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
Dizenizde boşluk olmadığından emin olun. Tüm bağlantı dizesi boşluk karakteri olmadan devam etmelidir.
127.0.0.1 gibi "localhost" u portunuzla değiştirmeyi deneyin. Ayrıca bağlantı dizenize bağlantı noktası numarası eklemeyi deneyin, örneğin:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
Genellikle MySQL için varsayılan bağlantı noktası 3306'dır.
Kullanıcı adını ve şifreyi MySQL sunucunuzun kullanıcı adı ve şifresine değiştirmeyi unutmayın.
- JDK sürücü kitaplığı dosyanızı güncelleyin
- farklı JDK ve JRE'leri test edin (JDK 6 ve 7 gibi)
- max_allowed_packet değiştirmeyin
" max_allowed_packet ", MySQL yapılandırma dosyasında maksimum paket boyutunu değil, maksimum paket boyutunu belirten bir değişkendir. Bu yüzden bu hatayı çözmek yardımcı olmaz.
- tomcat güvenliğini değiştir
TOMCAT6_SECURITY = evet olarak TOMCAT6_SECURITY = no olarak değiştir
- validationQuery özelliğini kullan
her sorgunun yanıt verdiğinden emin olmak için validationQuery = "select now ()" kullanın
Bu kodu bağlantı dizenize ekleyin:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
Bu çözümlerin hiçbiri benim için işe yaramasa da, bunları denemenizi öneririm. Çünkü bazı insanlar bu adımları izleyerek sorunlarını nasıl çözdüler.
Ama sorunumu ne çözdü? Benim sorunum, veritabanında birçok SELECTs vardı. Her bağlantı kurduğumda kapattım. Bağlantıyı her seferinde kapatmama rağmen, sistem birçok bağlantıyla karşılaştı ve bana bu hatayı verdi. Yaptığım şey, bağlantı değişkenimi tüm sınıf için genel (veya özel) bir değişken olarak tanımlamak ve yapıcıda başlatmaktı. Sonra bu bağlantıyı her kullandığımda. Sorunumu çözdü ve hızımı önemli ölçüde artırdı.
Sonuç
Bu sorunu çözmenin basit ve benzersiz bir yolu yoktur. Kendi durumunuzu düşünmenizi ve yukarıdaki çözümleri seçmenizi öneririm. Bu hatayı programın başında alırsanız ve veritabanına hiç bağlanamıyorsanız, bağlantı dizenizde sorun olabilir. Ancak, veritabanıyla birkaç başarılı etkileşimden sonra bu hatayı alırsanız, sorun bağlantı sayısıyla ilgili olabilir ve "wait_timeout" ve diğer MySQL ayarlarını değiştirmeyi düşünebilir veya bağlantı sayısını nasıl azaltacağını kodunuzu yeniden yazabilirsiniz.