简体   繁体   English

JNDI路径Tomcat与Jboss

[英]JNDI path Tomcat vs. Jboss

I have DataSource which is configured on Tomcat 6 in context.xml as MyDataSource. 我有DataSource,它在context.xml中的T​​omcat 6上配置为MyDataSource。 And I'm fetching it the following way: 我正在通过以下方式获取它:

      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);
            }

Everything works fine. 一切正常。 Now I'm exporting this code to Jboss AP 6. and I configured my dataSource and its connection pool as local-tx dataSource under the same name. 现在我将此代码导出到Jboss AP 6.我将我的dataSource及其连接池配置为local-tx dataSource,名称相同。

When I'm executing the code above, I'm getting NamingException exception. 当我执行上面的代码时,我收到了NamingException异常。 after some investigation I've found that correct way to call my DataSource under Jboss is 经过一番调查后,我发现在Jboss下调用我的DataSource的正确方法是

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

Can anybody explain me why should I omit "comp/env" in my JNDI path under Jboss? 任何人都可以解释一下我为什么要在Jboss下的JNDI路径中省略“comp / env”?

The portable approach for defining data sources is to use a resource reference . 用于定义数据源的可移植方法是使用资源引用 Resource references enable you to define the JNDI name for your data source, relative to your application naming context ( java:comp/env ), and then map that logical reference to the physical resource defined in the application server, whose JNDI name is proprietary to the application server vendor. 资源引用使您能够相对于应用程序命名上下文( java:comp/env )定义数据源的JNDI名称,然后将该逻辑引用映射到应用程序服务器中定义的物理资源 ,其JNDI名称是专有的应用程序服务器供应商 This approach enables your code and assembly to be portable to any compliant application server. 这种方法使您的代码和程序集可以移植到任何兼容的应用程序服务器。

Step 1: Declare and Lookup Resource Reference 第1步:声明和查找资源参考

Option 1 选项1

This can be done by declaring a resource-ref in your web deployment descriptor ( WEB-INF/web.xml ): 这可以通过在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>

Within your code, you can then lookup this resource using the JNDI name java:comp/env/jdbc/MyDataSource : 在代码中,您可以使用JNDI名称java:comp/env/jdbc/MyDataSource查找此资源:

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

This JNDI name will not change regardless of the server where the application is deployed. 无论部署应用程序的服务器如何,此JNDI名称都不会更改。

Option 2 选项2

Alternatively, starting in Java EE 5 (Servlet 2.5), this can be done even easier within your code using the @Resource annotation. 或者,从Java EE 5(Servlet 2.5)开始,使用@Resource注释可以在代码中更轻松地完成此操作。 This eliminates the need for configuring the resource-ref in your web deployment descriptor (web.xml) and prevents the need to perform an explicit JNDI lookup: 这消除了在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

}

This approach has the same results as the previous option, but cuts down on the boilerplate code and configuration in your assembly. 此方法与前一个选项具有相同的结果,但会减少程序集中的样板代码和配置。

Step 2: Map Resource Reference to Data Source 第2步:将资源引用映射到数据源

Then, you will need to use your application server's proprietary approach for mapping the resource reference to the physical data source that you created on the server, for example, using JBoss's custom deployment descriptors ( WEB-INF/jboss-web.xml ): 然后,您将需要使用应用程序服务器的专有方法将资源引用映射到您在服务器上创建的物理数据源 ,例如,使用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>

Or, for example, using Tomcat's context.xml : 或者,例如,使用Tomcat的context.xml

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

You can add to your data source definition the 'jndi-name' tag: 您可以在数据源定义中添加'jndi-name'标记:

jndi-name - the JNDI name under which the DataSource should be bound. jndi-name - 应绑定DataSource的JNDI名称。

You can find data source documentation on JBoss wiki: ConfigDataSources 您可以在JBoss wiki上找到数据源文档: ConfigDataSources

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM