Tomcat üzerinden veya harici olarak JDBC konektörü üzerinden mysql'e bağlanılamıyor


17

Ben bir stok mysql 5.5 kurulum yükledim ve mysql komutuyla mysql hizmetine bağlanabilirken ve hizmet çalışıyor gibi görünüyor, ben bahar + tomcat veya harici bir jdbc bağlayıcı üzerinden bağlanamıyorum.

Aşağıdaki URL'yi kullanıyorum:

jdbc:mysql://myserver.com:myport/mydb

uygun kullanıcı adı / şifre ile, ancak aşağıdaki mesajı alıyorum:

server.com: 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.

ve tomcat atar:

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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

Bu, harici olarak bağlanmaya çalıştığım gibi aynı sorun gibi görünüyor.


LAN üzerinden başka bir sunucuda çalışan mysql veritabanına java üzerinden bağlanmaya çalışırken bu sorunla karşı karşıya kaldım. mysql çalıştıran sunucuda aynı java programı yürütürken sorun olmadan bağlandı. harici makineden mysql veritabanına örneğin SQLYog kullanarak bağlanabildim (ilk olarak 127.0.0.1 yerine 0.0.0.0'a bağlanmak için my.cnf dosyasını değiştirmek zorunda kaldım). Boden'in yanıtı ve JDBC konektörünü değiştirme hakkındaki yorum beni doğru yönde gösterdi. JDBC bağlayıcısını en son sürüme değiştirdim ve aniden çalıştı!
user2380870

Yanıtlar:


18

Bu çeşitli nedenlerle olabilir. Birkaç hafta önce kendim gördüm ama düzeltmenin benim için ne olduğunu hatırlayamıyorum.

1) mysql adresinin bağlı olduğunu doğrulayın, muhtemelen 127.0.0.1 (sadece) varsayılan (en azından standart Ubuntu sunucusunda) olduğuna inanıyorum. Kullanılabilir tüm adreslere bağlanmak için my.cnf dosyasındaki bind-address parametresini yorumlamanız gerekir (çoklu seçemezsiniz, bir veya tümü).

2) 127.0.0.1'e bağlıysa ve "localhost" kullanarak bağlanamıyorsanız, IPv4 yerine IPv6 yerel ana bilgisayar adresine çözümlenmediğinden emin olun. (veya sadece IP adresini kullanın)

3) MySQL'in dinlediği bağlantı noktasını iki ve üç kez kontrol edin.

4) JDK'nız için doğru JDBC bağlayıcısını kullandığınızdan emin olun.

5) mysql'ye --skip-networking ile başlamak gibi gerçekten aptalca bir şey yapmadığınızdan emin olun.

İlk önerimin en çok söz verdiğini düşünüyorum ... aslında son zamanlarda gördüğüm yer burası ... Uzaktan mysql'e bağlanmaya çalışıyordum (ayrıca Ubuntu 8.04'te).


Sadece benim 2cent eklemek için, 4. benim için çalıştı. Teşekkürler!
Janis Peisenieks

1
"Mevcut tüm adreslere bağlanmak için my.cnf dosyasındaki bind-address parametresini yorumlamanız gerekecek" ile ilgili olarak, varsayılan ayar artık yalnızca localhost'ta dinleneceğinden, "bind-address = 0.0 satırını kullanmanız gerekebilir. 0.0 "içinde [mysqld].
Palo

13

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:

  • Linux: /etc/my.cnf

  • Windows: D: \ Program Dosyaları \ mysql \ bin \ my.ini

İş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

  • autoreconnect

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.


Ben de bu sorunu yaşıyordum! Ama başlangıçta 3306 yerine 8888 bağlantı noktasını dinlemek için mysql değişmişti. SO, @ sohail'ın yanıtı yardımcı oldu, ben sadece uri benim 8888 bağlantı noktası ekledi ve çalıştı! Bir demet teşekkürler

Bu benim için problemi çözdü! Vagrant Homestead kurulumumuzla, bir nedenden ötürü, localhost yerine VM'ye (benim durumumda 10.0.2.15) verilen adrese bağlanmaktı.
Lander

1

