lunes, 9 de julio de 2012

ADF 11g: JDBC Connection vs Data Source

Una de las dudas / problemas que surgen a la hora de desplegar aplicaciones ADF viene ligada con las conexiones a base de datos que se configuran en el Model de la aplicación.

En esta entrada voy a intentar aclarar cuál es el modo correcto para configurar las conexiones a BBDD de una aplicación ADF.

Cuando se comienza el desarrollo de una aplicación ADF con capa de negocio en base de datos. Lo primero que se hace es crear una conexión de Base de Datos desde las Application Resources.

Conexión a BBDD configurada
El siguiente paso es la creación de los ADF Business Components a partir de esa conexión a BBDD.
ADF BC generados a partir de la conexión

Como podrá observarse, también se ha generado un fichero llamado Model.jpx. Este fichero tiene, entre otras cosas, una conexión a BBDD. La conexión configurada en Model.jpx es la conexión de BBDD que utiliza la aplicación por defecto para generar los ADF Business Components. No es la utilizada por la aplicación en Runtime.

Model.jpx. Archivo donde se configura la conexión de la que se generan ADF BC

¿Entonces donde esta configurada la conexión que usará la aplicación?.
En los ApplicationModule.

El siguiente paso que se suele dar, es el de comenzar a utilizar directamente el Data Control generado en el View Controller. Por lo que el Data Control que se registra en DataBindings.cpx será algo parecido al siguiente:

DataControl usando la configuración Local por defecto del AppModule
Como se puede observar, la configuración del Data Control estará ejecutando la configuración por defecto del AppModule, en el caso del ejemplo MiEjemploAppModuleLocal que es una de las configuraciones por defecto que genera el AppModule.

Para cambiar las configuraciones de conexión a BBDD, así como el pool de conexiones inicial y demás parámetros comunes a una conexión de BBDD debemos ir al AppModule pestaña Configurations.

Configuraciones por defecto del AppModule

En esta ventana es donde se establece que configuración por defecto utilizará el Data Control asociado así como las distintas configuraciones que se quieran crear por si se quiere generar más Data Control con distinta conexión y parámetros de inicio.
En el caso del ejemplo se va a editar la configuración MiEjemploAppModuleLocal que es la que está por defecto configurada.
Editando la Configuración Local del AppModule
En las opciones se encuentran tres pestañas:
  • ApplicationModule: Aquí es donde realmente se configura la conexión a BBDD a utilizar. Ésta puede ser una conexión directa por JDBC URL o por Data Source (esta última es la recomendada).
  • Pooling and Scability: Aquí se configuran los datos típicos de inicio del pool de conexiones, timeouts etc...
  • Properties: Opciones avanzadas de la configuración del AppModule.
En la entrada de Blog nos centramos en la conexión a BBDD.
Como se puede comprobar, por defecto hay una conexión JDBC URL a la conexión de BBDD que se configuró al principio.
Es aquí donde tenemos que modificar para que en lugar de ejecutarse sobre una JDBC URL sea sobre un JDBC DataSource (que tenemos que habre creado en nuestro servidor de WebLogic y asociado al nodo manejado donde se ejecutará la aplicación).
Configuración por defecto al cambiar de JDBC URL a JDBC DataSource

Además, por cuestión de rendimiento, es conveniente eliminar el prefijo por defecto java:comp/env/... (en el ejemplo, java:comp/env/jdbc/MiConexionDS)

Modificación del nombre JNDI
Con este cambio lograremos que las aplicaciones ADF reduzcan considerablemente el tiempo que tardan en ser "Undeployed" del servidor. Por lo tanto el nombre del JNDI de WebLogic como el de la Configuración del AppModule quedaría como jdbc/MiConexionDS.

Pero esto no acaba aquí... 
Cuando empaquetamos la aplicación ADF en un EAR y se despliega en un WebLogic que no es el integrado veremos que tendremos problemas de conexión a BBDD aunque el Data Source esté generado correctamente puede que nos de un error en el que no encuentra la conexión a BBDD etc...
Esto se debe a que JDeveloper, por defecto, trae la opción de auto-generar y sincronizar el archivo weblogic-jdbc.xml al generar el EAR. 

¿Por qué ocurre esto?

Con la opción de sincronizado y auto-generado activada, la aplicación ADF va a buscar Data Sources globales generados en WebLogic. Como hemos hecho el renombrado del Data Source para ganar tiempo en cuanto a desarrollo en local tendremos problemas a la hora de desplegar en otros entornos.

Para evitar esto solamente hay que acceder a Application Properties -> Deployment.
Quitar la selección de Auto Generate and Synchronize weblogic-jdbc.xml Descriptors During Deployment.

Quitando la sincronización y autogeneración de weblogic-jdbc.xml
Referencias:

3 comentarios:

  1. Buenas tardes.
    Primero de todo tu blog es uno de los mejores que he visto y encima en español!!
    He leido esta entrada y me he acordado de que tengo un problema similar con la conexión que hago con UCM, me podrías aconsejar sobre cual es la mejor manera de crear esta conexión.
    Muchisimas gracias!!

    ResponderEliminar
    Respuestas
    1. Hola Marcos.
      Lo primero decirte que muchas gracias ;).
      Por otro lado preguntarte si puedes ser más específico con tu pregunta acerca de conectar a UCM.

      Consejos con respecto a conexión de UCM. En lugar de registrar una IP en esa conexión utilizar un DNS para el acceso a UCM. ¿Qué se gana con esto?. Que al desplegar la aplicación con la configuración ya conectada buscará un "nombre" de conexión en el fichero hosts en lugar de utilizar la IP directa, así te abstraes realmente del entorno y la IP.

      Por otro lado desde Java puedes atacar a esta conexión configurada siguiendo cualquier de las técnicas indicadas en estas 2 entradas que hice algún tiempo:

      http://danielmerchanoracle.blogspot.com.es/2011/09/integracion-webcenter-ucm-ps3-obtener.html

      http://danielmerchanoracle.blogspot.com.es/2011/10/integracion-webcenter-ucm-ps3-obtener.html

      Esos enlaces son para versiones PS3 y PS4 de WebCenter.

      En el caso de WebCenter PS5, trae consigo un nuevo wrapper que abstrae al usuario del acceso a la conexión.
      Se llama AdfConnectionFacade y permite la obtención de un cliente RIDC desde un nombre de conexión, además de permitir un test de conectividad con UCM entre otras cosas.
      Apartado 23.9.2 http://docs.oracle.com/cd/E23943_01/doc.1111/e10807/c23_ridc.html

      Espero poderte haber ayudado.

      Un saludo.

      Eliminar
  2. Al final conseguí realizar la conexión con la PS5, el problema que le veía era que al subir a otros entornos pudiese dar problemas con la ip de la máquina de UCM pero con que el nombre de la conexión de UCM se cree correctamente donde se va a desplegar todo funciona correctamente.
    Muchas gracias!!

    ResponderEliminar