JNDI 路径 雄猫 vs. Jboss步骤 1:声明和查找资源引用步骤 2:将资源引用映射到数据源

2022-09-03 12:38:15

我有DataSource,它在上下文中在Tomcat 6上配置.xml 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。并且我将我的数据源及其连接池配置为同名的本地 tx 数据源。

当我执行上面的代码时,我得到了NameningException异常。经过一些调查,我发现在Jboss下调用我的DataSource的正确方法是

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

任何人都可以解释一下,为什么我应该在Jboss下的JNDI路径中省略“comp/env”?


答案 1

定义数据源的可移植方法是使用资源引用。资源引用使您能够定义相对于应用程序命名上下文 () 的数据源的 JNDI 名称,然后将该逻辑引用映射到应用程序服务器中定义的物理资源,其 JNDI 名称是应用程序服务器供应商专有的。此方法使您的代码和程序集能够移植到任何兼容的应用程序服务器。java:comp/env

步骤 1:声明和查找资源引用

备选案文1

这可以通过在 Web 部署描述符中声明一个 () 来完成:resource-refWEB-INF/web.xml

<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" . . . />

答案 2

您可以将“jndi-name”标记添加到数据源定义中:

jndi-name - 应绑定数据源的 JNDI 名称。

您可以在 JBoss wiki: ConfigDataSources 上找到数据源文档


推荐