web-dev-qa-db-fra.com

Comment rechercher une source de données JNDI hors d'un conteneur Web?

J'ai l'environnement suivant mis en place:

  • Java 1.5
  • Sun Application Server 8.2
  • Oracle 10 XE
  • Struts 2
  • Hibernate

J'aimerais savoir comment écrire du code pour un client Java (c'est-à-dire en dehors d'une application Web) pouvant faire référence à la source de données JNDI fournie par le serveur d'applications.

Les ports de Sun Application Server sont tous à leurs valeurs par défaut. Il existe une source de données JNDI nommée jdbc/xxxx dans la configuration du serveur, mais j'ai remarqué que la configuration Hibernate pour l'application Web utilise plutôt le nom Java: comp/env/jdbc/xxxx.

La plupart des exemples que j'ai vus jusqu'à présent impliquent un code comme

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

Mais il semble que j'utilise le mauvais nom JNDI ou que je dois configurer un fichier jndi.properties ou un autre fichier de configuration pour qu'il pointe correctement vers un écouteur? J'ai appserv-rt.jar de Sun Application Server qui contient un fichier jndi.properties, mais cela ne semble pas aider.

Il y a une question similaire ici, mais elle ne donne aucun code/fait référence à l'obtention par iBatis de la source de données JNDI automatiquement: Accès à la source de données depuis un conteneur Web extérieur (via JNDI)

18
masotime

Je suis resté coincé sur ce même problème. J'ai écrit un petit tutoriel. En gros, vous devez créer votre propre implémentation des objets DataSource et les ajouter à votre propre contexte initial personnalisé. Il y a des exemples de sources ici:

Exécution locale de beans utilisant des sources de données du serveur d'applications

17
djsumdog

Essayez Simple-JNDI. Il vous donne une implémentation en mémoire d'un service JNDI et vous permet de renseigner l'environnement JNDI avec des objets définis dans des fichiers de propriétés. Il est également possible de charger des sources de données ou des pools de connexions configurés dans un fichier.

Pour obtenir un pool de connexion, vous devez créer un fichier comme celui-ci:

type=javax.sql.DataSource
driver=com.sybase.jdbc3.jdbc.SybDriver
pool=myDataSource
url=jdbc:sybase:Tds:servername:5000
user=user
password=password

Dans votre application, vous pouvez accéder à la piscine via

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("path/to/your/connectionPool");

J'ai utilisé Simple-JNDI à cet effet depuis des années. Mais ce n'est plus en développement actif. Ayant rencontré quelques problèmes concernant les contextes partagés (en particulier l'utilisation de sources de données), j'ai décidé de créer une branche pour le projet d'origine et d'ajouter de nouvelles fonctionnalités. Maintenant, il y a un 0.13.0. Vous pouvez trouver plus d'informations à ce sujet sur https://github.com/h-thurow/Simple-JNDI .

2
Holger Thurow

Si vous parlez d'une application Java générique exécutée tous les jours en dehors du conteneur, vous n'avez pas de chance. Effectivement, vous devrez configurer votre propre implémentation JNDI, avec son propre pool de connexions à configurer, etc.

Cependant, vous pouvez écrire des applications "autonomes" Java EE. Ce sont des applications qui s'exécutent dans le client d'application Java EE. En gros, il s'agit d'une application déployée et packagée, mais exécutée à l'aide d'un programme de lancement fourni par votre conteneur Java EE.

Lors de l'exécution dans un environnement client d'application, toutes les ressources du serveur d'applications (pools de connexions, EJB, files d'attente, etc.) sont disponibles pour votre application, exactement comme si le code était déployé sur le serveur d'applications.

Ici est une documentation de tutoriel pour Sun App Server 8.2, qui est un conteneur J2EE 1.4.

S'il est possible, je suggérerais fortement de mettre à niveau vers Glassfish v2.1, juste un serveur plus moderne, plus performant, qui devrait déployer vos applications tel quel, car il s'agit d'un descendant de la 8.2.

1
Will Hartung

C’est peut-être un peu tard pour vous mais j’utilise la bibliothèque Simple-JNDI depuis de nombreuses années dans le but précis que vous avez mentionné. Je ne sais pas s'il contient toutes les options dont vous pourriez avoir besoin, mais cela suffisait pour mes utilitaires de ligne de commande. 

0
runningboffin

Ce que vous voulez, c'est un Client d'application

Vous pouvez également établir une connexion JDBC simple à partir de votre client autonome, ce qui peut être plus facile à créer. Vous devez toutefois configurer les détails de la connexion dans le client et ne pas pouvoir réutiliser les paramètres de votre serveur d'applications.

0
pitpod