Aller au contenu | Aller au menu | Aller à la recherche


Utiliser la base de données d'une DataSource Jboss depuis un programme externe à Jboss en utilisant la JNDI

Comment utiliser une DataSource Mysql Jboss depuis un programme externe à Jboss en utilisant la JNDI ?

Client java externe utilisant la datasource d'un serveur Jboss

Selon How to connect to a DataSource from a remote client? : Si vous voulez vous connecter à votre pool de connexion JBoss partir d'un client distant (qui est un client qui n'est pas déployé sur JBoss), vous devez dire à JBoss de ne pas lier la source de données dans le cadre du "java: /"

Et en effet, l'ajout de <use-java-context>false</use-java-context> permet de se connecter directement depuis programme client externe à la base de donnée définie par le datasource sous Jboss et déclaré dans la JNDI

<?xml version="1.0" encoding="UTF-8"?>
 
<!-- $Id: mysql-ds.xml 63175 2007-05-21 16:26:06Z rrajesh $ -->
<!--  Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
-->
 
<datasources>
  <local-tx-datasource>
    <jndi-name>DsMysql</jndi-name>
	<use-java-context>false</use-java-context>  <!-- HOW TO CONNECT TO A DATASOURCE FROM A REMOTE CLIENT? http://www.mastertheboss.com/en/jboss-howto/45-jboss-persistence/93-jboss-datasource-remote-client.html -->
    <connection-url>jdbc:mysql://localhost:3306/mabase</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>monUser</user-name>
    <password>monPass</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <!-- should only be used on drivers after 3.22.1 with "ping" support
    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
    -->
    <!-- sql to call when connection is created
    <new-connection-sql>some arbitrary sql</new-connection-sql>
      -->
    <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers
    <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
      -->
 
    <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml -->
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

Le programme client java :

import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
 
public class BindClientDataSourceJboss {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
 
		String urlObjetJndiName = "DsMysql";
 
        PreparedStatement ps;
        ResultSet rs;
 
//        Pour éviter de préciser dans le code les paramètres de connexion JNDI, vous pouvez créer un fichier de ressources « jndi.properties » accessible via le CLASSPATH :
//        
//        javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
//
//  ou déclarer le context dans le système :        
        System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        System.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
        System.setProperty("java.naming.provider.url", "localhost:1099");
 
		System.out.println("---- Connexion à la DataSource déclarée dans la JNDI avec bind (" + urlObjetJndiName + ") - START");
		try {
			Context contextDeTest = new InitialContext();
			DataSource dataSourceBind = (DataSource) contextDeTest.lookup(urlObjetJndiName);
			ps = dataSourceBind.getConnection().prepareStatement("SELECT COUNT(*) AS nbr FROM maTable");
			rs = ps.executeQuery();
			while( rs.next() ) {
				System.out.println("Nombre d'enregistrement en base : " + rs.getInt("nbr"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("---- Connexion à la DataSource déclarée dans la JNDI avec bind (" + urlObjetJndiName + ") - STOP");
 
 
	}
 
}

Et pour un serveur Jboss distant, changez le remote host :

System.setProperty("java.naming.provider.url", "monIpDistante:1099");

Résumé

<use-java-context> à true (par défaut)

Rajoute le "java:/" à votre ressource JNDI. "toto" => "java:/toto" La ressource est uniquement disponible depuis votre serveur J2EE.

<use-java-context> à false

Ne rajoute le "java:/" à votre ressource JNDI. "toto" => "toto" La ressource peut être appelé depuis votre serveur J2EE (via "toto" et non plus "java:/toto") et peut également être utilisée depuis un programme externe à la JVM du serveur, tel que le précédent programme le démontre.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet