質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

解決済

1回答

3599閲覧

コマンドではつながるのにJDBCを利用したらDB接続ができない

kuroku

総合スコア4

Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

0クリップ

投稿2021/04/21 14:49

前提・実現したいこと

環境
EC2 Amazon Linux 2
RDS MySQL

JavaでJDBCを利用してMySQLに接続しようとしています。
接続を行う際にExceptionが投げられ接続ができない状態になっています。

こちらの問題を対応したいと考えています。
セキュリティグループやURL、パスワードなどが間違っているか確認するため。
mysqlコマンドで接続を行いましたが、その場合は接続できることが確認できています。

SSLの証明書が関係していると思うのですがどのような対応が必要なのかがいまいち調べても見つけられなかったのでご教示お願いします。

発生している問題・エラーメッセージ

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228) at connection.DBConnection.getConnection(DBConnection.java:23) at onlineUserRegistration.OnlineUserRegistration.execute(OnlineUserRegistration.java:34) at scheduler.Scheduler$1.run(Scheduler.java:50) at java.base/java.util.TimerThread.mainLoop(Timer.java:556) at java.base/java.util.TimerThread.run(Timer.java:506) Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:334) at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:164) at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1342) at com.mysql.cj.NativeSession.connect(NativeSession.java:157) at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) ... 10 more Caused by: javax.net.ssl.SSLHandshakeException: NotAfter: Fri Mar 06 07:03:06 JST 2020 at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:326) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:269) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:645) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:464) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:360) at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422) at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:183) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:171) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1403) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1309) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:440) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:411) at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:336) at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:188) at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:99) at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:325) ... 15 more Caused by: java.security.cert.CertificateExpiredException: NotAfter: Fri Mar 06 07:03:06 JST 2020 at java.base/sun.security.x509.CertificateValidity.valid(CertificateValidity.java:277) at java.base/sun.security.x509.X509CertImpl.checkValidity(X509CertImpl.java:675) at java.base/sun.security.x509.X509CertImpl.checkValidity(X509CertImpl.java:648) at com.mysql.cj.protocol.ExportControlled$X509TrustManagerWrapper.checkServerTrusted(ExportControlled.java:383) at java.base/sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:1510) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:629) ... 30 more

該当のソースコード

Java

1package connection; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.SQLException; 6 7import config.Config; 8 9 10public class DBConnection { 11 12 public static Connection getConnection() { 13 String db_url = formatDbUrl(); 14 String db_user = Config.getConfig().getDbUser(); 15 String db_pass = Config.getConfig().getDbPass(); 16 17 Connection connection = null; 18 try { 19 connection = DriverManager.getConnection(db_url, db_user, db_pass); 20 connection.setAutoCommit(false); 21 22 } catch (SQLException e) { 23 24 e.printStackTrace(); 25 } 26 27 return connection; 28 } 29 30 /** 31 * DBURLの作成 32 * @return String 33 */ 34 private static String formatDbUrl() { 35 String db_host = Config.getConfig().getDbHost(); 36 String db_port_no = Config.getConfig().getDbPort(); 37 String db_name = Config.getConfig().getDbName(); 38 39 String db_url = "jdbc:mysql://" + db_host + ":" + db_port_no + "/" + db_name; 40 41 return db_url; 42 } 43}

試したこと

コードで読み取ったDBの情報に差異がないか確認し、問題なし。
セキュリティグループのせて地ミスの可能性を考えmysqlコマンドで接続ができるか確認を行い、接続できることを確認。

補足情報(FW/ツールのバージョンなど)

EC2 Amazon Linux 2
RDS MySQL

Java11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuroku

2021/04/22 12:41

RDS確認したら証明書が切れてました。。。 更新したらプログラムから接続が確認できました。 初歩的なミスで質問してしまい申し訳ございません。
guest

回答1

0

自己解決

RDSの証明書の更新がされていませんでした。
証明書更新したら接続できたので証明書の期限には注意が必要ですね。
(公式のアナウンスはちゃんと見ましょう。。。)

一応証明書を更新しなかった場合は以下のコードで接続できましたのでご参考までに。
SSLをオフにして接続する

Java

1package connection; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.SQLException; 6 7import config.Config; 8 9 10public class DBConnection { 11 12 public static Connection getConnection() { 13 String db_url = formatDbUrl(); 14 String db_user = Config.getConfig().getDbUser(); 15 String db_pass = Config.getConfig().getDbPass(); 16 17 Connection connection = null; 18 try { 19 connection = DriverManager.getConnection(db_url, db_user, db_pass); 20 connection.setAutoCommit(false); 21 22 } catch (SQLException e) { 23 24 e.printStackTrace(); 25 } 26 27 return connection; 28 } 29 30 /** 31 * DBURLの作成 32 * @return String 33 */ 34 private static String formatDbUrl() { 35 String db_host = Config.getConfig().getDbHost(); 36 String db_port_no = Config.getConfig().getDbPort(); 37 String db_name = Config.getConfig().getDbName(); 38 39 // URLの部分に付け足す 40 String db_url = "jdbc:mysql://" + db_host + ":" + db_port_no + "/" + db_name + "?useSSL=false"; 41 42 return db_url; 43 } 44}

投稿2021/04/22 12:52

kuroku

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問