Desplegar una aplicación Grails en Glassfish (con Oracle 10g e Ingres)
Una se pone a buscar información sobre como desplegar una aplicación grails que usa oracle 10g en glassfish y no encuentra casi nada, y mucho menos si hablamos de algo referente a Ingres. Así que después de pegarme con esto unos días y con un resultado satisfactorio voy a aportar mi granito de arena con este post.
Una vez desarrollada mi aplicación en Grails (que pronto saldrá a la luz), la tengo que desplegar en Glassfish v2.1. Pronto empiezan a aparecer los primeros problemas, que explicaré junto con algunas particularidades de mi aplicación:
- Mis tablas están en una base de datos de Oracle 10g y en un esquema determinado.
- Además, mi aplicación depende de otras tablas de esa misma base de datos pero que están en otro esquema. A la información de estas tablas accedo a través de un Api, cuyo dataSource será el mismo que el de mi aplicación.
- Pero hay más: mi aplicación depende de otra tabla, de una base de datos de Ingres, a la cual también accedo a través de otro Api con un dataSource distinto (evidentemente).
- Para solucionar todo esto, tiro de Spring y del fichero “resources.xml” de la siguiente manera:
- Para el problema del Api que usa el mismo dataSource que mi aplicación sólo tengo que importar su “applicationContext.xml”
<beans>
<import resource="classpath:applicationContext.xml" />
</beans>
- Para el problema del Api que usa un dataSource distinto al de mi aplicación sólo tengo que definir un nuevo dataSource, pasándole los datos de la conexión a la base de datos y un bean de la clase que gestiona el Api. A este último le paso el dataSource:
<beans>
<bean id="dataSourceIngres" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.ingres.jdbc.IngresDriver" />
<property name="url" value="jdbc:ingres://url/bbdd;cursor_mode=readonly" />
<property name="username" value="username" />
<property name="password" value="******" />
</bean>
<bean id="nameBean" class="beanClass" factory-method="getInstance">
<property name="dataSource"><ref local="dataSourceIngres"/></property>
</bean>
</beans>
- Todo esto, como ya he dicho, dentro de “myApp/grails-app/conf/spring/resources.xml“. Una vez hecho esto, podemos acceder a la información de todas las tablas sin ningún problema.
- Cambio de tercio: La versión con la que empecé a desarrollar mi aplicación fue la 1.1.1 (stable release) y el plugin grails-ui 1.1-SNAPSHOT, este último porque uso gui-dataTables en mis listados. Con esta versión del plugin tenía problemas en la ordenación de las columnas de forma que cuando salió la release 1.1 me actualicé para comprobar que estos problemas estaban resueltos, pero a su vez me obligaba a actualizarme a la versión de grails 1.2-M2. Como mis problemas se resolvieron y todo iba bien, así se quedó la cosa. Salieron nuevas “milestones” pero no iba a estar cambiando la versión de grails constantemente sin necesitarlo.
- El gran problema llega a la hora de desplegar la aplicación. El GRAN PROBLEMA realmente son dos:
- Por un lado, definiendo el datasource en producción utilizando jndiName = “jdbc/myDatasource”, no accedía la base de datos.
- Por otro lado, aunque definiese el datasource en producción pasándole los datos de la conexión (que así si accedía a base de datos) Glassfish se quedaba colgado continuamente, no se podían desplegar otras aplicaciones, no se podía hacer “undeploy”….
- Después de probar varias cosas e ir de un lado para otro decidimos volver a la versión 1.1.2 que es la última estable y el GRAN PROBLEMA se resolvió. También probé con la última versión “milestone” de grails, la 1.2-M4 y tampoco hay ningún problema, pero prefiero dejar mi aplicación en producción con una versión estable ya que todo funciona a la perfección.
Conclusión: hemos dado muchas vueltas, cuando, en definitiva, la solución era una tontería. Elegimos el camino equivocado pensando en que el problema estaba en la definición de los datasources y en Oracle, en parte porque hemos encontrado poca información al respecto. Por eso, insisto, escribo esta laaaaaarga entrada en mi blog, para que a alguien le pueda servir, al menos, para ahorrarse un poquito de tiempo.

facilísimo