Bir Linux kurulumu çalıştırıyorsanız, muhtemelen SSH dışında gelen iletişimleri engelleyen lokkitiniz vardır.

Kök olarak oturum açın ve komut isteminden komut istemi komutunu çalıştırın, güvenlik duvarını ve SElinux'u devre dışı bırakın ve aynı sorunun olup olmadığını görün.

Ayrıca, izinlerinizin doğru ayarlandığını da kontrol edin, böylece her şey doğru konumlara yazabilir.


Ubuntu 8.04 kullanıyorum. Muhtemelen bundan bahsetmeliydim. Bu dağıtım için özel talimatlarınız var mı? Birazdan google yapacağım, ama önce soracağımı düşündüm.
Stefan Kendall

sudo ufw devre dışı bırakma Ubuntu Güvenlik Duvarını devre dışı bırakacak
Stephen Thompson

Ufw yükledim ve bağlantı noktasını etkinleştirmeye çalıştım, ancak zar yok.
Stefan Kendall

ufw ve iptables zaten kaldırılmıştı. Ufw'nin ayrı olarak yüklenmesi gereken bir yönetim aracı olduğunu düşündüm. Tabii ki, "iptables" böyle bir komut vermez ve hiçbir iptables servisi çalışıyor gibi görünüyor.
Stefan Kendall

Tamam sonunda sık sık bulduğum şey, mysql'ın eth0 arabirimini ve genellikle yalnızca localhost arabirimini dinlemesini etkinleştirmemeniz. Takip etmeyi dene. Jdbc: mysql: //myserver.com: myport / mydb öğesini jdbc: mysql: // localhost: myport / mydb olarak değiştirirseniz, aşağıdaki dev.mysql.com/doc/refman/5.1/tr/ can-not-connect-to-server.html
Stephen Thompson


1

Bu, yanlış proxy ayarlarından da kaynaklanabilir . Bu sorun, Mac'imde bir Parallels sanal cihazında çalışan bir MySQL örneğine jdbc aracılığıyla bağlanmaya çalışırken yaşadım. Jdbc bağlantısı sistem düzeyinde ağ ayarlarını kullanır ve bir SOCKS proxy'sinin arkasında olduğumdan beri MySql ana bilgisayarını proxy olmayan bir ana bilgisayar olarak ayarlamam gerekiyordu (örneğin, Mac'te bunu Ayarlar-> Ağ-> Gelişmiş- > Proxy'ler ve son olarak "Bu Ana Bilgisayarlar ve Alan Adları için proxy ayarlarını atla" bölümüne ana bilgisayar adını veya IP adresini ekleyin).


1

MySQL Bağlayıcısı / J yalnızca TCP / IP Java'yı destekler Unix etki alanı soket bağlantısını desteklemez

MYSQL ağ atlama bayrağı ile başlatılırsa veya MySQL güvenlik duvarının arkasında çalışıyorsa, TCP / IP seçeneği devre dışı bırakılır. Böylece Java MySQL ile iletişim kuramaz.


0

Neredeyse bir gün çok benzer bir sorun vardı ve bu beni deli etti! ama çözümü bulmayı başardım ve çok, çok basitti, sadece TOMCAT6_SECURITY = yes değerini TOMCAT6_SECURITY = no olarak değiştirmek için /etc/init.d/tomcat6 gerekiyor. benim çözümüm değil, burada buldum , gördüğünüz gibi ubuntu kullanıyorum, umarım bu işe yarar.


0

Ben de aynı problemi yaşadım. /Etc/mysql/my.cnf dosyasındaki "bind-address" özelliği 0.0.0.0 olarak değiştirildi ve çalışıyor. My.cnf dosyasındaki karşılık gelen satır şöyle:

bağlama adresi = 0.0.0.0

Sunucunun dış ip adresine ayarlanmadan önce şöyle görünüyordu:

bağlama adresi = 196.152.4.145

Ben yerelhost döngü değil, dış ip adresine ayarlandığında, mysql sunucusu sadece ağ kartına bağlı olduğunu ve yerel döngü bağlantılarını dinlemiyorum düşünüyorum.


0

my.cnf dosyasındaki adresi bağlamak için yerel adresinizi deneyin

Bağlantı con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.