java - superado - ¿Cómo busco un origen de datos JNDI desde fuera de un contenedor web?
pool de conexiones weblogic (6)
Tengo la siguiente configuración de entorno:
- Java 1.5
- Sun Application Server 8.2
- Oracle 10 XE
- Struts 2
- Hibernar
Me interesa 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 proporcionado 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 incluyen código como
Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");
Pero parece que estoy usando el nombre JNDI incorrecto, o necesito configurar un jndi.properties u otro archivo de configuración para 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 que iBatis obtenga el Datasource JNDI automáticamente: Accediendo a Datasource from Outside A Web Container (a través de JNDI)
Si está hablando de una aplicación Java genérica diaria que se ejecuta fuera del contenedor, entonces no tiene 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 dentro de 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.
Aquí hay alguna documentación de 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.
Esto puede ser un poco tarde para ti, pero he usado la biblioteca Simple-JNDI durante muchos años para 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.
Lo que quieres es un Cliente de Aplicación
Alternativamente, podría establecer una conexión JDBC simple desde su cliente independiente, que podría ser más fácil de crear, pero tendrá que configurar los detalles de conexión en el cliente y no puede reutilizar la configuración desde su servidor de aplicaciones.
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 fuentes aquí:
Ejecución de beans localmente que utilizan los orígenes de datos del servidor de aplicaciones
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 grupo de conexiones, debe crear un archivo como este:
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 al grupo a través de
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("path/to/your/connectionPool");
He usado Simple-JNDI para este propósito durante años. 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 respecto en https://github.com/h-thurow/Simple-JNDI .
Creé una fuente de datos usando Wildfly10
Nombre: MySqlDS
Nombre JNDI: java: / MySqlDS
URL de conexión: jdbc: mysql: // localhost: 3306 / testdb
Nombre de usuario: root
Contraseña:****
Ahora quiero tener acceso a esta fuente de datos en una aplicación jse
public class Test {
public static void main(String[] arg) throws NamingException{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory");
env.put(Context.PROVIDER_URL, "remote://localhost:8080");
Context ctx = new InitialContext(env);
System.out.println(ctx.lookup("java:/MySqlDS"));
}
}
Puse esta clase en mi Harddisk y me gustaría ejecutar esto, pero no sé cómo hacerlo.