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

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

新規登録して質問してみよう
ただいま回答率
85.37%
MySQL

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

JDBC

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

Q&A

解決済

1回答

21085閲覧

【MYSQL・JDBCのエラー】Could not create connection to database server.(SQLNonTransientConnectionException)

Marina_

総合スコア14

MySQL

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

JDBC

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

0グッド

0クリップ

投稿2021/08/08 09:48

編集2021/08/09 23:42

課題:
java で MYSQLサーバーに接続できない

環境:
・Mac Big Sur
・Pleiades All in One
・MySQL 8.0.25 (HomeBrewでインストールを行なった)
・dbeaver

行ったこと:
・MySQLをインストール(Homebrewによって)
・JDBCドライバの入手(公式webサイトから、connect/jでplatform independentをダウンロード)
・JDBCドライバのパスを確認
・確認したパスを、eclipseの該当プロジェクトのビルドパス>ライブラリ>外部JARの追加で、ビルドパスとして設定
・Javaアプリケーションを作成し、教材で配布されたコードを配置
・Javaアプリケーションとして実行したところ、エラーが発生

エラー内容:
java.sql.SQLNonTransientConnectionException: Could not create connection to database server.

質問内容:

Java

1package j4_01; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8 9public class Sample4_01_1 { 10 11 //定数 12 private static String COMMA = ","; //コンマ 13 14 public static void main(String[] args) { 15 //------------------------------------------- 16 //データベースへの接続情報 17 //------------------------------------------- 18 19 //JDBCドライバの相対パス 20 //※バージョンによって変わる可能性があります(MySQL5系の場合は「com.mysql.jdbc.Driver」) 21 String driverName = "com.mysql.cj.jdbc.Driver"; 22 23 //接続先のデータベース 24 //※データベース名が「test_db」でない場合は該当の箇所を変更してください 25 String jdbcUrl = "jdbc:mysql://localhost/test_db?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false"; 26 27 //接続するユーザー名 28 //※ユーザー名が「test_user」でない場合は該当の箇所を変更してください 29 String userId = "test_user"; 30 31 //接続するユーザーのパスワード 32 //※パスワードが「test_pass」でない場合は該当の箇所を変更してください 33 String userPass = "test_pass"; 34 35 //------------------------------------------- 36 //① JDBCドライバのロード 37 //------------------------------------------- 38 try { 39 Class.forName(driverName); //JDBCドライバをロード&接続先として指定 40 } catch (ClassNotFoundException e) { 41 e.printStackTrace(); 42 } 43 44 45 //JDBCの接続に使用するオブジェクトを宣言 46 //※finallyブロックでも扱うためtryブロック内で宣言してはいけないことに注意 47 Connection con = null ; // Connection(DB接続情報)格納用変数 48 PreparedStatement ps = null ; // PreparedStatement(SQL発行用オブジェクト)格納用変数 49 ResultSet rs = null ; // ResultSet(SQL抽出結果)格納用変数 50 51 try { 52 //------------------------------------------- 53 // ②接続の確立(Connectionオブジェクトの取得) 54 //------------------------------------------- 55 con = DriverManager.getConnection(jdbcUrl, userId, userPass); 56 57 //------------------------------------------- 58 // ③SQL文の送信 & ④抽出結果の取得 59 //------------------------------------------- 60 61 //SQL文の生成(SELECT) 62 StringBuffer buf = new StringBuffer() ; 63 buf.append(" SELECT "); 64 buf.append(" id , "); 65 buf.append(" name , "); 66 buf.append(" gender , "); 67 buf.append(" age , "); 68 buf.append(" course "); 69 buf.append(" FROM "); 70 buf.append(" uzuz_member "); 71 buf.append(" ORDER BY "); 72 buf.append(" id "); 73 74 //PreparedStatementオブジェクトを生成&発行するSQLをセット 75 ps = con.prepareStatement(buf.toString()); 76 77 //SQL文の送信&抽出結果(ResultSetオブジェクト)の取得 78 rs = ps.executeQuery(); 79 80 //ResultSetオブジェクトから1レコードずつデータを取得&加工&表示する 81 while (rs.next()) { 82 83 //1レコード分のデータを取得&加工(各カラムをコンマ綴りで結合) 84 StringBuffer rsbuf = new StringBuffer(); 85 rsbuf.append(rs.getString("id")); 86 rsbuf.append(COMMA); 87 rsbuf.append(rs.getString("name")); 88 rsbuf.append(COMMA); 89 rsbuf.append(rs.getString("gender")); 90 rsbuf.append(COMMA); 91 rsbuf.append(rs.getString("age")); 92 rsbuf.append(COMMA); 93 rsbuf.append(rs.getString("course")); 94 95 //加工作成した1レコード分のデータを表示 96 System.out.println(rsbuf.toString()); 97 } 98 99 } catch (SQLException e) { 100 e.printStackTrace(); 101 102 } finally { 103 //------------------------------------------- 104 // ⑤接続の解除 105 //------------------------------------------- 106 107 //ResultSetオブジェクトの接続解除 108 if (rs != null) { //接続が確認できている場合のみ実施 109 try { 110 rs.close(); //接続の解除 111 } catch (SQLException e) { 112 e.printStackTrace(); 113 } 114 } 115 116 //PreparedStatementオブジェクトの接続解除 117 if (ps != null) { //接続が確認できている場合のみ実施 118 try { 119 ps.close(); //接続の解除 120 } catch (SQLException e) { 121 e.printStackTrace(); 122 } 123 } 124 125 //Connectionオブジェクトの接続解除 126 if (con != null) { //接続が確認できている場合のみ実施 127 try { 128 con.close(); //接続の解除 129 } catch (SQLException e) { 130 e.printStackTrace(); 131 } 132 } 133 } 134 } 135} 136

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

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

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

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

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

m.ts10806

2021/08/08 11:28

コードと設定と環境一通り提示しないと応えようがないですし、「疑われること」ならエラーメッセージで検索して出てくるような内容です。 いずれにしても質問タグ「MySQL」だけでは回答えられにくいかと。
Marina_

2021/08/09 07:46

m.ts10806さん ご指摘いただき、誠にありがとうございます。 説明不足で申し訳ございません。 コードと設定と環境がないと答えられない問題なのですね。 今後、説明すべき点としなくてもいい点の区別がつくよう、意識して書いていくようにいたします。
Marina_

2021/08/09 07:47

先ほど追記させていただきました。 もしよろしければ、ご教授頂けますと大変幸いに存じます。
guest

回答1

0

ベストアンサー

  1. サーバーが動いているのか(サーバーのプロセスを確認)
  2. サーバーへの疎通ができているのか(MySQL管理用ツールなどで確認)
  3. プログラムで指定した接続情報があっているか(タイプミスはよくある)

過去の質問:java で MYSQLサーバーに接続できない

(追記)
私の環境で試してみたところ同様のエラーが発生し、接続オプションからserverTimezone=JSTを抜くと動きました。

String jdbcUrl = "jdbc:mysql://localhost/test_db?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false";

↓↓ 修正 ↓↓

String jdbcUrl = "jdbc:mysql://localhost/test_db?characterEncoding=UTF-8&useSSL=false";

本家のリリースノートを見ると、MySQL Connector/J 8.0.23 から serverTimezone オプションは使わなくなったっぽいですね。
過去の質問でもこのオプションが必要と指摘しているし、そう解説しているサイトも多いですが、既に過去の話になっていたようです。

https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-23.html

投稿2021/08/08 11:01

編集2021/08/09 12:48
ishina_yum

総合スコア509

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

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

Marina_

2021/08/09 07:52

ishina_yumさん ご教授いただき、誠にありがとうございます。 お教えいただいた2つ目の確認方法がわかりません。 2:サーバーへの疎通ができているのか(MySQL管理用ツールなどで確認) もしよろしければ、疎通できているかの確認方法についてご教授いただけないでしょうか。 mysqlにログインできるか、ということでしたら、ログインはできています。 「サーバー 疎通 mysql」で検索しましたが、ログイン以外に見つけられませんでした。 1と3はできていると判断しています。 1:サーバーが動いているのか(サーバーのプロセスを確認) はい。eclipseに立てたtomcatは正常に起動しています。 3:プログラムで指定した接続情報があっているか(タイプミスはよくある) はい。教材で配布されたコードをそのまま配置するものなので、接続情報は合っています。 環境構築に関しても、講座を見直しましたが、あっていました。
退会済みユーザー

退会済みユーザー

2021/08/09 07:57

しばらくご返信がないようなので、横から失礼致します。 mysql workbench等のツールの事かと存じます。
Marina_

2021/08/09 08:43

LOVE-KANONさん ご教授いただき、ありがとうございます。 mysql workbenchを調べてサーバー疎通を確認してみます。 ありがとうございました。
Marina_

2021/08/09 09:00

mysql workbenchで、動かしたいテーブルのデータを全件抽出することができました。 このことから、DBサーバへの疎通はできていると判断できると思います。 よって、ご指摘いただいた3点は全て正しく行えていると思われます。 1:サーバーが動いているのか(サーバーのプロセスを確認) 2:サーバーへの疎通ができているのか(MySQL管理用ツールなどで確認) 3:プログラムで指定した接続情報があっているか(タイプミスはよくある)
shinami

2021/08/09 10:32 編集

> Marina_さん MySQLは余り使わないので違うかもしれませんがポート番号とかはいりませんでしたっけ? jdbc:mysql://localhost:3306/test_db 以下省略 違ってたらすいません、スルーしてください。 あと、jarはクラスパスに追加していますか?モジュールパスに追加していますか? クラスパスに追加してあればこれもスルーしてください。
ishina_yum

2021/08/09 10:32

それだけ確認すれば普通動くだろと思いつつConnector/J(Ver. 8.0.26)ダウンロードして試してみましたところ、同じ例外が発生しましたw 試してみたところ、私の環境では接続オプションからserverTimezone=JST を抜くと動きました。 尚、諸事情あり、MySQL のバージョンは 5.7.17-log です。 String jdbcUrl = "jdbc:mysql://localhost/test_db?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false"; ↓↓ 修正 ↓↓ String jdbcUrl = "jdbc:mysql://localhost/test_db?characterEncoding=UTF-8&useSSL=false"; それでもだめなら、思い切って後ろを全部捨てて↓で試してみるところからかな。 String jdbcUrl = "jdbc:mysql://localhost/test_db"; 上記の通り、ポート3306が無くても大丈夫なはずです。 また、jarが見つからなければビルドできないか、class not found になるはずですね。
shinami

2021/08/09 10:36

> ishina_yumさん そうでしたか。 jarに関してもそう言われてみればそうでした。
shinami

2021/08/09 10:54

それ私も今見てました。8.0.23からは、 connectionTimeZone=SERVER とする事でMySQLのタイムゾーンに合わせるよう変更されたようです。 また、serverTimezone=JSTが必須であったバージョンもあったっぽいですね。
Marina_

2021/08/09 12:19

shinamiさん、ishina_yumさん ご親切にご回答いただき、ありがとうございます。 解決しました。 ご指摘いただいた通り、serverTimezone=JSTを削除したら動きました。 ご丁寧にその理由までご解説いただき、誠にありがとうございます。 皆さんのご親切と解決方法の凄さに感動しています。泣 私も、技術が身についた時は、他の方に貢献したいです。 本当にありがとうございました。
Marina_

2021/08/09 12:21

ishina_yumさん ishina_yumさんの、2021/08/09 19:32が直接的な回答になったため、 ベストアンサーにして、この質問をクローズしたいのですが、 もし差し支えなければ、解答の方に再度記述いただけないでしょうか。 特に必要なければ、私が自己解決欄としてishina_yumさんの引用ということを明記して、クローズしたいと思います。
Marina_

2021/08/09 12:23

shinamiさん 今更遅いかもしれませんが、いただいた質問にお答えいたします。 jarはクラスパスに追加していますか? ーはい。しています。
Marina_

2021/08/09 12:29 編集

ishina_yumさん、shinamiさん もしよろしければお伺いしたいのですが、本エラーの原因(serverTimezone)をご指摘される際にmysqlの公式ドキュメントのURLをお送りくださいましたが、どのような筋道でそちらに辿り着かれましたか。 今後、自分で見つけられるようになりたく、また、自分の目指すレベルの技術力のイメージを持って取り組みたく思っております。
ishina_yum

2021/08/09 13:23 編集

私の踏んだ手順としては以下になります。 1. 手元の環境になかったので connect/j の最新版をダウンロードしてきて、それっぽい環境構築 2. ソースコードをビルドしてみる ⇒ 同じ例外が出た! 3. とりあえず、オプション全部消して接続できるか試してみる ⇒ 動いた! 4. どのオプションが悪さをしているのか一つずつ試してみる ⇒ serverTimezoneが犯人だ! 5. serverTimezoneの使い方が変わったり廃止されたりしていれば、公式に情報が必ずあるはず! ⇒ MySQL公式トップ(https://www.mysql.com/jp/)から辿ってみる 6. 「ドキュメント」が一番上にいるのでクリック 7. 「MySQL Server」「MySQL Enterprise」など並んでいるけれど、調べたいのは Connector/J なのだから「Connectors」をクリック 8. Connector/J Developer Guide のversion8.0のviewをクリック 9. なんかゴチャゴチャ多くて探しづらそうなのでいったん戻るw 10. Connector/J Release Notes のversion8.0のviewをクリック 11. リリースの新しいものから順に開いて「serverTimezone」でページ内検索(Ctrl+Fして検索) 12. ヒットした周辺を読んでみる これを書きおわってから、MySQLのページ内に検索入力ボックスがあることに気付く……
Marina_

2021/08/09 23:40 編集

ishina_yumさん なるほど。大変ご丁寧に教えていただき、誠にありがとうございます、、!!泣 誠に不躾なお願いではございますが、もしよろしければ、下記2点お伺いしてもよろしいでしょうか? 1)教えてくださった手順の背景にあるのは、下記のような考え方でしょうか? ・今回のようなエラーの場合、DB接続はできているので、オプションを疑う ・疑いのあるものは一つずつ調べて原因箇所を特定する ・web検索で見つからなければ、公式ドキュメントから検索をかける mysqlの検索ボックスは半透明のようで、パッと見て気が付きにくいですね 2)手順2番目の「オプション」とは、「?」以降に書いた下記2つのパラメータのことでしょうか? characterEncoding=UTF-8 useSSL=false
Marina_

