#03:リソースインジェクション(@Resource)
このチャプターでは、データソースを設定し、リソースインジェクションを用いて、データベースと接続する方法について学習します。
【pom.xml】 <dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
【context.xml】<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/datasource"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/paiza"
username="root"
password=""
maxTotal="20"
maxIdle="10"
maxWaitMillis="-1" />
</Context>
【LoginServlet】package jp.paiza.servlet;
import java.io.*;
import java.util.*;
import java.time.*;
import java.time.format.*;
import jakarta.servlet.*;
import jakarta.servlet.annotation.*;
import jakarta.servlet.http.*;
import jp.paiza.model.*;
import javax.sql.*;
import jakarta.annotation.*;
import java.sql.*;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Resource(name = "jdbc/datasource")
private DataSource ds;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
RequestDispatcher d =
req.getRequestDispatcher("/WEB-INF/jsp/login-input.jsp");
d.forward(req, res);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String userId = req.getParameter("user-id");
String password = req.getParameter("password");
req.getSession().invalidate();
try (Connection con = ds.getConnection()) {
LoginModel m = new LoginModel();
if (m.login(userId, password)) {
req.getSession().setAttribute("account", m.find(userId));
RequestDispatcher d =
req.getRequestDispatcher("/posts");
d.forward(req, res);
} else {
res.sendRedirect("login");
}
} catch (SQLException e) {
throw new ServletException(e);
}
}
}
JDBC4.0以降の場合、JDBCドライバを明示的にロードする必要は原則としてなくなりました。
しかし、Tomcatの階層的なクラスローダ構造により、Webアプリケーション(子クラスローダ側)のWEB-INF/libにあるJDBCドライバが見つからないことがあります。
そのため、TomcatでJDBCを利用したDB接続をおこなう場合、Class.forNameメソッドによって、JDBCドライバを明示的にロードする必要があります。
| 属性 | 説明 |
|---|---|
| name | JNDI名。アプリケーションがこのリソースを識別・検索するための名前です。java:comp/env/ の後にこの名前を付けて利用します。 |
| auth | 認証の主体を指定します。Containerに設定すると、リソースへの接続認証をTomcatコンテナに任せることを意味します。通常はこの値を使います。 |
| type | リソースのJavaクラス型です。データベース接続プーリングを利用する場合、javax.sql.DataSourceインターフェースを指定するのが標準です。 |
| driverClassName | データベースに接続するためのJDBCドライバのクラス名です。 |
| url | データベースの接続先URLです。プロトコル、ホスト名、ポート番号、データベース名などを指定します。 |
| username | データベースに接続するためのユーザー名です。 |
| password | データベースに接続するためのパスワードです。 |
| maxTotal | 接続プールの最大接続数です。同時にアクティブになれる接続の最大値で、これを超えると新しい接続要求は待機状態になります。 |
| maxIdle | 接続プールの最大アイドル接続数です。プール内で使用されずに待機している接続の最大値です。これを超えたアイドル接続は破棄されます。 |
| maxWaitMillis | 最大待機時間(ミリ秒)です。プール内の全接続が使用中の場合に、新しい接続要求が待機する最大時間です。-1は無制限に待機することを意味します。 |
新・Java入門編36: JDBCについて学習しよう
https://paiza.jp/works/java/new-primer/java-new-primer-36
JNDI Resources How-To
https://tomcat.apache.org/tomcat-11.0-doc/jndi-resources-howto.html
JDBC Data Sources
https://tomcat.apache.org/tomcat-11.0-doc/jndi-resources-howto.html#JDBC_Data_Sources
BasicDataSource Configuration Parameters
https://commons.apache.org/proper/commons-dbcp/configuration.html