はじめに
この記事は独習JSP&サーブレット第3版に基づいて、データベースを勉強していた際に躓いた点をまとめた記事です。最新版のJDBCやデータベースを使用している人は、同じようなエラーで躓いていると思うので参考になれば嬉しいです。
環境
- Tomcat 10.0
- MySQL 8.0
- MySQLドライバ(JDBC):mysql-connector-java-8.0.27
jspからデーターベースに接続する
以下のようにconnect.jspファイルからデータベースに接続するとする。
データソースの設定はcontext.xmlで行う。
connect.jsp
<%@ page contentType="text/html;charset=UTF-8"
import="java.sql.*, javax.naming.*, javax.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>データベースへの接続</title>
</head>
<body>
<%
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/database_name");
Connection db = ds.getConnection();
db.close();
%>
データベースへの接続に成功しました。
</body>
</html>
context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true">
<Resource name="jdbc/database_name" auth="Container" type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost/database_name?serverTimezone=JST"
username="user_name" password="password" maxTotal="4" maxWaitMillis="5000"
maxIdle="2" validationQuery="SELECT count(*) FROM book">
</Resource>
</Context>
Connector/JというMySQL用のJDBC Driverのバージョンが8.0.23以上を用いている人は次のようなエラーが発生していると思う。
Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: JST
解決方法はcontext.xmlのタグ<Rerouce>にあるurlを以下のように変更すればいい。
url="jdbc:mysql://localhost/database_name"
データベースにアクセスできるユーザーの設定方法
database_nameというデータベースにアクセスするためのアカウントを新規作成する.
mysql> CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'password';
ユーザー名とパスワード以外にもlocalhostの部分も入力しないといけないので注意。
このアカウントに権限を与えるためには、GRANT命令を使う。
mysql> GRANT ALL ON database_name.* TO 'user_name'@'localhost';
ここでもlocalhostを忘れずに入力しないと次のようなエラーが発生する。
ERROR 1410 (42000): You are not allowed to create a user with GRANT
おわりに
勉強する際は、最新版をインストールすると躓く。