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ファイルを作成します
ドキュメントは次のように読みます:
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接続をインポートします
この展開プロジェクトでは、展開が成功した後、にアクセスしてください。正常な動作結果は次のとおりです。