当前位置: 首页 > 面试题库 >

如何使用给定的JNDI名称连接到Websphere数据源?

杜高谊
2023-03-14
问题内容

我正在使用Websphere Portal 7.0并使用RAD
8.0创建一个portlet。我的portlet试图建立到远程服务器的db2连接。我在本地编写了一个Java程序来与服务器建立基本的JDBC连接,并从表中获取记录。代码工作正常;但是,当我将代码以及db2jcc4.jar添加到我的portlet时,连接不起作用。我正在使用基本的:

Connection connection = DriverManager.getConnection("jdbc:db2://server:port/db:user=user;password=pw;");

我认为使用Websphere数据源是正确的方法。我知道数据源的JNDI名称,但是我找不到关于如何建立连接的清晰示例。几个示例使用了一个DataSource类(我在其中键入了它,这似乎不是来自本机Java包,所以我在这里使用什么导入?)与Context结合使用。我遇到过类似的代码:

Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");

…有人可以帮我分解一下吗?

编辑1

我已经按照列出的答案更新了代码。我真的觉得我越来越近了。这是我的getConnection()方法:

private Connection getConnection() throws SQLException {
    javax.naming.InitialContext ctx = null;
    javax.sql.DataSource ds = null;
    System.out.println("Attempting connection..." + DateUtil.now() );
    try {
        ctx = new javax.naming.InitialContext();
        ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/db");
        connection = ds.getConnection();
    } catch (NamingException e) {
        System.out.println("peformanceappraisalstatus: COULDN'T CREATE CONNECTION!");
        e.printStackTrace();
    }       
    System.out.println("connection: " + connection.getClass().getName() + " at " + DateUtil.now());
    return connection;
}

我的整个web.xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>PeformanceAppraisalStatus</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <resource-ref>
        <description>
        Datasource connection to Db</description>
        <res-ref-name>jdbc/db</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
</web-app>

我看到一个错误,该错误描述了你们在告诉我Websphere应该提示我做的事情,但没有这样做:

SRVE0169I: Loading Web Module: PeformanceAppraisalStatus.
[8/23/11 18:08:02:166 CDT] 00000009 InjectionProc E   CWNEN0044E: A resource reference binding could not be found for the jdbc/db resource reference, defined for the PeformanceAppraisalStatus component.
[8/23/11 18:08:02:169 CDT] 00000009 InjectionEngi E   CWNEN0011E:  The injection engine failed to process bindings for the metadata.

是的,我知道我将整个应用程序的性能误认为是性能。

我离我很近。这是使所有内容都正确的缺失位:

web.xml:
<resource-ref>      
    <description>
    Datasource connection to db</description>
    <res-ref-name>jdbc/db</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    <mapped-name>jdbc/db</mapped-name>      
</resource-ref>

ibm-web-bnd.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-bnd 
    xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
    version="1.0">

    <virtual-host name="default_host" />


    <resource-ref name="jdbc/db" binding-name="jdbc/mydatasource" />
</web-bnd>

看来ibm-web-bnd.xml文件处理了Websphere中项目资源名称和数据源之间的绑定。添加行后:

<resource-ref name="jdbc/db" binding-name="jdbc/mydatasource" />

Websphere Portal似乎很安逸。我的代码正在运行,现在正在连接到数据库


问题答案:

您需要在应用程序中定义 资源引用 ,然后在部署期间将该逻辑资源引用映射到物理资源(数据源)。

在您的中web.xml,添加以下配置(适当地修改名称和属性):

<resource-ref>
    <description>Resource reference to my database</description>
    <res-ref-name>jdbc/MyDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

然后,在应用程序部署期间,WAS将提示您将该资源引用(jdbc/MyDB)映射到您在WAS中创建的数据源。

在您的代码中,您可以获得与示例中所示类似的数据源。但是,用于查找它的JNDI名称实际上应该是您定义的资源引用的名称(res-ref- name),而不是物理数据源的JNDI名称。另外,您需要在res-ref-name前面加上应用程序命名上下文(java:comp/env/)。

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


 类似资料:
  • 使用JNDI,我可以连接到ActiveMQ。但是当切换提供程序类时,它给了我以下异常。 Spring JNDI配置: 例外情况: null

  • 我刚来spring,有以下问题。 我正在处理一个应用程序,运行在JBoss服务器上,它必须使用JDBCTemplate在DB上执行查询。 在JBoss中,我设置了标识数据库连接的JNDI名称。 我尝试实现了这个JdbcTemplate的简单示例,对我来说,JdbcTemplate是如何工作的非常清楚。在本例中,为了创建到数据库的连接,它定义了一个dataSource bean,然后将其注入到使用J

  • 我有一个与post中指定的相同的要求,即为了审计目的,将用户id作为客户端标识符传递。在syscontext/连接上通过Hibernate传递ClientInfo/ClientIdentifier以进行审核 我遵循了8.2中提到的相同方法。自定义数据源连接准备程序的配置http://docs.spring.io/spring-data/jdbc/docs/current/reference/htm

  • 我有一个遗留的 EJB 2 应用程序,我将其部署到 Websphere 8.5 中。该应用程序具有依赖关系,这些依赖关系定义了与数据源的 JNDI 绑定.xml和 /元.xml数据源.xml 我不允许更改这些依赖项中的代码,也不能更改Websphere的配置。但我可以更改jar文件中的配置文件。 我想在我的应用程序中覆盖有效的JNDI绑定。是否可以定义一个将添加到Ear的文件来覆盖这些绑定? ej

  • 环境- WAS 7.0和EJB 2.1 我有一个耳朵与EJB罐文件。它有一些远程EJB(EJB 2.1),我想转换为本地EJB。因此,我必须按照我的理解修改ejb-jar.xml。 我修改的ejb-jar xml文件如下: ,并且是本地 ejb 新添加的标记。 我的绑定文件如下 - 在部署 EAR 文件期间,我收到以下错误 - com . IBM . WebSphere . management

  • 我有一个Java/Spring web应用程序,它需要作为war文件部署在Wildfly和Websphere上 应用程序正在使用具有JNDI名称的datasource: 但Wildfly JNDI名称必须以“java:/”或“java:jboss/”开头 更改可以完成以下工作: 哪个JNDI数据源名称在Wildfly和Websphere上都可以使用(可能在其他应用服务器上也可以吗?)