2010-03-26 13 views
17

Tengo el siguiente entorno de configurar:¿Cómo busco un origen de datos JNDI desde fuera de un contenedor web?

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

me interesa para saber cómo puedo escribir código para un cliente Java (es decir, fuera de una aplicación web) que pueda hacer referencia al origen de datos JNDI p rovided por el servidor de aplicaciones.

Los puertos para Sun Application Server están todos en sus valores predeterminados. Hay una fuente de datos JNDI llamada jdbc/xxxx en la configuración del servidor, pero noté que la configuración de Hibernate para la aplicación web usa el nombre java: comp/env/jdbc/xxxx en su lugar.

La mayoría de los ejemplos que he visto hasta ahora implican código como

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

pero parece que estoy usando ya sea el nombre JNDI mal, o que necesito para configurar un jndi.properties u otro archivo de configuración apuntar correctamente a un oyente? Tengo appserv-rt.jar del servidor de aplicaciones de Sun que tiene un jndi.properties dentro de él, pero no parece ayudar.

Hay una pregunta similar aquí, pero no da ningún código/se refiere a tener iBatis obtener el JNDI del origen de datos de forma automática: Accessing Datasource from Outside A Web Container (through JNDI)

Respuesta

16

Me quedé atrapado en este mismo problema. Escribí un pequeño tutorial. Básicamente, debe crear su propia implementación de los objetos de DataSource y agregarlos a su propio contexto inicial personalizado.Hay ejemplos de código aquí:

Running Beans Locally that use Application Server Data Sources

+0

La publicación del blog fue extremadamente útil. ¡Gracias! –

1

Si estamos hablando algunos fuera de cada aplicación Java genérica día corriendo del contenedor , entonces no tienes suerte. Efectivamente, necesitaría configurar su propia implementación de JNDI, con su propio grupo de conexiones de configuración, etc.

Sin embargo, puede escribir aplicaciones "autónomas" de Java EE. Estas son aplicaciones que se ejecutan dentro del cliente de la aplicación Java EE. Básicamente, es una aplicación que se implementa y se empaqueta, pero luego se ejecuta utilizando un iniciador proporcionado por su contenedor Java EE.

Cuando se ejecuta en un entorno de cliente de aplicación, todos los recursos del servidor de aplicaciones (grupos de conexiones, EJB, colas, etc.) están disponibles para su aplicación como lo harían si el código se implementara en el servidor de la aplicación .

Here es una documentación tutorial para Sun App Server 8.2, que es un contenedor J2EE 1.4.

Si es posible, recomiendo actualizar a Glassfish v2.1, solo un servidor más moderno y mejor que implemente sus aplicaciones, ya que es un descendiente de 8.2.

+0

Gracias por la idea de escribir una aplicación JEE independiente. Es una alternativa interesante, pero esperaba la posibilidad de usar el servidor de aplicaciones como un proveedor directo de JNDI para obtener el origen de datos remoto directamente. La elección de Sun App Server 8.2 se debe lamentablemente a razones heredadas, por lo que no podemos cambiar a Glassfish, que definitivamente sería mejor. – masotime

0

Lo que queremos es un Application Client

alternativa usted puede establecer una conexión JDBC normal de su cliente autónomo que podría ser más fácil de crear - pero usted tendrá que configurar los detalles de la conexión en el cliente y no se puede volver a utilizar la configuración de su servidor de aplicaciones.

+0

Hola, gracias por la respuesta. El cliente de la aplicación es interesante, pero es demasiado pesado para mis necesidades. La intención era reutilizar la conexión definida en el servidor web para mantener la consistencia como un único punto para obtener una conexión a la base de datos. – masotime

0

Esto podría ser un poco tarde para ti, pero me han utilizado el Simple-JNDI library durante muchos años con el propósito exacto que mencionas. No estoy seguro si tiene todas las opciones que pueda necesitar pero fue suficiente para mis utilidades de línea de comandos.

1

Pruebe Simple-JNDI. Le proporciona una implementación en memoria de un servicio JNDI y le permite poblar el entorno JNDI con objetos definidos en archivos de propiedades. También se admite la carga de fuentes de datos o grupos de conexiones configurados en un archivo.

Para obtener un conjunto de conexiones que tiene que crear un archivo de la siguiente manera:

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

En su aplicación puede acceder a la piscina a través de

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

Me haved solía simple-JNDI para este fin por años ahora. Pero ya no está en desarrollo activo. Debido a que encontré algunos problemas relacionados con los contextos compartidos (especialmente el uso de fuentes de datos), decidí ramificar el proyecto original y agregar algunas características nuevas. Ahora hay un 0.13.0. Puede encontrar más información al https://github.com/h-thurow/Simple-JNDI.

Cuestiones relacionadas