it-swarm.com.de

Wie verbinde ich mich mit einer Websphere-Datenquelle mit einem bestimmten JNDI-Namen?

Ich verwende Websphere Portal 7.0 und erstelle ein Portlet mit RAD 8.0. Mein Portlet versucht, eine db2-Verbindung zu einem Remote-Server herzustellen. Ich habe ein Java) geschrieben = lokal programmieren, um eine grundlegende JDBC-Verbindung zum Server herzustellen und Datensätze aus einer Tabelle abzurufen. Der Code funktioniert einwandfrei. Wenn ich jedoch den Code meinem Portlet sowie der Datei db2jcc4.jar hinzufüge, funktioniert die Verbindung nicht benutze das basic:

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

Ich denke, dass die Verwendung der WebSphere-Datenquelle der richtige Weg ist. Ich kenne den JNDI-Namen für die Datenquelle, finde jedoch keine eindeutigen Beispiele zum Herstellen einer Verbindung. Einige Beispiele verwenden eine DataSource-Klasse (ich habe dies eingegeben und es scheint nicht, als stamme sie aus einem nativen Java Paket, welchen Import verwende ich also hier?)) In Verbindung mit einem Kontext. Wir stoßen auf Code wie:

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

... Kann das jemand für mich aufschlüsseln?

EDIT 1

Ich habe meinen Code anhand der aufgeführten Antworten aktualisiert. Ich glaube wirklich, dass ich näher komme. Hier ist meine getConnection () -Methode:

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;
}

Meine gesamte web.xml-Datei sieht folgendermaßen aus:

<?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>

Es wird ein Fehler angezeigt, der genau das beschreibt, was Sie mir sagen. Websphere sollte mich dazu auffordern, tut dies aber nicht:

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.

Ja, ich weiß, dass ich die Leistung in der gesamten App falsch geschrieben habe.

LÖSUNG

Ich war so nah dran. Hier sind die fehlenden Teile, die alles zusammengebracht haben:

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>

Es scheint, dass die Datei ibm-web-bnd.xml die Bindung zwischen dem Projektressourcennamen und der Datenquelle in WebSphere verwaltet. Sobald ich die Zeile hinzugefügt habe:

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

Websphere Portal schien beschwichtigt zu sein. Mein Code funktioniert und verbindet sich jetzt mit der Datenbank.

21
jason

Sie müssen in Ihrer Anwendung ein Ressourcenreferenz definieren und diese logische Ressourcenreferenz dann während der Bereitstellung der physischen Ressource (Datenquelle) zuordnen.

In deiner web.xml, fügen Sie die folgende Konfiguration hinzu (ändern Sie die Namen und Eigenschaften entsprechend):

<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>

Während der Anwendungsbereitstellung fordert WAS Sie dann auf, diese Ressourcenreferenz zuzuordnen (jdbc/MyDB) zu der Datenquelle, die Sie in WAS erstellt haben.

In Ihrem Code können Sie die DataSource erhalten, ähnlich wie Sie sie in Ihrem Beispiel gezeigt haben. Der JNDI-Name, den Sie zum Nachschlagen verwenden, sollte jedoch tatsächlich der von Ihnen definierte Name der Ressourcenreferenz sein (res-ref-name) anstelle des JNDI-Namens der physischen Datenquelle. Außerdem müssen Sie dem res-ref-name den Anwendungsnamenskontext voranstellen (Java:comp/env/).

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

Um eine Verbindung von einer Datenquelle zu erhalten, sollte der folgende Code funktionieren:

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();

Während Sie eine Datenquelle wie in der WebSphere Data Sources-Konfiguration definiert direkt nachschlagen können (d. H. Über die WebSphere-Konsole), bedeutet die Suche von Java aus: comp/env/jdbc/xxxx, dass ein Eintrag in web.xml vorhanden sein muss:

<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>

Dies bedeutet, dass Datenquellen pro Anwendung zugeordnet werden können und Sie den Namen der Datenquelle nicht ändern müssen, wenn Sie Ihre App auf eine andere Datenquelle verweisen möchten. Dies ist nützlich, wenn die Anwendung auf verschiedenen Servern (z. B. test, preprod, prod) bereitgestellt wird, die auf verschiedene Datenbanken verweisen müssen.

3
beny23

DNS für Dienste

JNDI muss mit dem Verständnis angegangen werden, dass es sich um einen Service Locator handelt. Wenn der gewünschte Dienst auf demselben Server/Knoten wie die Anwendung gehostet wird, funktioniert die Verwendung von InitialContext möglicherweise.

Erschwerend kommt hinzu, dass Sie durch das Definieren einer Datenquelle in Web Sphere (zumindest in 4.0) die Sichtbarkeit in unterschiedlichem Maße definieren können. Grundsätzlich werden der Umgebung Namespaces hinzugefügt, und die Clients müssen wissen, wo die Ressource gehostet wird.

Einfaches Beispiel .

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

Hier ist IBMs Referenzseite .

Wenn Sie versuchen, auf eine Datenquelle aus einer App zu verweisen, die NICHT im J2EE-Container enthalten ist, müssen Sie zunächst einige J2EE-Client-Jars in Ihrem Klassenpfad verwenden. http://www.coderanch.com/t/75386/Websphere/lookup-datasources-JNDI-outside-EE

2
Kelly S. French

Jason,

So funktioniert es.

Localnamespace - Java: comp/env ist ein von der Anwendung verwendeter lokaler Namensraum. Der Name, den Sie in jdbc/db verwenden, ist nur ein Alias. Es bezieht sich nicht auf eine physische Ressource.

Während der Bereitstellung sollte dieser Alias ​​einer physischen Ressource (in Ihrem Fall einer Datenquelle) zugeordnet werden, die in der WAS/WPS-Laufzeit definiert ist.

Dies ist tatsächlich in ejb-bnd.xmi-Dateien gespeichert. In den neuesten Versionen werden die XMIs durch XML-Dateien ersetzt. Diese Dateien werden als Bindungsdateien bezeichnet.

HTH Manglu

0
Manglu

Für Leute wie mich, die nur Informationen zum Herstellen einer Verbindung zu einer (DB2) WAS-Datenquelle über Java= mit JNDI-Lookup (Verwendet IBM Websphere 8.5.5 und DB2 Universal JDBC Driver Provider mit Implementierungsklasse) benötigen : 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;
}
0
straville

Suchen Sie nach dem folgenden Code, um eine Datenbankverbindung von Ihrem Web-App-Server zu erhalten. Erstellen Sie einfach eine Datenquelle in App Server und verwenden Sie den folgenden Code, um eine Verbindung herzustellen:

// 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();

Importieren Sie Namens- und SQL-Klassen. Es ist nicht erforderlich, eine XML-Datei hinzuzufügen oder irgendetwas im Projekt zu bearbeiten.
Das ist es..

0
blackberry dev