2010-03-26 11 views
17

Je l'environnement mis en place suivant:Comment puis-je rechercher une source de données JNDI à l'extérieur d'un conteneur Web?

  • Java 1.5
  • Sun Application Server 8.2
  • Oracle XE 10
  • Struts 2
  • Mise en veille prolongée

Je suis intéressé savoir comment je peux écrire du code pour un client Java (c'est-à-dire en dehors d'une application web) qui peut référencer la source de données JNDI p fourni par le serveur d'application.

Les ports de Sun Application Server ont tous leurs valeurs par défaut. Il y a 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 je l'ai vu à ce jour concernent le code comme

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

Mais il semble que je suis soit en utilisant le mauvais nom JNDI, ou je dois configurer un jndi.properties ou tout autre fichier de configuration pour pointer correctement vers un auditeur? J'ai appserv-rt.jar de Sun Application Server qui a jndi.properties à l'intérieur, mais cela ne semble pas aider.

Il y a une question similaire ici, mais il ne donne pas de code/fait référence à avoir iBatis obtenir le Datasource JNDI automatiquement: Accessing Datasource from Outside A Web Container (through JNDI)

Répondre

16

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

Running Beans Locally that use Application Server Data Sources

+0

L'article de blog était extrêmement utile. Merci! –

1

Si vous parlez un peu tous les jours application Java générique en cours d'exécution à l'extérieur du conteneur , alors vous n'avez pas de chance. Effectivement, vous devrez configurer votre propre implémentation JNDI, avec son propre pool de connexions configure, etc.

Cependant, vous pouvez écrire des applications Java EE "autonomes". Ce sont des applications qui s'exécutent dans le client d'application Java EE. Fondamentalement, c'est une application qui est déployée et empaquetée, mais ensuite exécutée en utilisant un lanceur 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, comme si le code était déployé dans le serveur d'applications .

Here est une documentation didactique pour Sun App Server 8.2, qui est un conteneur J2EE 1.4. Si cela est possible, je vous suggère fortement de mettre à niveau vers Glassfish v2.1, juste un serveur plus moderne et meilleur qui devrait déployer vos applications comme il est, puisqu'il est un descendant de 8.2.

+0

Merci pour l'idée d'écrire une application JEE autonome. C'est une alternative intéressante, mais j'espérais la possibilité d'utiliser le serveur de l'application en tant que fournisseur JNDI direct pour obtenir directement la source de données distante. Le choix de Sun App Server 8.2 est malheureusement dû à des raisons historiques, nous ne pouvons donc pas passer à Glassfish, ce qui serait certainement mieux. – masotime

0

Ce que vous voulez est un Application Client

Sinon, vous pouvez établir une connexion JDBC à partir de votre client autonome qui pourrait être plus facile de créer - mais vous devrez configurer les détails de connexion du client et ne peut pas réutiliser les paramètres de votre serveur d'applications.

+0

Salut, merci pour la réponse. Le client d'application est intéressant, mais il est un peu trop lourd pour mes besoins. L'intention était de réutiliser la connexion définie dans le serveur Web pour maintenir la cohérence en tant que point unique pour obtenir une connexion à la base de données. – masotime

0

Cela pourrait être un peu en retard pour vous, mais j'ai utilisé le Simple-JNDI library depuis de nombreuses années dans le but exact que vous mentionnez. Je ne suis pas sûr si elle a toutes les options dont vous avez besoin, mais cela suffisait pour mes utilitaires en ligne de commande.

1

Essayez Simple-JNDI. Il vous donne une implémentation en mémoire d'un service JNDI et vous permet de remplir l'environnement JNDI avec des objets définis dans les 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"); 

Je haved utilisé simple-JNDI à cet effet depuis des années maintenant. Mais ce n'est plus sous développement actif. Parce que j'ai trouvé quelques problèmes concernant les contextes partagés (en particulier en utilisant des sources de données), j'ai décidé de brancher le projet original et d'ajouter de nouvelles fonctionnalités. Maintenant, il y a un 0.13.0. Vous pouvez trouver plus à ce sujet au https://github.com/h-thurow/Simple-JNDI.