如何用给定的JNDI名称连接到Websphere Datasource?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (129)

我正在使用WebspherePortal 7.0并使用RAD 8.0创建一个Portlet。我的portlet正在尝试与远程服务器建立DB2连接。我在本地编写了一个Java程序,以实现与服务器的基本JDBC连接,并从表中获取记录。代码运行良好;但是,当我将代码添加到portlet和db2jcc4.jar时,连接就无法工作。我用的是基本的:

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

我认为使用Websphere数据源是正确的方法。我知道数据源的JNDI名称,但我没有找到关于如何建立连接的明确示例。有几个例子使用了DataSource类(我输入了这个类,这看起来不像是来自本机java包,所以我在这里使用什么导入?),再加上一个上下文。我遇到了这样的代码:

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

下面是我的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" />

WebSpherePortal看起来很平静。我的代码现在正在工作并连接到数据库。

提问于
用户回答回答于

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

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)中创建的数据源。

在您的代码中,您可以获得与在示例中显示它的方式类似的DataSource;但是,用于查找它的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");
用户回答回答于

要从数据源获得连接,以下代码应该可以工作:

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

Context ctx = new InitialContext();
DataSource dataSource = ctx.lookup("java:comp/env/jdbc/xxxx");
Connection conn = dataSource.getConnection();

// use the connection

conn.close();

虽然您可以直接查找Websphere数据源配置(即通过websphere控制台)中定义的数据源,但是从java:comp/env/jdbc/xxxx中查找意味着web.xml中需要有一个条目:

<resource-ref>
    <res-ref-name>jdbc/xxxx</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

如果要将应用程序指向不同的数据源,则不需要更改数据源的名称。

扫码关注云+社区