我正在使用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文件如下所示:
<?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似乎很平庸。我的代码现在正在工作并连接到数据库。
答案 0 :(得分:14)
您需要在应用程序中定义资源引用,然后在部署期间将该逻辑资源引用映射到物理资源(数据源)。
在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中创建的数据源。
在您的代码中,您可以获得类似于您在示例中显示它的方式的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");
答案 1 :(得分:3)
要从数据源获取连接,以下代码应该有效:
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:
<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>
这意味着可以在每个应用程序基础上映射数据源,如果要将应用程序指向其他数据源,则无需更改数据源的名称。将应用程序部署到需要指向不同数据库的不同服务器(例如test,preprod,prod)时,这非常有用。
答案 2 :(得分:2)
JNDI需要了解它是一个服务定位器。当所需服务托管在与应用程序相同的服务器/节点上时,您可以使用InitialContext。
更复杂的是,在Web Sphere中定义数据源(至少在4.0之后)允许您定义不同程度的可见性。基本上它会向环境添加名称空间,客户端必须知道资源的托管位置。
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/DataSourceAlias");
这是IBM的reference page。
如果您尝试从不在J2EE容器中的应用程序引用数据源,则需要稍微不同的方法,从类路径中需要一些J2EE客户端jar开始。 http://www.coderanch.com/t/75386/Websphere/lookup-datasources-JNDI-outside-EE
答案 3 :(得分:0)
杰森,
这是它的工作原理。
Localnamespace - java:comp / env是应用程序使用的本地名称空间。您在其中使用的名称jdbc / db只是一个别名。它不涉及物理资源。
在部署期间,此别名应映射到在WAS / WPS运行时定义的物理资源(在您的情况下是数据源)。
这实际上存储在ejb-bnd.xmi文件中。在最新版本中,XMI替换为XML文件。这些文件称为绑定文件。
HTH Manglu
答案 4 :(得分:0)
查找以下代码以从您的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文件或编辑项目中的任何内容 那就是..
答案 5 :(得分:0)
对于像我这样的人,只需要有关如何使用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;
}