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.