Utiliser la base de données d'une DataSource Jboss depuis un programme externe à Jboss en utilisant la JNDI
Par PlaceOweb le dimanche, février 7 2010, 13:15 - JAVA - Lien permanent
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.