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

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

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

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

Java

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Tomcat

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

Apache Tomcat

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

受付中

コンテキスト.xmlからDB設定情報を取得できない

Linkey
Linkey

総合スコア77

JDBC

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

Java

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Tomcat

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

Apache Tomcat

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

0回答

0評価

0クリップ

418閲覧

投稿2022/01/16 03:20

編集2022/01/16 03:45

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

<?xml version="1.0" encoding="UTF-8"?> <Context path="/mariadb-access" reloadable="true" docBase="c:/pleiades/workspace/sample3" workDir="c:/pleiades/workspace.metadata/.plugins/org.eclipse.wst.server.core/tmp1/work"> <Resources allowLinking="true" /> <Resource auth="Container" description="MariaDB Datasource" type="javax.sql.DataSource" driverClassName="org.mariadb.jdbc.Driver" name="jdbc/test" username="hogeuser" password="password" url="jdbc:mariadb://localhost:3307/test" maxtotal="1000" validationQuery="select 1" testOnBorrow="true" timeBetweenEvictionRunsMillis="10000" testWhileIdle="true" numTestsPerEvictionRun="5"/> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>

3.動作確認用の実装を行う。

java

package sample3.servlet; import java.io.IOException; import java.net.InetAddress; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class HogeServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Connection conn = null; try { Context context = new InitialContext(); // mariadb-access.xmlのDB設定情報を取得する DataSource dataSource = dataSource = (DataSource)context.lookup("java:comp/env/jdbc/test"); System.out.println("DB情報取得成功"); conn = dataSource.getConnection(); PreparedStatement statement = conn.prepareStatement("select * from users"); ResultSet result = statement.executeQuery(); while(result.next()){ System.out.println("id:" + result.getLong(1)); System.out.println("name:" + result.getString(2)); System.out.println("email:" + result.getString(3)); } } catch(NamingException e){ System.err.println("DB情報取得失敗"); e.printStackTrace(); throw e; } catch (Exception e2) { e2.printStackTrace(); System.err.println("DB検索失敗"); } finally { try { if(conn!=null) conn.close(); } catch (Exception e2) { // TODO: handle exception } } } }

4.プロジェクトにWEB-INFフォルダを作成し、web.xmlを作成。
C:\pleiades\workspace\sample3\src\main\webapp\WEB-INF\web.xml

xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <context-param> <param-name>logbackDisableServletContainerInitializer</param-name> <param-value>true</param-value> </context-param> <servlet> <servlet-name>HogeServlet</servlet-name> <servlet-class>sample3.servlet.HogeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HogeServlet</servlet-name> <url-pattern>/hoge</url-pattern> </servlet-mapping> <!-- mariadb-access.xmlのDB取得設定 --> <resource-ref> <res-ref-name>jdbc/test</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>

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

<?xml version="1.0" encoding="UTF-8"?> <Context> <Resources allowLinking="true" /> <Resource auth="Container" description="MariaDB Datasource" type="javax.sql.DataSource" driverClassName="org.mariadb.jdbc.Driver" name="jdbc/test" username="hogeuser" password="password" url="jdbc:mariadb://localhost:3307/test" maxtotal="1000" validationQuery="select 1" testOnBorrow="true" timeBetweenEvictionRunsMillis="10000" testWhileIdle="true" numTestsPerEvictionRun="5"/> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>

また、context.lookupを使わずに以下のような実装をしても、DB接続できることを確認しました。

java

Class.forName ("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mariadb://localhost:3307/test", "hogeuser", "password"); PreparedStatement statement = conn.prepareStatement("select * from users"); ResultSet result = statement.executeQuery();

mariadb-access.xmlが読み込めなくてエラーになってしまっていると思われて調べていますが、未だに解決できていません。
META-INFにcontext.xmlを作成する方法でもやれますが、勉強のためにCatalina\localhostフォルダにコンテキスト.xmlを配置する
やりかたで動作確認をしたいです。
JNDIを使ったDB接続設定のXMLファイル定義の仕方について詳しい方がいましたらご回答いただけないでしょうか?
よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JDBC

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

Java

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Tomcat

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

Apache Tomcat

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