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

我正在使用Websphere Portal 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。 我遇到过如下代码:

 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文件如下所示:

   PeformanceAppraisalStatus  index.html index.htm index.jsp default.html default.htm default.jsp    Datasource connection to Db jdbc/db javax.sql.DataSource Container Shareable   

我看到一个错误,描述了你们告诉我的事情,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:   Datasource connection to db jdbc/db javax.sql.DataSource Container Shareable jdbc/db  ibm-web-bnd.xml:      

似乎ibm-web-bnd.xml文件处理项目资源名称与websphere中的数据源之间的绑定。 一旦我添加了这一行:

  

Websphere Portal似乎很平庸。 我的代码现在正在工作并连接到数据库。

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

web.xml ,添加以下配置(根据需要修改名称和属性):

  Resource reference to my database jdbc/MyDB javax.sql.DataSource Container Shareable  

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

在您的代码中,您可以获得类似于您在示例中显示它的方式的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 Data Sources配置中定义的数据源(即通过websphere控制台),但java:comp / env / jdbc / xxxx中的查找意味着web.xml中需要有一个条目:

  jdbc/xxxx javax.sql.DataSource Container Shareable  

这意味着可以在每个应用程序基础上映射数据源,如果要将应用程序指向其他数据源,则无需更改数据源的名称。 将应用程序部署到需要指向不同数据库的不同服务器(例如test,preprod,prod)时,这非常有用。

服务DNS

需要了解JNDI,理解它是服务定位器。 当所需服务托管在与应用程序相同的服务器/节点上时,您可以使用InitialContext。

更复杂的是,在Web Sphere中定义数据源(至少在4.0之后)允许您定义不同程度的可见性。 基本上,它将命名空间添加到环境中,客户端必须知道资源的托管位置。

简单的例子 。

 javax.naming.InitialContext ctx = new javax.naming.InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/DataSourceAlias"); 

这是IBM的参考页面 。

如果您尝试从不在J2EE容器中的应用程序引用数据源,则需要稍微不同的方法,从类路径中需要一些J2EE客户端jar开始。 http://www.coderanch.com/t/75386/Websphere/lookup-datasources-JNDI-outside-EE

杰森,

这是它的工作原理。

Localnamespace – java:comp / env是应用程序使用的本地名称空间。 您在其中使用的名称jdbc / db只是一个别名。 它不是指物理资源。

在部署期间,此别名应映射到在WAS / WPS运行时定义的物理资源(在您的情况下是数据源)。

这实际上存储在ejb-bnd.xmi文件中。 在最新版本中,XMI替换为XML文件。 这些文件称为绑定文件。

HTH Manglu

对于像我这样的人,只需要有关如何使用JNDI查找从Java连接到(DB2)WAS数据源的信息(使用的IBM Websphere 8.5.5和DB2 Universal JDBC Driver Provider与实现类:com.ibm.db2.jcc。 DB2ConnectionPoolDataSource):

 public DataSource getJndiDataSource() throws NamingException { DataSource datasource = null; InitialContext context = new InitialContext(); // Tomcat/Possibly others: java:comp/env/jdbc/myDatasourceJndiName datasource = (DataSource) context.lookup("jdbc/myDatasourceJndiName"); return datasource; } 

查找以下代码以从您的Web应用程序服务器获取数据库连接。 只需在app server中创建数据源并使用以下代码获取连接:

 // To Get DataSource Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/abcd"); // Get Connection and Statement Connection c = ds.getConnection(); stmt = c.createStatement(); 

导入命名和SQL类。 无需添加任何xml文件或编辑项目中的任何内容。
而已..