2009-10-23 24 views
15

Me gustaría configurar un DataSource utilizando JNDI en una aplicación Java SE. ¿Cuál es la mejor manera de hacer esto?Fuente de datos JNDI fuera del contenedor

Hasta ahora, me he encontrado con 2 proyectos:

  1. Apache Naming. La página del proyecto tiene un ejemplo específico para configurar una fuente de datos, pero parece que el proyecto es muy antiguo y ya no está activo.
  2. JBossNS. Parece que es fácil configurar un JNDI solo local usando LocalOnlyContextFactory, pero no he encontrado ningún documento sobre cómo configurar realmente un origen de datos.

Si es posible, también me gustaría configurar la fuente de datos con un administrador de transacciones JTA (¿usando JOTM?).

Respuesta

10

¿Por qué está utilizando JNDI para esto? No es que sea una mala solución si tiene un proveedor, pero hay alternativas como la inyección de dependencia (IoC: a través de Spring o Guice).

El acceso a datos Spring JDBC se describe here. Lo bueno es que se puede utilizar primavera para inyectar una DataSource en su código:

<bean class="com.my.Persister"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

la fuente de datos se puede definir mediante una búsqueda JNDI:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" /> 

En un entorno de prueba, usted podría inyectar la fuente de datos directamente:

<bean id="dataSource" class="apache.db.PoolingDataSource"> 
    <!-- config goes here --> 
</bean> 
+0

Debería haber mencionado esto en la publicación. Estoy escribiendo un componente que se ejecutará en una aplicación web, pero también me gustaría poder invocarlo desde aplicaciones simples de línea de comandos Java SE y pruebas JUnit. Mi idea inicial fue que debería poder configurar el entorno necesario (JNDI, DBCP, JTA) para que el código del componente siempre pueda confiar en ellos. Soy reacio a introducir un marco completamente nuevo como Spring en la aplicación, pero podría ser una opción. ¿Hay páginas específicas de documentación de Spring relacionadas con esto que recomendaría? – nikita

+0

He editado la respuesta para proporcionar un enlace y algunas indicaciones de qué hacer. Spring JDBC es muy poderoso –

+0

Gracias por los detalles. No tengo suficientes puntos para marcar la respuesta como útil: | – nikita

3

Un muy fácil de usar solución para JNDI independiente es simple-jndi. Funciona como un hechizo siempre que solo lo necesite dentro de una sola JVM, ya que es una biblioteca sin servidor de red.

1

La versión Simple-JNDI, referenciada por klenkes74, ya no está en desarrollo activo. Debido a que encontré algunos problemas, lo bifurqué, realicé algunas correcciones de errores e implementé algunas características nuevas. Ya utilicé la versión anterior no solo para probarla sino también en producción, porque prefiero un patrón de Localizador de Servicio sobre Inyección de Dependencia, aunque este último es más moderno hoy en día.

Puede usar fácilmente Simple-JNDI para definir un DataSource o un conjunto de conexiones declarativamente y obtenerlo enlazado a un contexto JNDI.

Definir un jndi.archivo de propiedades en la ruta de clases:

java.naming.factory.initial=org.osjava.sj.SimpleContextFactory 
org.osjava.sj.root=[absolute_or_relative_path_to_a_property_file] 

El archivo de propiedades se parece a:

type=javax.sql.DataSource 
driver=org.gjt.mm.mysql.Driver 
url=jdbc:mysql://localhost/testdb 
user=testuser 
password=testing 

Ahora puede acceder a su origen de datos desde dentro de su código de esta manera:

InitialContext ctxt = new InitialContext(); 
    DataSource ds = (DataSource) ctxt.lookup("name_of_your_datasource"); 

Para obtener más información, véase https://github.com/h-thurow/Simple-JNDI

Cuestiones relacionadas