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

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

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

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

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

4回答

3289閲覧

javaサーブレットでMySQLとコネクションができないといわれてしまう.

daikon110

総合スコア11

MySQL

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

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

1クリップ

投稿2019/05/30 09:58

javaサーブレットでMySQLとコネクションができないといわれてしまう.

tomcatを使ったwebアプリケーションの学習をしています.
MySQLでDBとtableを構築し,そのtableをjavaサーブレットを用いてブラウザのページに表示するアプリケーションegilabを書いています.
eclipseなどは用いておらず,すべてターミナル上で行っています.

しかし,プログラムを実行してブラウザで確認してみると,

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

と表示されてしまいます.

サーブレットの名前はEgilabListServlet.javaで,sqlとのやり取りにMySQL Connector/jを用いているので,javacする際は,

javac -cp /usr/tomcat9/lib/servlet-api.jar:/usr/tomcat9/lib/mysql-connector-java.jar EgilabListServlet.java

としています.

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

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. java.lang.NullPointerException

二行目のエラーはsqlとやり取りができていないために出現するエラーだと思います.

該当のソースコード

EgilabListServlet.java

java

1import java.sql.*; 2import java.io.*; 3import javax.servlet.*; 4import javax.servlet.http.*; 5 6public class EgilabListServlet extends HttpServlet { 7 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 8 response.setContentType("text/html; charset=UTF-8"); 9 PrintWriter out = response.getWriter(); 10 out.println("<html><head>"+"<title>EgilabListServlet</title>"); 11 12 Connection con = null; 13 Statement st = null; 14 ResultSet rs = null; 15 String login = "root"; 16 String passwd = "MySQLのパスワード"; 17 try { 18 Class.forName("com.mysql.jdbc.Driver"); 19 String url = "jdbc:mysql://localhost/egilab_db" + "?useUnicode=true&characterEncoding=UTF-8" + "&autoReconnect=true"; 20 con = DriverManager.getConnection(url, login, passwd); 21 String sql = "SELECT * FROM egilab_tbl;"; 22 23 rs = st.executeQuery(sql); 24 out.println("<table border=\"1\"> "); 25 out.println("<tr><td>name</td>"+"<td>grade</td>"+"<td>group</td></tr>"); 26 27 while (rs.next()) { 28 out.println("<tr><td>" + rs.getString("name")); 29 out.println("</td><td>" + rs.getString("grade")); 30 out.println("</td><td>" + rs.getString("group") + "</td></tr>"); 31 } 32 out.println("</table>"); 33 } catch (Exception e) { 34 out.println("<p>" + e.toString() +"</p>"); 35 } finally { 36 try { 37 rs.close(); 38 st.close(); 39 con.close(); 40 } catch (Exception e) { 41 out.println("<p>" + e.toString() + "</p>"); 42 } 43 } 44 out.println("</body></html>"); 45 } 46}

ディレクトリの構成図は以下の通りです.

/
|
usr
|
tomcat9
|
webapp
|
egilab
|
WEB-INF
|
classes, web.xml
|
EgilabListServlet.java, EgilabListServlet.class

xmlファイルの問題ではないような気がしていますが,web.xmlのソースも以下に示します.

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE web-app 3PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 4"http://java.sun.com/dtd/web-app_2_3.dtd"> 5<web-app> 6 <servlet> 7 <servlet-name>egilab</servlet-name> 8 <servlet-class>EgilabListServlet</servlet-class> 9 </servlet> 10 <servlet-mapping> 11 <servlet-name>egilab</servlet-name> 12 <url-pattern>/servlet/EgilabListServlet</url-pattern> 13 </servlet-mapping> 14</web-app>

次にsqlの中身を記します

mysql> show databases; +--------------------+ | Database | +--------------------+ | egilab_db | | information_schema | | music_db | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec)

今回使いたいのはegilab_dbのegilab_tblです

mysql> select * from egilab_tbl; +----------+-------+------------+--------+ | name | grade | group_name | number | +----------+-------+------------+--------+ | Taro | M2 | A | 1 | | Jiro | M1 | B | 2 | | Hanako | M1 | A | 3 | | Saburo | M1 | C | 4 | | Ichiro | | | 5 | +----------+-------+------------+--------+ 5 rows in set (0.01 sec)

試したこと

tomcatの再起動とMySQLの再起動は試したが変わらず.
urlの指定の部分か,DriverManager.getConnection のあたりで引っかかっていると思うのですが,わかりません.

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

mysql Ver 8.0.16 for Linux on x86_64
Server version: Apache Tomcat/8.5.40
OS:CentoOS7

###よろしくおねがいいたします

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

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

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

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

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

guest

回答4

0

自己解決

解決しました.
MySQL connector/jのバージョンが古く,MySQL8.0.4以降からデフォルトの認証方式となった,
caching_sha2_passwordに対応していないことが原因だったようです.
caching_sha2_password方式に対応した最新のjava connectorをインストールしなおしたことでうまく挙動しました.
回答いただいた方ありがとうございました.

投稿2019/06/12 22:52

daikon110

総合スコア11

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

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

0

localhost の代わりに、127.0.0.1 で試して見たら動きませんかね。

これで動く場合は、MySql側の skip-name-resolve オプションが関係していますので、調べて見てください。

投稿2019/06/10 06:28

foobar810

総合スコア217

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

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

0

MySQLの接続先は localhost で間違いないのでしょうか

投稿2019/05/31 11:23

A-pZ

総合スコア12011

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

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

daikon110

2019/05/31 13:02

localhostで間違いないと思います. mysql> mysql> select host,user from mysql.user; +-----------+------------------+ | host | user | +-----------+------------------+ | localhost | mysql.infoschema | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +-----------+------------------+ 4 rows in set (0.07 sec) このrootでログインしたいと考えています
退会済みユーザー

退会済みユーザー

2019/05/31 16:16

DBのユーザー情報がlocalhost だけだからといって APサーバーからみたDBサーバがlocalhost とは限らないのですが
daikon110

2019/06/01 07:25

理解が足りませんでした. TomCat と同一マシンで動かしているので,localhost接続だと認識しています.
guest

0

MySQLサーバは生きていますか?

投稿2019/05/31 02:29

MAKOTO_MOBY

総合スコア193

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

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

daikon110

2019/05/31 13:07

再起動済みです 以下のようにstatusコマンドで確認しても動作を確認しています service mysqld status Redirecting to /bin/systemctl status mysqld.service ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since 金 2019-05-31 22:03:54 JST; 2min 6s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 25701 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 25957 (mysqld) Status: "SERVER_OPERATING" Tasks: 38 CGroup: /system.slice/mysqld.service └─25957 /usr/sbin/mysqld 5月 31 22:03:45 localhost.localdomain systemd[1]: Starting MySQL Server... 5月 31 22:03:54 localhost.localdomain systemd[1]: Started MySQL Server.
MAKOTO_MOBY

2019/05/31 13:17

url ですが、ボート番号(3306) がないようですが、ポート番号を入れてみて試していただけますでしょうか?
daikon110

2019/05/31 13:51

urlを以下のようにしてコンパイル,tomcat,mySQLの再起動を行いましたがブラウザの表示は変わりませんでした. String url = "jdbc:mysql://localhost:3306/egilab_db" + "?useUnicode=true&characterEncoding=UTF-8" + "&autoReconnect=true";
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問