Javaを勉強しているものです。EclipseでWebアプリケーションの開発をしています。
xmlファイルにMariaDB接続情報を設定しJNDIを使ってMariaDBへの接続をしようとしているのですが、以下のエラーが発生しています。
Eclipse上で動作確認するときに使用しているTomcatのバージョンはV8.0です。
java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null' at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2160) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2032) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1532) (中略) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:832) Caused by: java.sql.SQLException: No suitable driver at java.sql/java.sql.DriverManager.getDriver(DriverManager.java:298) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2144) ... 28 more
実施した手順は以下です。
1.Eclipseから任意のjspファイルを選択して右クリック→実行→実行の構成を選択
引数タブを選択してcatalina.baseのパスを確認する
2.catalina.base の以下のパスにmariadb-access.xmlというコンテキストファイルを作成
C:\pleiades\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp1\conf\Catalina\localhostフォルダ下に
mariadb-access.xmlというファイルを作成
xml
1<?xml version="1.0" encoding="UTF-8"?> 2<Context path="/mariadb-access" reloadable="true" docBase="c:/pleiades/workspace/sample3" workDir="c:/pleiades/workspace.metadata/.plugins/org.eclipse.wst.server.core/tmp1/work"> 3 4 <Resources allowLinking="true" /> 5 <Resource 6 auth="Container" 7 description="MariaDB Datasource" 8 type="javax.sql.DataSource" 9 driverClassName="org.mariadb.jdbc.Driver" 10 name="jdbc/test" 11 username="hogeuser" 12 password="password" 13 url="jdbc:mariadb://localhost:3307/test" 14 maxtotal="1000" 15 validationQuery="select 1" 16 testOnBorrow="true" 17 timeBetweenEvictionRunsMillis="10000" 18 testWhileIdle="true" 19 numTestsPerEvictionRun="5"/> 20 <WatchedResource>WEB-INF/web.xml</WatchedResource> 21</Context>
3.動作確認用の実装を行う。
java
1package sample3.servlet; 2 3import java.io.IOException; 4import java.net.InetAddress; 5 6import javax.servlet.ServletException; 7import javax.servlet.http.HttpServlet; 8import javax.servlet.http.HttpServletRequest; 9import javax.servlet.http.HttpServletResponse; 10import java.sql.Connection; 11import java.sql.PreparedStatement; 12import java.sql.ResultSet; 13import java.util.List; 14 15import javax.naming.Context; 16import javax.naming.InitialContext; 17import javax.naming.NamingException; 18import javax.sql.DataSource; 19 20public class HogeServlet extends HttpServlet { 21 22 @Override 23 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 24 Connection conn = null; 25 try { 26 Context context = new InitialContext(); 27 // mariadb-access.xmlのDB設定情報を取得する 28 DataSource dataSource = dataSource = (DataSource)context.lookup("java:comp/env/jdbc/test"); 29 System.out.println("DB情報取得成功"); 30 31 conn = dataSource.getConnection(); 32 PreparedStatement statement 33 = conn.prepareStatement("select * from users"); 34 ResultSet result = statement.executeQuery(); 35 while(result.next()){ 36 System.out.println("id:" + result.getLong(1)); 37 System.out.println("name:" + result.getString(2)); 38 System.out.println("email:" + result.getString(3)); 39 } 40 } catch(NamingException e){ 41 System.err.println("DB情報取得失敗"); 42 e.printStackTrace(); 43 throw e; 44 } catch (Exception e2) { 45 e2.printStackTrace(); 46 System.err.println("DB検索失敗"); 47 } finally { 48 try { 49 if(conn!=null) conn.close(); 50 } catch (Exception e2) { 51 // TODO: handle exception 52 } 53 } 54 } 55 56} 57
4.プロジェクトにWEB-INFフォルダを作成し、web.xmlを作成。
C:\pleiades\workspace\sample3\src\main\webapp\WEB-INF\web.xml
xml
1<!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 3 "http://java.sun.com/dtd/web-app_2_3.dtd" > 4 5<web-app> 6 <display-name>Archetype Created Web Application</display-name> 7 8 <context-param> 9 <param-name>logbackDisableServletContainerInitializer</param-name> 10 <param-value>true</param-value> 11 </context-param> 12 13 <servlet> 14 <servlet-name>HogeServlet</servlet-name> 15 <servlet-class>sample3.servlet.HogeServlet</servlet-class> 16 </servlet> 17 18 <servlet-mapping> 19 <servlet-name>HogeServlet</servlet-name> 20 <url-pattern>/hoge</url-pattern> 21 </servlet-mapping> 22 23 24 <!-- mariadb-access.xmlのDB取得設定 --> 25 <resource-ref> 26 <res-ref-name>jdbc/test</res-ref-name> 27 <res-type>javax.sql.DataSource</res-type> 28 <res-auth>Container</res-auth> 29 </resource-ref> 30</web-app> 31
5.任意のjspファイルを右クリックしてTomcatサーバを起動。ログを確認して起動に問題がないかを確認する
情報: Server version: Apache Tomcat/8.0.36 [日 1月 16 12:01:08 JST 2022] (中略) 情報: CATALINA_BASE: C:\pleiades\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1 [日 1月 16 12:01:08 JST 2022] 情報: CATALINA_HOME: C:\Program Files\tomcat8 [日 1月 16 12:01:08 JST 2022] 情報: Command line argument: -Dcatalina.base=C:\pleiades\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1 [日 1月 16 12:01:08 JST 2022] 情報: Command line argument: -Dcatalina.home=C:\Program Files\tomcat8 [日 1月 16 12:01:08 JST 2022] 情報: Command line argument: -Dwtp.deploy=C:\pleiades\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps [日 1月 16 12:01:08 JST 2022] 情報: Command line argument: -Dfile.encoding=UTF-8 [日 1月 16 12:01:08 JST 2022] 情報: Command line argument: -XX:+ShowCodeDetailsInExceptionMessages [日 1月 16 12:01:08 JST 2022] (中略) 情報: 設定記述子 C:\pleiades\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\conf\Catalina\localhost\mariadb-access.xml を配備します [日 1月 16 12:01:10 JST 2022] 情報: Unknown loader jdk.internal.loader.ClassLoaders$AppClassLoader@6d06d69c class jdk.internal.loader.ClassLoaders$AppClassLoader [日 1月 16 12:01:10 JST 2022] 情報: Deployment of configuration descriptor C:\pleiades\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\conf\Catalina\localhost\mariadb-access.xml has finished in 15 ms [日 1月 16 12:01:10 JST 2022] 情報: Starting ProtocolHandler ["http-nio-8080"] [日 1月 16 12:01:10 JST 2022] 情報: Server startup in 1301 ms [日 1月 16 12:01:10 JST 2022]
6.ブラウザのURLをhttp://localhost:8080/sample3/hogeに変更してアクセスすると以下のエラーが発生する
java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null' (中略) Caused by: java.sql.SQLException: No suitable driver at java.sql/java.sql.DriverManager.getDriver(DriverManager.java:298) at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2144) ... 28 more DB検索失敗
conn = dataSource.getConnection();のところでExceptionがスローされる。
C:\pleiades\workspace\sample3\src\main\webappにMETA-INFというフォルダを作成し、context.xmlを作成し、
以下のような設定にして動かすとDB接続できます。
xml
1<?xml version="1.0" encoding="UTF-8"?> 2<Context> 3 <Resources allowLinking="true" /> 4 <Resource 5 auth="Container" 6 description="MariaDB Datasource" 7 type="javax.sql.DataSource" 8 driverClassName="org.mariadb.jdbc.Driver" 9 name="jdbc/test" 10 username="hogeuser" 11 password="password" 12 url="jdbc:mariadb://localhost:3307/test" 13 maxtotal="1000" 14 validationQuery="select 1" 15 testOnBorrow="true" 16 timeBetweenEvictionRunsMillis="10000" 17 testWhileIdle="true" 18 numTestsPerEvictionRun="5"/> 19 <WatchedResource>WEB-INF/web.xml</WatchedResource> 20</Context>
また、context.lookupを使わずに以下のような実装をしても、DB接続できることを確認しました。
java
1 Class.forName ("org.mariadb.jdbc.Driver"); 2 conn = DriverManager.getConnection("jdbc:mariadb://localhost:3307/test", "hogeuser", "password"); 3 PreparedStatement statement 4 = conn.prepareStatement("select * from users"); 5 ResultSet result = statement.executeQuery();
mariadb-access.xmlが読み込めなくてエラーになってしまっていると思われて調べていますが、未だに解決できていません。
META-INFにcontext.xmlを作成する方法でもやれますが、勉強のためにCatalina\localhostフォルダにコンテキスト.xmlを配置する
やりかたで動作確認をしたいです。
JNDIを使ったDB接続設定のXMLファイル定義の仕方について詳しい方がいましたらご回答いただけないでしょうか?
よろしくお願いいたします。

あなたの回答
tips
プレビュー