Jak połączyć się ze źródłem danych Websphere o podanej nazwie JNDI?

Używam Websphere Portal 7.0 i tworzę portlet z RAD 8.0. Mój portlet próbuje nawiązać połączenie db2 ze zdalnym serwerem. Napisałem lokalnie program java do wykonywania podstawowego połączenia JDBC z serwerem i pobierania rekordów z tabeli. Kod działa dobrze; jednak, gdy dodam kod do mojego portleta, a także db2jcc4.jar, połączenie nie działa. Używam basic:

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

Myślę, że korzystanie z Websphere datasource jest właściwą drogą. Znam nazwę JNDI dla źródła danych, ale nie znajduję jasnych przykładów, jak nawiązać połączenie. Kilka przykładów używa klasy DataSource (wpisałem to i nie wygląda na to, że pochodzi z natywnego pakietu java, więc jakiego importu tutaj używam?) w połączeniu z kontekstem. Natknąłem się na kod typu:

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

... Czy ktoś może mi to wyjaśnić?

EDIT 1

Zaktualizowałem mój kod zgodnie z wymienionymi odpowiedziami. Naprawdę myślę, że jestem coraz bliżej. Oto mój getConnection() "metoda": {]}

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;
}
Moja cała sieć.plik xml wygląda następująco:
<?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>

Widzę błąd, który opisuje dokładnie to, co mówicie, że Websphere powinien mnie do tego skłonić, ale nie:

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.

Tak, Wiem, że błędnie określiłem wydajność jako peformance w całej aplikacji.

Rozwiązanie

Byłam tak blisko. Oto brakujące bity, które sprawiły, że wszystko się ułożyło:
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>

Wygląda na to, że ibm-web-bnd.plik xml obsługuje powiązanie między nazwą zasobu projektu a źródłem danych w websphere. Kiedyś dodałem wiersz:

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

Portal Websphere wydawał się zadowolony. Mój kod działa i łączy się z bazą danych.

Author: Machavity, 2011-08-24

6 answers

Musisz zdefiniować odniesienie do zasobów w aplikacji, a następnie odwzorować to odniesienie do zasobów logicznych do zasobów fizycznych (źródła danych) podczas wdrażania.

W twoim web.xml dodaj następującą konfigurację (odpowiednio modyfikując nazwy i właściwości):

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

Następnie, podczas wdrażania aplikacji, WAS poprosi Cię o mapowanie tego odniesienia do zasobu (jdbc/MyDB) do źródła danych, w którym utworzyłeś WAS.

W Twoim kodzie możesz uzyskać źródło danych podobnie jak pokazałeś to w swoim przykładzie; jednak nazwa JNDI, której użyjesz do jej wyszukania, powinna być w rzeczywistości nazwą odniesienia do zasobów, którą zdefiniowałeś (res-ref-name), a nie nazwą JNDI fizycznego źródła danych. Należy również przedrostek res-ref-name z kontekstem nazewnictwa aplikacji (java:comp/env/).

Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");
 14
Author: shelley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 21:51:46

Aby uzyskać połączenie ze źródła danych, powinien działać następujący kod:

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

Podczas gdy możesz wyszukać źródło danych zdefiniowane w konfiguracji źródeł danych Websphere (tj. poprzez konsolę websphere) bezpośrednio, wyszukiwanie z java:comp/env/jdbc/xxxx oznacza, że w sieci musi znajdować się wpis.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>

Oznacza to, że źródła danych mogą być mapowane na bazach poszczególnych aplikacji i nie trzeba zmieniać nazwy źródła danych, jeśli chcesz skierować aplikację na inne źródło danych. Jest to przydatne podczas wdrażania aplikacji na różnych serwerach (np. test, preprod, prod), które muszą wskazywać na różne bazy danych.

 3
Author: beny23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 21:02:09

DNS dla usług

Do JNDI należy podchodzić ze zrozumieniem, że jest to lokalizator usług. Gdy żądana usługa jest hostowana na tym samym serwerze / węźle co aplikacja, użycie InitialContext może zadziałać.

Bardziej skomplikowane jest to, że zdefiniowanie źródła danych w sferze internetowej (przynajmniej w 4.0) pozwoliło zdefiniować widoczność w różnym stopniu. Zasadniczo dodaje przestrzenie nazw do środowiska i klienci muszą wiedzieć, gdzie zasób jest gospodarzem.

Prosty przykład .

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

Oto strona referencyjna IBM .

Jeśli próbujesz odwołać się do źródła danych z aplikacji, która nie znajduje się w kontenerze J2EE, będziesz potrzebował nieco innego podejścia, zaczynając od potrzeby słoików klienta J2EE w swojej ścieżce classpath. http://www.coderanch.com/t/75386/Websphere/lookup-datasources-JNDI-outside-EE

 2
Author: Kelly S. French,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 13:22:42

Jason,

Tak to działa.

Localnamespace-java: comp / env jest lokalną przestrzenią nazw używaną przez aplikację. Nazwa, której w nim używasz jdbc / db jest tylko aliasem. Nie odnosi się do fizycznego zasobu.

Podczas wdrażania alias ten powinien być mapowany do fizycznego zasobu (w Twoim przypadku źródła danych), który jest zdefiniowany na czas uruchomienia WAS/WPS.

To jest faktycznie przechowywane w ejb-bnd.pliki xmi. W najnowszych wersjach xmis są zastępowane przez XML pliki. Pliki te są określane jako pliki wiążące.

HTH Manglu

 0
Author: Manglu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-25 03:55:22

Dla takich jak ja, tylko potrzebujących informacji o tym, jak połączyć się z (DB2) było źródło danych z Javy za pomocą JNDI lookup (używany IBM Websphere 8.5.5 & DB2 Universal JDBC Driver Provider Z klasą implementacji: 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
Author: straville,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 07:31:20

Znajdź poniższy kod, aby uzyskać połączenie z bazą danych z serwera aplikacji internetowej. Po prostu utwórz datasource w app server i użyj następującego kodu, aby uzyskać połączenie:

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

Import nazw i klas sql. Nie trzeba dodawać żadnego pliku xml ani edytować czegokolwiek w projekcie.
To wszystko..

 0
Author: blackberry dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 06:21:48