Websphere Portal 7.0を使用して、RAD 8.0でポートレットを作成しています。私のポートレットは、リモートサーバーへのdb2接続を試みています。Java =サーバーへの基本的なJDBC接続を行い、テーブルからレコードを取得するためにローカルでプログラムしますが、コードは正常に機能しますが、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");
...誰かが私のためにこれを分解できますか?
編集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.
はい、アプリ全体のパフォーマンスをパフォーマンスと間違えたことを知っています。
[〜#〜] solution [〜#〜]
私はとても近くにいました。以下は、すべてが適切に配置されなかった欠落ビットです。
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はなだめられたようです。私のコードは現在動作しており、データベースに接続しています。
アプリケーションでresource referenceを定義し、展開中にその論理リソース参照を物理リソース(データソース)にマップする必要があります。
あなたの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");
データソースから接続を取得するには、次のコードが機能するはずです。
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 configで定義されたデータソースを(つまり、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>
つまり、データソースはアプリケーションごとにマッピングでき、アプリを別のデータソースにポイントする場合は、データソースの名前を変更する必要はありません。これは、異なるデータベースを指す必要がある異なるサーバー(テスト、プリプロッド、プロドなど)にアプリケーションをデプロイするときに役立ちます。
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マングル
私のような人には、JNDIルックアップを使用してJavaから(DB2)WASデータソースに接続する方法に関する情報のみが必要です(実装クラス:com.ibmでIBM Websphere 8.5.5およびDB2 Universal JDBC Driver Providerを使用します)。 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アプリサーバーからデータベース接続を取得するには、以下のコードを見つけます。アプリサーバーでデータソースを作成し、次のコードを使用して接続を取得します。
// 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ファイルを追加したり、プロジェクトで何かを編集したりする必要はありません。
それでおしまい..