javax.naming.NameNotFoundException:Name [jdbc / TomcatPool]はこのコンテキストにバインドされていませんfinできません



Javax Naming Namenotfoundexception



今日、組み込みのWeb接続プールデータソースを使用して取得するときに、次のエラーが発生しました。javax.naming.NameNotFoundException:名前[jdbc / TomcatPool]がこのコンテキストにバインドされていません[jdbc]が見つかりません何かを意味します。 JNDIによると、コンテナは名前がない場合に作成されます。これは、コンテナ内の特定の検索データソースのJNDI名ではありません。

次の手順に従って、組み込みのWebサーバーデータソースを使用します。



1.Webプロジェクトを作成します。プロジェクトの構造は次のとおりです。




2.UtilsディレクトリにJDBCUtil.javaを書き込みます

パッケージcom.nyist.cn.Utils
java.sql.Connectionをインポートします
java.sql.SQLExceptionをインポートします
javax.naming.Contextをインポートします
javax.naming.InitialContextをインポートします
javax.sql.DataSourceをインポートします
パブリッククラスJDBCUtil {

プライベート静的データソースds = null
静的{
{を試してください
コンテキストinitCtx = new InitialContext()
コンテキストenvCtx =(Context)initCtx.lookup( 'java:comp / env') // JNDIコンテナを作成します
System.out.println(envCtx)
ds =(DataSource)envCtx.lookup( 'jdbc / TomcatPool') //ソースコンテナJNDIからデータを取得します
} catch(例外e){
新しいRuntimeException(e)をスローします
}
}

public static Connection getConnection()はSQLException {をスローします
ds.getConnection()を返します
}

}



3.DaoディレクトリにJNDIDao.javaを書き込みます

パッケージcom.nyist.cn.Dao
java.sql.Connectionをインポートします
java.sql.SQLExceptionをインポートします
インポートcom.nyist.cn.Utils.JDBCUtil
パブリッククラスJNDIDao {

public void add()はSQLException {をスローします
接続con = JDBCUtil.getConnection()
System.out.println( '接続:' + con)
}

}

4の下のJNDIServlet.java。サーブレットディレクトリを書き込みます。

パッケージcom.nyist.cn.Servlet

java.io.IOExceptionをインポートします
java.sql.SQLExceptionをインポートします
インポートjavax.servlet.ServletException
インポートjavax.servlet.annotation.WebServlet
javax.servlet.http.HttpServletをインポートします
インポートjavax.servlet.http.HttpServletRequest
インポートjavax.servlet.http.HttpServletResponse
インポートcom.nyist.cn.Dao.JNDIDao

@WebServlet( '/ servlet')
パブリッククラスJNDIServletはHttpServlet {を拡張します
private static final long serialVersionUID = 1L

/ **構成Tomcatデータソースメソッド
* 1。以下のMETA-INFにcontext.xmlファイルを作成します。
* 2. Webコンテナが起動すると、context.xmlで生成されたデータソースがJNDIコンテナに自動的に読み込まれ、内部に入ります。
* 3.サーブレットプログラムでは、JNDI名で適切なデータソースを取得します
* /
@オーバーライド
public void doGet(HttpServletRequest req、HttpServletResponse resp)は、ServletException、IOException {をスローします。
JNDIDao dao = new JNDIDao()
{を試してください
dao.add()
} catch(SQLException e){
新しいRuntimeException(e)をスローします
}
}

@オーバーライド
public void doPost(HttpServletRequest req、HttpServletResponse resp)は、ServletException、IOException {をスローします。
super.doGet(req、resp)
}

}


5. WebRoot / META-INFにcontext.xmlファイルを作成します

ドキュメントは次のように読みます:



username = 'root' password = '410923' driverClassName = 'com.mysql.jdbc.Driver'
url = 'jdbc:mysql:// localhost:3306 / lhg' maxTotal = '8' maxIdle = '4' initialSize = '10'
/>

Webプロジェクトの後に作成され、ローカルサーバーにデプロイし、次のエラーを確認するために実行します(実際にはエラーを報告する必要がありますが、エラーのエラーはそのようなエラーを望んでいません)



私はデータソースのJBDIコンテナ種の名前で慎重に管理しており、何も問題はありませんが、なぜそのような間違いを詰め込むのでしょうか。

理由:Webサーバーが対応する構成ファイルを解析して生成するときにWebRoot / META-INF / context.xmlを作成しますか? Fを置くには: apache-tomcat-9.0.0.M26 conf Catalina localhostより低いプロファイルを生成したいだけですが、再公開時にプロジェクトを削除し、問題を解決しました。

*注:context.xmlは最初ではありません

しかし、操作後、別の変更エラーが見つかります。


mysql接続ドライバーが発生していないため、フィードバックエラーメッセージから確認できます。なぜ私が明らかにlibファイルのインポートの下で私のWebプロジェクトにドライブを追加するのか疑問に思っていますが、そのような間違いも報告されていますか?

理由:Tomcatの組み込み接続プールを使用しています。つまり、適切なサーバー接続プールを作成するために使用しているため、データベースサーバージョブに接続するためのドライブを提供する必要があります。そうしないと、このエラーが報告されます。

解決策:Tomcatのlibディレクトリにドライバファイルのmysql接続をインポートします


この展開プロジェクトでは、展開が成功した後、にアクセスしてください。正常な動作結果は次のとおりです。