簡體   English   中英

JNDI路徑Tomcat與Jboss

[英]JNDI path Tomcat vs. Jboss

我有DataSource,它在context.xml中的T​​omcat 6上配置為MyDataSource。 我正在通過以下方式獲取它:

      DataSource dataSource;
            try {
                dataSource = (DataSource) new InitialContext().lookup("java:comp/env/MyDataSource");
            } catch (NamingException e) {
                throw new DaoConfigurationException(
                    "DataSource '" + url + "' is missing in JNDI.", e);
            }

一切正常。 現在我將此代碼導出到Jboss AP 6.我將我的dataSource及其連接池配置為local-tx dataSource,名稱相同。

當我執行上面的代碼時,我收到了NamingException異常。 經過一番調查后,我發現在Jboss下調用我的DataSource的正確方法是

 dataSource = (DataSource) new InitialContext().lookup("java:/MyDataSource");

任何人都可以解釋一下我為什么要在Jboss下的JNDI路徑中省略“comp / env”?

用於定義數據源的可移植方法是使用資源引用 資源引用使您能夠相對於應用程序命名上下文( java:comp/env )定義數據源的JNDI名稱,然后將該邏輯引用映射到應用程序服務器中定義的物理資源 ,其JNDI名稱是專有的應用程序服務器供應商 這種方法使您的代碼和程序集可以移植到任何兼容的應用程序服務器。

第1步:聲明和查找資源參考

選項1

這可以通過在Web部署描述符( WEB-INF/web.xml )中聲明resource-ref來完成:

<resource-ref>
    <description>My Data Source.</description>
    <res-ref-name>jdbc/MyDataSource</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在代碼中,您可以使用JNDI名稱java:comp/env/jdbc/MyDataSource查找此資源:

dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDataSource");

無論部署應用程序的服務器如何,此JNDI名稱都不會更改。

選項2

或者,從Java EE 5(Servlet 2.5)開始,使用@Resource注釋可以在代碼中更輕松地完成此操作。 這消除了在Web部署描述符(web.xml)中配置resource-ref的需要,並且無需執行顯式JNDI查找:

public class MyServlet extends HttpServlet {

    @Resource(name = "jdbc/MyDataSource")
    private DataSource dataSource;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // dataSource may be accessed directly here since the container will automatically
        // inject an instance of the data source when the servlet is initialized

}

此方法與前一個選項具有相同的結果,但會減少程序集中的樣板代碼和配置。

第2步:將資源引用映射到數據源

然后,您將需要使用應用程序服務器的專有方法將資源引用映射到您在服務器上創建的物理數據源 ,例如,使用JBoss的自定義部署描述符( WEB-INF/jboss-web.xml ):

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <resource-ref>
        <res-ref-name>jdbc/MyDataSource</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <jndi-name>java:/MyDataSource</jndi-name>
    </resource-ref>
</jboss-web>

或者,例如,使用Tomcat的context.xml

<Resource name="jdbc/MyDataSource" . . . />

您可以在數據源定義中添加'jndi-name'標記:

jndi-name - 應綁定DataSource的JNDI名稱。

您可以在JBoss wiki上找到數據源文檔: ConfigDataSources

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM