web-dev-qa-db-fra.com

Comment me connecter à une source de données Websphere avec un nom JNDI donné?

J'utilise Websphere Portal 7.0 et je crée un portlet avec RAD 8.0. Mon portlet essaie d'établir une connexion db2 à un serveur distant. J'ai écrit un Java = programme localement pour établir une connexion JDBC de base au serveur et obtenir des enregistrements à partir d'une table. Le code fonctionne correctement; cependant, lorsque j'ajoute le code à mon portlet ainsi qu'à db2jcc4.jar, la connexion ne fonctionne pas. I utilise la base:

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

Je pense que l'utilisation de la source de données Websphere est la bonne solution. Je connais le nom JNDI de la source de données, mais je ne trouve pas d'exemples précis sur la façon d'établir une connexion. Plusieurs exemples utilisent une classe DataSource (j'ai tapé ceci et cela ne semble pas provenir d'un package Java package donc quelle importation dois-je utiliser ici?) Couplé à un contexte. I ' ai rencontré du code comme:

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

... Quelqu'un peut-il décomposer cela pour moi?

MODIFIER 1

J'ai mis à jour mon code selon les réponses répertoriées. Je pense vraiment que je me rapproche. Voici ma méthode 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;
}

Tout mon fichier web.xml ressemble à:

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

Je vois une erreur qui décrit la chose que vous me dites que Websphere devrait m'inviter à faire, mais ne le fait pas:

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.

Oui, je sais que j'ai mal orthographié les performances comme performances dans l'application.

SOLUTION

J'étais tellement proche. Voici les bits manquants qui ont tout mis en place:

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>

Il semble que le fichier ibm-web-bnd.xml gère la liaison entre le nom de la ressource du projet et la source de données dans websphere. Une fois que j'ai ajouté la ligne:

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

Le portail Websphere semblait apaisé. Mon code fonctionne et se connecte à la base de données maintenant.

21
jason

Vous devez définir un référence de ressource dans votre application, puis mapper cette référence de ressource logique à la ressource physique (source de données) pendant le déploiement.

Dans votre web.xml, ajoutez la configuration suivante (en modifiant les noms et les propriétés selon le cas):

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

Ensuite, lors du déploiement de l'application, WAS vous invite à mapper cette référence de ressource (jdbc/MyDB) à la source de données que vous avez créée dans WAS.

Dans votre code, vous pouvez obtenir le DataSource de la même manière que vous l'avez montré dans votre exemple; cependant, le nom JNDI que vous utiliserez pour le rechercher devrait en fait être le nom de la référence de ressource que vous avez défini (res-ref-name), plutôt que le nom JNDI de la source de données physique. De plus, vous devrez préfixer le res-ref-name avec le contexte de dénomination de l'application (Java:comp/env/).

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

Pour obtenir une connexion à partir d'une source de données, le code suivant doit fonctionner:

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

Bien que vous puissiez rechercher une source de données telle que définie dans la configuration des sources de données Websphere (c'est-à-dire via la console Websphere) directement, la recherche depuis Java: comp/env/jdbc/xxxx signifie qu'il doit y avoir une entrée dans 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>

Cela signifie que les sources de données peuvent être mappées sur une base par application et que vous n'avez pas besoin de modifier le nom de la source de données si vous souhaitez pointer votre application vers une autre source de données. Cela est utile lors du déploiement de l'application sur différents serveurs (par exemple, test, préprod, prod) qui doivent pointer vers différentes bases de données.

3
beny23

DNS pour les services

JNDI doit être approché en sachant qu'il s'agit d'un localisateur de services. Lorsque le service souhaité est hébergé sur le même serveur/nœud que l'application, votre utilisation d'InitialContext peut fonctionner.

Ce qui le rend plus compliqué, c'est que la définition d'une source de données dans Web Sphere (au moins dans 4.0) vous a permis de définir la visibilité à différents degrés. Fondamentalement, il ajoute des espaces de noms à l'environnement et les clients doivent savoir où la ressource est hébergée.

exemple simple .

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

Voici IBM page de référence .

Si vous essayez de référencer une source de données à partir d'une application qui N'EST PAS dans le conteneur J2EE, vous aurez besoin d'une approche légèrement différente en commençant par avoir besoin de quelques fichiers J2EE client dans votre chemin de classe. http://www.coderanch.com/t/75386/Websphere/lookup-datasources-JNDI-outside-EE

2
Kelly S. French

Jason,

Voilà comment cela fonctionne.

Localnamespace - Java: comp/env est un espace de noms local utilisé par l'application. Le nom que vous y utilisez jdbc/db n'est qu'un alias. Il ne fait pas référence à une ressource physique.

Pendant le déploiement, cet alias doit être mappé sur une ressource physique (dans votre cas, une source de données) définie lors de l'exécution de WAS/WPS.

Ceci est en fait stocké dans des fichiers ejb-bnd.xmi. Dans les dernières versions, les XMI sont remplacés par des fichiers XML. Ces fichiers sont appelés fichiers de liaison.

HTH Manglu

0
Manglu

Pour ceux comme moi, ayant uniquement besoin d'informations sur la façon de se connecter à une source de données WAS (DB2) à partir de Java à l'aide de la recherche JNDI (utilisé IBM Websphere 8.5.5 DB2 Universal JDBC Driver Provider avec classe d'implémentation: 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

Trouvez le code ci-dessous pour obtenir une connexion à la base de données à partir de votre serveur d'applications Web. Créez simplement une source de données dans le serveur d'applications et utilisez le code suivant pour obtenir la connexion:

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

Importez les classes de nommage et sql. Pas besoin d'ajouter un fichier xml ou de modifier quoi que ce soit dans le projet.
C'est ça..

0
blackberry dev