2017-12-21 5 views
1

JDBCを使用する2つのアプリケーションとMySQLをEclipse Neonで開きました。2つのアプリケーションがmysqlデータベースに接続するためにJDBCを使用します:1つは動作し、もう1つは「ネットワークアダプタが接続を確立できませんでした」

一つのアプリケーションがあります。

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","root","password"); 

他のアプリケーションがあります。

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","root","password"); 

私は日食数回に二つのアプリケーションを次々に実行してきました。最初のアプリケーションを実行して、データベースに接続し、データベースを読み書きすることができます。 第二のアプリケーションは、常に私がエラーをググDriverManager.getConnection()方法

java.sql.SQLException: Io exception: The Network Adapter could not establish the connection 

への呼び出しで例外を与え、https://stackoverflow.com/a/12574926/9119247は、それが私のネットワークアダプタの問題であると言っているようです。しかし、そうであれば、なぜそれは1つのアプリケーションでは動作しますが、他のアプリケーションでは動作しませんが、どちらの順序で実行しますか?

+0

おそらく最大接続数に達しました。 –

+0

mySQLにはいくつの接続が許可されていますか?アプリは接続を適切に閉じますか? –

+0

@AndrewSありがとう。私は何度も何度もアプリケーションをデバッグしていますが、ほとんどの場合、closeメソッドに到達せずにデバッグを再開します。それはmysqlサーバーへの接続をますます多く作ることができますか?または、デバッグを終了するたびに、接続自体が閉じられますか? mysqlサーバの接続数を確認するにはどうすればよいですか? –

答えて

2

私は、2番目のアプリケーションがOracleデータベースとMySQLデータベースに接続していると思います。これは、MySQLへの接続ではなく、Oracleへの接続であり、失敗しています。

は、以下の(admittelyむしろ愚かな)コードを取る:

import java.sql.*; 

public class ConnectionsTest { 
    public static void main(String[] args) throws Exception { 
     System.out.println("Connecting to MySQL..."); 
     try { 
      Connection mySQLConnection = DriverManager.getConnection(
        "jdbc:mysql://8.8.8.8/3306/mysql", "X", "X"); 
      System.out.println("Odd, got MySQL connection!"); // Shouldn't get here 
     } 
     catch (SQLException e) { 
      System.out.println("MySQL connection failed: " + e.getMessage()); 
     } 

     System.out.println(); 
     System.out.println("Connecting to Oracle..."); 
     try { 
      Connection oracleConnection = DriverManager.getConnection(
        "jdbc:oracle:thin:@8.8.8.8:1521:ORCL", "X", "X"); 
      System.out.println("Odd, got Oracle connection!"); // Shouldn't get here 
     } 
     catch (SQLException e) { 
      System.out.println("Oracle connection failed: " + e.getMessage()); 
     } 
    } 
} 

このコードは失敗する必要があり、どちらも2つのデータベース接続、Oracleへの1とMySQLのいずれかを作るしようとします。 (サーバー8.8.8.8は、いずれかのデータベースを実行されることはありません。)私はこのコードを実行すると、私は次のような出力を得る:

Connecting to MySQL... 
MySQL connection failed: 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. 

Connecting to Oracle... 
Oracle connection failed: IO Error: The Network Adapter could not establish the connection 

注MySQLの接続に失敗したエラーは、あなたが取得しているものと異なっていることを、オラクルは一致します。

+0

を入れてください。これは、原因に関する大きな推測だと思います。もちろん、スタックトレースを調べてエラーがどこで発生しているかを見るだけで、(OPによって)簡単に検証できます。 – Andreas

+0

こんにちはルーク、私はUbuntuを実行しており、Oracle DatabaseはUbuntuをサポートしていません。2つのアプリケーションのデータベース接続部分は私の投稿に表示されていて、どちらもMySQL用です。 –

+0

@Mary:Ubuntu、開発マシン、またはデータベースサーバーは何を実行していますか? Ubuntuを使用している場合は、データベースが別のマシンにある可能性があります。また、どこにでもOracleデータベースがないかもしれませんが、Oracle JDBCドライバを使用して(存在しない)Oracleデータベースに接続しようとするコードがアプリケーションにまだ残っています。 「ネットワーク・アダプタが接続を確立できませんでした」というメッセージは、Oracleツールの特徴であり、これが私がこの答えを書いた理由です。 –

-1

すべてのことを閉じています。 JDBCは、try-with-resourcesで最もよく使用されます。接続の場合

try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", 
      "root", "password")) { 
    try (PreparedStatement stmt = conn.prepareStatement(...)) { 
     ... 
     try (ResultSet rs = stmt.executeQuery()) { 
      ... return/throw ... no problem 
     } 
    } 
} 

接続を確立すると、その通行料を取るよう接続プールは、アプリケーションを高速化オプションです。 (2,3年後にClass.forNameは必要ありません)

+0

ありがとう、Joop!私は、2番目のアプリケーションが準備されたステートメントで接続に近い操作をしていないことに気付きました。最初のものはそうします。私は、2番目のアプリケーションに "java.sql.SQLException:Io exception:ネットワークアダプタが接続を確立できませんでした"を引き起こす可能性があるのだろうかと疑問に思っていました。 –

+0

オペレーティングシステムのコンポーネントでは、これは重大なリソースリークです。何年も前から遭遇したことはないので、もっと分かりません。幸いにも、最初に何が行われるべきかについて疑問はありません。 –

+0

Downvotedなぜ同じコードが明らかに1つのケースで動作し、他のケースでは動作しないのかがわからないからです。 –

関連する問題