2021/08/09 23:39

ishina_yumさん ご丁寧にベストアンサーに記述いただき、ありがとうございます!
shinami

2021/08/10 01:42

今回は、ishina_yumさんのserverTimezone=JSTを削除したら動きましたから調べました。 キーワードは、「serverTimeZone=JST」[と「Could not create connection to database server.」で検索しましたね。 すると、SpringBoot関連ですが参考になりそうなサイトを見つけました。おそらく1件目に出てくるサイトです。 すると、公式にサイトで発表されている内容に辿り着いたので発見しました。 英文なので英文をコピペしてグーグルの翻訳で日本語に直して読みました。 すると、詳しい内容はこちらみたいにリンクが貼られていましたので https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-time-instants.html も書き込んだ訳です。 バージョンアップする事によりこの様なエラーを発する様になった内容であれば他でも話題になってますのでどこかに解決方法が書いてある場合も多いです。 でも、間違った解決方法で解決しているサイトもありますので公式ホームページの方を参考にしてください。
ishina_yum

2021/08/10 10:54

> 1)教えてくださった手順の背景にあるのは、下記のような考え方でしょうか? 基本的に、やるべきことは「問題の切り分け」です。 MySQL WorkbenchでSQL投げて結果を得られるならば、MySQLは正常に動いていると判断できます。 とすると、疑われるのは二点で、一つが今回試してみた接続オプション。もう一つは使用しているConnector/Jとサーバーの相性の問題。(何らかのバグにより、特定のバージョン間だと動かないことも可能性としては考えられる) > ・疑いのあるものは一つずつ調べて原因箇所を特定する あとはまさにこれで、地道に調査することになります。上手くいかなければ別のバージョンをダウンロードして試したり、公式ドキュメントを探しに行くことになります。 > ・web検索で見つからなければ、公式ドキュメントから検索をかける shinami さんの言うように、そこらのブログの情報は間違っていることもあります。それを試してみるのは構いませんが、できるだけ正確な情報を得るよう心掛けた方が良いかと思います。 > 2)手順2番目の「オプション」とは、「?」以降に書いた下記2つのパラメータのことでしょうか? はい、そうです。
Marina_

