私は自分のデータベースが私のJavaプログラムと通信できるようにすることに取り組んでいます。
JDBCを使って、すばやく汚いサンプルプログラムを教えてもらえますか。
私はかなり厄介なエラーを受けています。
Exception in thread "main" 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.
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1122)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2260)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.Java:787)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.Java:49)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.Java:357)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.Java:285)
at Java.sql.DriverManager.getConnection(DriverManager.Java:582)
at Java.sql.DriverManager.getConnection(DriverManager.Java:207)
at SqlTest.main(SqlTest.Java:22)
Caused by: 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.
at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1122)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.Java:344)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2181)
... 12 more
Caused by: Java.net.ConnectException: Connection refused
at Java.net.PlainSocketImpl.socketConnect(Native Method)
at Java.net.PlainSocketImpl.doConnect(PlainSocketImpl.Java:333)
at Java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.Java:195)
at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:182)
at Java.net.SocksSocketImpl.connect(SocksSocketImpl.Java:432)
at Java.net.Socket.connect(Socket.Java:529)
at Java.net.Socket.connect(Socket.Java:478)
at Java.net.Socket.<init>(Socket.Java:375)
at Java.net.Socket.<init>(Socket.Java:218)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.Java:256)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.Java:293)
... 13 more
テストファイルの内容
import com.mysql.jdbc.*;
import Java.sql.Connection;
import Java.sql.DriverManager;
import Java.sql.PreparedStatement;
import Java.sql.ResultSet;
import Java.sql.SQLException;
import Java.sql.Statement;
public class SqlTest {
public static void main(String [] args) throws Exception {
// Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// // edit the jdbc url
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/projects?user=user1&password=123");
// Statement st = conn.createStatement();
// ResultSet rs = st.executeQuery( "select * from table" );
System.out.println("Connected?");
}
}
だから、あなたは持っています
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信リンク障害
Java.net.ConnectException:接続が拒否されました
私は この答え から引用しています。これには、段階的なMySQL + JDBCチュートリアルも含まれています。
SQLException: Connection refused
、Connection timed out
、またはMySQL固有のCommunicationsException: Communications link failure
を取得した場合は、DBにアクセスできないことを意味します。これには、以下の1つ以上の原因が考えられます。
- JDBC URLのIPアドレスまたはホスト名が間違っています。
- JDBC URL内のホスト名がローカルDNSサーバーによって認識されていません。
- JDBC URLにポート番号がないか間違っています。
- DBサーバが停止しています。
- DBサーバーはTCP/IP接続を受け入れません。
- DBサーバとの接続が切れました。
- JavaとDBの間の何かが接続をブロックしています。ファイアウォールまたはプロキシ.
どちらか一方を解決するには、次のアドバイスに従ってください。
- それらを
ping
で検証してテストします。- 代わりにDNSを更新するか、JDBC URLでIPアドレスを使用してください。
- MySQL DBの
my.cnf
に基づいて確認してください。- DBを起動します。
- Mysqldが
--skip-networking option
なしで起動されているか確認してください。- DBを再起動し、それに応じてコードを修正して、
finally
内の接続を閉じます。- ファイアウォールを無効にするか、ポートを許可/転送するようにファイアウォール/プロキシを設定してください。
これが最善の解決策です。
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/DBname", "root", "root");
Connection con = DriverManager.getConnection(
"jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");
あなたのIPアドレスへのLocalhostの置き換え
Javaがヒープ不足になると、この例外が発生します。 RAM個のデータ項目を入力しようとすると、最初に "通信リンクの障害"、次に "OutOfMemoryError "#:。
私はそれをログに記録しました、そして私はメモリ消費を減らし(1/2データを削除する)そしてすべて大丈夫です。
データベース接続が長時間アイドル状態になっていると、このcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException
例外が発生します。
このアイドル接続はconnection.isClosed();
でtrueを返しますが、ステートメントを実行しようとするとこの例外が発生するので、データベースプールを使用することをお勧めします。
私は何時間も同じ問題を抱えています。 MAMPサーバーを使っています
Localhost:[Apache Port]の代わりにMySQLポートを使用してください。
以下はMAMPサーバ用のデフォルトMySQLポートです。
String url = "jdbc:mysql://localhost:8889/db_name";
Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
私はここで間違った木を吠えているかもしれませんが、あなたの例外はあなたのMySQLサーバが利用できないことを示しているようです。
スレッド "main"の例外com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信リンクの失敗サーバーに正常に送信された最後のパケットは0ミリ秒前です。ドライバはサーバからパケットを受信していません。で...
(端末から)試すとどうなりますか
mysql -u username -p
ユーザー名に関連付けられているパスワードの入力を求められます。正しいパスワードを入力すると、mysqlクライアントは接続しますか?
そうでない場合は、プリファレンスからMySQLを起動する必要があります。起動時に実行するように設定することもできます。
私の場合は、mysql-connector-Java
のバージョンが古すぎるということがわかりました。
私のデモでは、私はどういうわけかこのようにmysql-connector-Java
を使います:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.9</version>
</dependency>
しかし、開発環境では、これを使用します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.31</version>
</dependency>
そして私のMySQLバージョンは5.1.48でした(はい、それは製品バージョンをまねるためだけに古いです)。だから私は同じエラーに会った。
その理由がわかったので、解決策も見つけました。バージョンを合わせてください!
以前の答えが適切です。しかし、私はまた、より一般的な問題にも注目したいと思います。
私は同様の問題に直面しました、そして、その理由は私の会社のネットワーク制限でした。
私が他のネットワークにいるときも、同じ接続が成功していました。
/etc/mysql/my.cnfファイルのIPアドレスを更新してください
bind-address = <IP_ADDRESS>
Mysqlデーモンとmysqlサービスを再起動します。
私の同じ問題は、次の手順で解決されます。
my.cnfに行く
vi /etc/mysql/my.cnf
バインドアドレスを変更する
"#bind-address = 127.0.0.1"
mySQLを再起動します。
Sudo /etc/init.d/mysql restart
MySQLサーバーを起動せずにプログラムを実行しようとしたため、同じエラーが発生しました。
MySQLサーバーを起動した後、すべてがうまくいった。
MySQL-JDBC-Type-4-Treiber( 'mysql-connector-Java-5.1.11.Zip'からの 'mysql-connector-Java-5.1.11-bin.jar')を でダウンロードしてください。 MySQL 。
クラスパスにコンパイル時および実行時にドライバjarを含める必要があります。
Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );
MysqlデータベースのインストールにWAMP
またはXAMP
サーバーを使用している場合それからmysqlサーバーを明示的に起動する必要があります。そうしないとデータベースとの接続中にcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
が表示されます。
ポートを変更した場合は、このようなエラーが発生します。「com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure」ポート番号を確認してください
私はこの問題を簡単な方法で解決しました。私はseme問題 "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure"を抱えていました。私のdb.propertiesファイルで私はこれを持っていた:url:jdbc:mysql:// localhost:90/myDB、ポートurlを削除しただけです。 。
My.iniファイルとphp.iniファイルでmysqlのポートを3306から3307に変更したとき、私にはそれが起こりました。
ただこれを経験しました。
それを動作させるために手に入れました:(これは静的ブロック初期化に置くことができます)
static{ // would have to be surrounded by try catch
Class.forName("com.mysql.jdbc.Driver"); // this will load the class Driver
}
また、次の方法で接続を取得します。
conn = DriverManager.getConnection(DBURL,<username>,<password>);
ログインパラメータを指定する代わりに
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
よろしく。
localhost
を127.0.0.1
に変更してみてください。
ローカルホストは::1
に解決されます。そしてMySQLはデフォルトでIPv6経由で接続できません。
そして、これがtelnet localhost 3306
の出力です。
$ telnet localhost 3306
Trying ::1...
そしてMySQLサーバーからの応答がありません。
もちろん、MySQLサーバーが稼働していることを確認してください。
Remote Mysqlへの呼び出し
IP = remoteIPの例として、 Mysql にリモートユーザーを追加します。
mysql -u xxxx -p //local coonection to mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
//Query OK, 0 rows affected (xx sec)
mysql> FLUSH PRIVILEGES;
//Query OK, 0 rows affected
Mysqlへのリモートアクセスを許可します(デフォルトではすべての外部呼び出しは許可されていません)。
Edit
/etc/mysql/mysql.conf.d/mysqld.cnf or /etc/mysql/my.cnf
Change line: bind-address = 127.0.0.1 to
#bind-address = 127.0.0.1
Restart Mysql: /etc/init.d/mysql restart
JDBCドライバの最新バージョン、JDBCの場合:
jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC'
jdbc.user='theNewUser'
私のMacBookでは、Eclipse EEの新しいバージョンを再インストールし、xampp mysql for mampのようなローカルサーバーを削除したが、そのうちの1つだけを使用した場合にのみ、このエラーを解決した。
MySQLの古いバージョン( 'version'、 '5.1.73')に接続しようとしていました。新しいドライババージョンを使用すると、 "com.mysql.cj.jdbc.Driverを使用するように指示するエラーが表示されます。あなたが使うもの:
クラス
com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver 'を読み込みます。ドライバはSPIを介して自動的に登録され、ドライバクラスの手動ロードは通常不要です。
宣言を変更して、5.1.38バージョンのmysql-connector-Javaを使用し、コード内でcom.mysql.jdbc.Driverを保持しました。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.38</version>
</dependency>
Ankit Jainの 答え を見たときにすべてが始まりました
私の場合は、リモートデータベースへのSSHトンネルを確立する必要があり、すべての設定は正しく、PhpStormとの接続のテストも成功しました。また、スキーマはロードされましたが、データはロードされませんでした。代わりに私は得た:
[08S01] 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.
上記の提案はどれもうまくいきませんでした。いずれにせよ私は単にPhpStormを再起動することによって問題を解決しようとしました、そして、それがうまくいった!
私のMySQLが聞いていたポスト3307を私のファイアウォールがブロックしていました。そのため、ポートを3307から3306に変更しました。その後、データベースに正常に接続できます。
次のような複数のエラーが表示されました。
CommunicationsException: Communications link failure
Java.lang.NullPointerException: Attempt to invoke interface method 'Java.sql.Statement Java.sql.Connection.createStatement()' on a null object reference at
。私は追加しなければなりませんでした:
AndroidManifest.xmlでは、開始マニフェストタグの直後に<uses-permission Android:name="Android.permission.INTERNET"/>
を含めます。
Gradle(またはMaven)の依存関係にJDBCドライバを追加してください。
/etc/mysql/my.cnfファイルを開きます。
bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address
、
特定のIPアドレスのmysqlで以下のコマンドを実行します - >
grant all privileges on dbname.* to dbusername@'192.168.0.3' IDENTIFIED BY 'dbpassword';
すべてのIPアドレスへのアクセスを許可したい場合は、以下のコマンドを実行してください。
grant all privileges on dbname.* to dbusername@'%' IDENTIFIED BY 'dbpassword';
私は私のアプリケーションを起動している間に私は同じ問題に直面していました、
Caused by: 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ファイル /etc/mysql/mysql.conf.d/mysqld.cnf では、設定が次のようになっていたことです。
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
バインドアドレスが127.0.0.1を指していることがわかりますので、アプリケーションを起動するための簡単な解決策は、 jdbc:mysql://127.0.0.1:3306/pizzeria を使用することです。 jdbc:mysql:// localhost:3306/pizzeria mysqlをアプリケーションまたは他のソリューションに接続するのは、mysqlの設定を確認してdefaultに変更できることです。どちらのソリューションでも動作します。私はそれがあなた達にとってもうまくいくことを願っています。
それは単純なjar問題かもしれません。現在のMySQLバージョンではサポートされていない古いmysql-connector-Java-XXX-bin.jar
を使用している可能性があります。私はmysql-connector-Java-5.1.18-bin.jar
を使用しているのでmysql 5.5
を使用しましたが、この問題は解決しました。
MysqlとApache Serverを起動していないのかもしれません。 XAMPPコントロールパネルからApacheサーバーとMysqlを起動した後、接続は正常に確立されました。
がんばろう!
私は同じ接続エラーがあります:私が持っている問題は私がMySQL 8.0.15を使用したことですが、Javaコネクタは5.x.xです。
下記はhowenter code here
です。 1. 8.0.15をダウンロードしてください。 Mavenリポジトリから: https://search.maven.org/search?q=g:mysql%20AND%20a:mysql-connector-Java
もう一度実行すると、問題は解決しました。
私のために解決したのは2つのことをやっている:1。次のconnadを使用していくつかのパスワードでroot以外の新しいユーザーを作成します。
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;
2. mysqld.confのIPアドレス行をコメントアウトします。
それから新しいユーザー名とパスワードで接続してください。それはうまくいくはずです。
私は同じ問題を抱えていた、そしてこれがどのように修正されたかです:
ResultSet (getString("columnName"))
を介してオブジェクトに渡す列名が2つありました。どれが問題を解決したのか正確には分かりませんが、うまくいきました。また、テーブルクエリごとに必ず新しいStatement
とResultSet
を作成してください。