2021/08/10 23:41 編集

shinamiさん ご丁寧に教えていただき、ありがとうございます、、!泣 なるほど、検索ワードは、エラー原因である可能性が高いワード+エラーメッセージ などで指定するのですね。自分では「serverTimezone=JST jdbc」と検索した可能性が高いですが、shinamiさんが教えてくださったエラーメッセージも追加した検索だと1件目に答えの記事が出てきましたので、精度が高いと思います。検索方法について勉強になりました。 (今、再度エラーを起こしてみたところ、この記事のように下の方に「Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: JST 」というエラーメッセージも表示されていて、エラーメッセージを下まで読むべきだったんだなぁと気がつきました。) https://qiita.com/AoiLaurent/items/833a7a40f242648f7580 解決した後も、質問にお答えいただき、ありがとうございました。 ここで解決できなかったら、Udemyの講座が進められなかったので、大変助かりました。 皆さんのご協力に感動し、以前にましてやる気を持って、また、勉強を楽しめています。 本当にありがとうございました。
Marina_

2021/08/10 23:37

ishina_yumさん ご親切に教えていただき、ありがとうございます、、!泣 大変参考になりました。ありがとうございました。 今までやみくもに解決策を試していたので、今回教えていただいた解決方法を意識して今日からお仕事や勉強をしたいと思います。 解決した後も、質問にお答えいただき、ありがとうございました。 ここで解決できなかったら、Udemyの講座が進められなかったので、大変助かりました。 皆さんのご協力に感動し、以前にましてやる気を持って、また、勉強を楽しめています。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問