Mostrando entradas con la etiqueta derby. Mostrar todas las entradas
Mostrando entradas con la etiqueta derby. Mostrar todas las entradas

miércoles, 14 de septiembre de 2011

Aplicacion web en medio de solo/lectura (CD) con Jetty y Derby. Parte 2: Implementación

Sin más preámbulos más que la referencia a la primera parte de este post que fue la motivación vamos directamente a la implementación.

Aquí esta lo que necesitaremos y utilizaremos:
  • Java JDK instalado (versión utilizada 1.6) con su respectiva versión de JRE (máquina virtual)
  • Jetty (versión utilizada 6.1.22).
  • Proyecto web Java construido (Puede ser el war, pero nosotros utilizaremos el proyecto con los fuentes compilados, como el que genera NetBeans en el directorio build/web del proyecto para este ejemplo)
  • Derby (versión utilizada 10.5.3.0)
Pasos a seguir:
  • Paso 1: Tener instalado y funcionando el Java JDK.
  • Paso 2: Configurar Jetty para su uso en medio de sólo lectura
  • Paso 3: Preparar proyecto web Java: configuración para uso de base de datos embebido con Derby.
  • Paso 4: Preparar Base de Datos con Derby 
  • Paso 5: Como almacenar.
  • Paso 6: Como ejecutar.


Paso 1: Tener instalado y funcionando el Java JDK.

Este paso me imagino todos los javeros ya deben tenerlo cumplido, y los que no, deben hacerlo. Hago énfasis porque es importante que estén incluidas las variables de entorno en el path del sistema para evitar cualquier conflicto de ejecución tanto en Windows como en Linux. Esto es que además de tener instalada la máquina virtual, asegurarse de tener variables como JAVA_HOME definidas en el sistema, tanto en Linux como en Windows.

Paso 2: Configurar Jetty para su uso en medio de sólo lectura

Hay que descargar el archivo con el servidor embebido Jetty desde aqui y descomprimir. En la estructura e directorios buscamos el archivo JETTY/etc/jetty.xml, donde  JETTY es el directorio raíz donde esta desempaquetada la aplicación,  y nos vamos a la parte del log y comentamos de la siguiente manera:
<!--==================================== -->
<!-- Configure the Request Log-->
<!--==================================== -->
<!--
<Set name="RequestLog">
[snip]
</Set>
-->


Así comentamos la parte que activa el log de Jetty para que no intente guardar el log en nuestro medio de solo lectura, como lo es un CD.


Paso 3: Preparar proyecto web Java: configuración para uso de base de datos embebido con Derby 


Esto puede ser cualquier proyecto web hecho en cualquier IDE, en mi caso tomé un proyecto hecho en NetBeans y compilado con ant al cual llamaremos PROYECTONETBEANS (ruta que contiene la estructura del proyecto web java en Netbeans, con directorios como build, dist, lib, src, web, etc. ). Por lo tanto aquí supondremos que esta debidamente creado el proyecto y con las librerías necesarias (Incluyendo el jar del driver jdbc para usar Derby)

Yo utilicé el framework Hibernate para utilizar mi base de datos con un manejador Derby, pero se puede hacer con o sin Hibernate y usar la clase JDBC de manera directa para poblar la base de datos con Derby en nuestro programa e incluso utilizar cualquier otro cliente para manipular la base de datos fuera de nuestro programa.

Ahora lo que hay que hacer para utilizar nuestra base de datos de manera embebida en el medio de sólo lectura es cambiar la manera en como se carga el driver del jdbc (Controlador para Java de la base de datos). Esto lo hacemos donde definimos el driver esto es:
  • Si estas usando Hibernate como en mi caso hay que modificar el archivo de configuración "hibernate.cfg.xml". Yo tenía esta configuración en mi archivo al usarlo de manera local:
<property name="hibernate.connection.driver_class" >org.apache.derby.jdbc.EmbeddedDriver</property>
<property name="hibernate.dialect" >org.hibernate.dialect.DerbyDialect </property>
<property name="hibernate.connection.url" >jdbc:derby:directory:derbytestbd;create=true;territory=es_MX;collation=TERRITORY_BASED </property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>

Cambié el valor de la propiedad "hibernate.connection.url" por: "jdbc:derby:classpath:/derbytestbd;territory=es_MX;collation=TERRITORY_BASED" . Con esto queda configurado el sistema para usar la base de datos embebida con Derby en el medio de solo lectura.
  • En caso de que estés utilizando el driver JDBC directamente desde alguna clase lo único que tienes que hacer es cambiar el texto del Driver de Derby. Esto sería cambiar la línea 1 a la línea 2: 
Linea 1:
Connection conn = DriverManager.getConnection("jdbc:derby:directory:derbytestbd;create=true;territory=es_MX;collation=TERRITORY_BASED","root","");


Linea 2:
Connection conn = DriverManager.getConnection("jdbc:derby:classpath:/derbytestbd;territory=es_MX;collation=TERRITORY_BASED","root","");



Se puede observar como en ambos casos utilicé un usuario "root"  sin contraseña (vacío).

Una  vez hecho esto simplemente copiamos el directorio donde esta nuestro proyecto al directorio de Jetty. Esto sería copiar el directorio con los archivos compilados del proyecto web, en mi caso copiar el contenido de PROJECTONETBEANS/build/web a un JETTY_HOME/webapp/miproyecto , estamos pasando todos los jsp's y directorios WEB-INF y META-INF que son necesarios para que nuestra aplicación web funcionara en un contenedor tomcat por ejemplo.

Paso 4: Preparar Base de Datos con Derby

Debemos preparar la base de datos para que funcione en el medio de solo lectura.

Para empezar a manipular la base de datos es importante que  hayamos finalizado cualquier cliente que pudiera estar conectado y haciendo uso de nuestra base de datos.

Nuestra base de datos se llama "derbytestbd" entonces este es el nombre del directorio que contiene nuestra base de datos derby en la ubicación que lo hayamos creado. Dentro de este directorio antes de copiarlo debemos borrar el archivo directorio derbytestbd/tmp (sólo el tmp), el cual puede o puede no existir, así que no se preocupen si no existe.

Una vez hecho esto nos disponemos a crear el jar con los archivos de la base de datos. La mejor manera es utilizando el comando jar de la siguiente manera:

$ jar cMf derbytestbd.jar derbytestbd

Para más información de como crear un jar con tu base de datos Derby checar el Tema de la documentación de Derby "Transferring read-only databases to archive (jar or zip) files"

Donde derbytestbd es el directorio donde esta nuestra base de datos Derby y derbytestbd.jar es el nombre del nuevo archivo jar que se creará con nuestra base de datos para el medio de solo lectura.

Continuamos copiando nuestro nuevo archivo jar "derbytestbd.jar" en donde tenemos nuestro proyecto preparado para el medio de sólo lectura, es decir donde esta nuestra aplicación Jetty. Entonces copiamos derbytestbd.jar a JETTY_HOME/webbapp/miproyecto/WEB-INF/lib y así el jar de nuestra base de datos quede ligado al classpath de nuestra aplicación.

Paso 5: Como almacenar.

¡Listo! ya tenemos nuestro proyecto preparado para utilizarlo en un medio de sólo lectura. Para almacenarlo solo es necesario copiar el directorio completo JETTY_HOME al medio de almacenaje que deseemos. En este tutorial se indica que sea en un CD, pero se puede copiar a una memoria USB, disco portátil, etc. Así que tal cual se oye, técnica "copy&paste" y ¡ya!.


Paso 6: Como ejecutar.

Para ejecutar unicamente es necesario correr el servidor Jetty utilizando el archivo jar JETTY_HOME/start.jar ejecutandolo de la siguiente manera:

$ java -jar start.jar

Para más información de como ejecutar o utilizar el servidor Jetty acceder a la página oficial del proyecto aquí.

De esta manera iniciamos el servidor Jetty en la computadora donde estemos. Ahora es necesario acceder a nuestro proyecto, lo cual lo haremos a través de un navegador web ingresando a la siguiente url (Con las opciones por default de Jetty): "localhost:8443/miproyecto"

Si todo sale bien estarás viendo tu proyecto corriendo desde un medio de sólo lectura de manera embebida en un servidor Jetty :D


Notas finales

Algunas consideraciones que pueden ayudar en caso de algún error:
  •  El tutorial del que tomé la mayoría de las cosas les puede ser útil también y lo encuentran aquí.
  • Es importante que los jar's necesarios para la aplicación estén incluidos en el directorio miproyecto/WEB-INF/lib , si algún problema con alguna dependencia esta fallando, revisar eso o el CLASSPATH para corregir problemas con dependencias.
  • Cualquier comentario extra o duda pueden externarla, espero con gusto poder ayudar.

    miércoles, 10 de marzo de 2010

    Aplicacion web en CD con jetty y derby. Parte 1: Motivación

    Esa ocasión mis amig@s javer@s hablaremos de lo que  se puede considerar un ejemplo de la vida real de las herramientas embebidas para aplicaciones java. Específicamente hablaremos de la creación de un CD con una aplicación Web java que se ejecute de manera completamente autónoma (una aplicación de escritorio es algo un poco mas fácil de lograr, sin embargo esta vez sortearemos el reto de utilizar un servidor de paginas web dinámicas para una aplicación web de java en un ambiente monousuario).

    En esta primera parte hablaremos únicamente de la motivación y la mención de las herramientas de las que echaremos mano para lograrlo, dejando para una segunda parte (seguramente muy interesante) un ejemplo de la implementación mas detallado para que puedas probarlo por tu cuenta.

    La motivación de llevar a cabo este ejercicio es el buscar la posibilidad de reutilizar nuestros sistemas hechos para un contenedor Web, ya sea Tomcat, Glassfish, etc. El mayor problema de portabilidad de estos sistemas es que forzosamente necesitan dicho contenedor instalado en el sistema para poderse ejecutar. Entonces es un  paso un tanto tedioso si lo que queremos es que nuestro sistema lo pueda utilizar un usuario final en la comodidad de su computadora, sin importar si hay conexión a internet o que tenga los servicios de base de datos o servidor web instalados en su sistema local.

    Como comentaba anteriormente, la manera más fácil de llevar a cabo esto es utilizar una aplicación de escritorio. En la actualidad, con java, además de swing tenemos herramientas como JavaFX (de las que después hablaremos seguramente) que sumamente nos facilitan la implementación de sistemas de escritorio. Pero la idea es la reutilización, y si ya tenemos un sistema Web que facilita la vida para usuarios que acceden a él por medio de la red, porque no otorgar esta posibilidad a usuarios que lo quieran utilizar de manera local.

    Es aquí donde entra Jetty, que como en un post anterior lo mencionamos, es un contenedor para aplicaciones web de Java. Lo singular de ésta aplicación es la facilidad para poder integrar una aplicación web cualquiera, aún utilizando diversos frameworks (yo hasta el momento lo he utilizado con Hibernate, Struts2 y Spring sin ningún problema). Con unas simples configuraciones queda completamente funcionar como aplicación de solo lectura, y así también las aplicaciones que éste contiene.

    Después de haber sorteado este problema nos enfrentamos a un nuevo reto, lograr utilizar un manejador de base de datos para nuestra aplicación, sin tener que instalar uno forzosamente. Es aquí donde entra Derby, que como también anteriormente habíamos mencionado, es un manejador de base de datos hecho en Java y que puede trabajar de manera embebida. Inicialmente había elegido HSQL, sin embargo la característica de que sea un manejador que trabaja en memoria, en el momento que lo implementé aparecieron mas contras que pros de su utilización, así que decidí utilizar Derby, sin embargo tu eres libre de utilizar el manejador que mejor te plazca.

    Obviamente si nuestra intención es crear un sistema que corra en CD, la base de datos solo tendrá atribuciones de lectura, no podremos escribir en ella. Derby permite ser utilizado como base de datos de solo lectura, incluso por su integración con java, es posible agregar nuestra base de datos a un jar agregadolo simplemente al classpath.

    Para concluir esta primera parte del post, quisiera agregar que estas herramientas es posible utilizarlas en conjunto para una aplicación potable. Sin embargo, es necesario aplicar ciertas configuraciones para que funcionen como solo lectura y además requieren un directorio temporal en el sistema local para su disposicion tanto Jetty como Derby (Esto es algo chafa, pero si queremos utilizarlo de la manera fácil es necesario que se usen directorios temporales), y si a esto le agregamos algún lanzador automatico para correr la aplicación en un navegador una vez iniciados los servicios, ¡listo! tenemos nuestra aplicación portable, que fácil ¿no?.

    Este post continuará con el ejemplo práctico, dentro de poco. Recuerda, cualquier comentario es bienvenido... cambio y fuera...

    pazzzzzzz
    Aquí puedes ver la continuación de esta entrada 

    viernes, 22 de enero de 2010

    Iniciandose en Derby: Java DB

    Derby es un subproyecto de Apache DB. Se trata de un manejador de base de datos de código abierto hecho completamente en java. Derby tiene varias características que lo hacen sumamente atractivo para soluciones en sistemas ligeros. Entre otras me gustaría mencionar las que a mi me llamaron la atención: es fácil de instalar, ligero (pesa tan solo unos cuantos megabytes) y puede usarse de manera embebida (palabra que si existe en español, ver aquí), es decir, que dentro de una aplicación java, podemos iniciar y utlizar bases de datos de Derby dentro de la misma máquina virtua.


    Bueno, después de esta pequeña reseña que podemos encontrar fácilmente en cualquier sitio que hable de Derby, vamos a lo importante, como lo usamos dentro de nuestras aplicaciones.

    Básicamente lo que haré a continuación será parafrasear un poco los ejemplos de la guía rápida básica de Derby que podemos encontrar en el tutorial oficial.

    Primero que nada necesitamos descargar Derby por supuesto, lo cual se puede hacer aquí. Una vez descargado descomprimimos el directorio que esta ahí contenido, ejemplo 'db-derby-alguna_version-bin'. A la ubicación de este directorio lo llamaremos de ahora en adelante: DERBY_HOME.

    Comenzaremos con el ejemplo de el uso de Derby embebido dentro de tu aplicación java, lo hago debido a que esta es una de las características que mas llaman la atención de este manejador. Se supone que ya tenemos instalado y debidamente configurado un jdk en nuestro equipo.

    Lo haremos a través de la linea de comandos (unix y windows) para hacer mas sencillo de explicar el procedimiento.

    Primero creamos un directorio que llamaremos "DERBYTUTOR" y entramos en él. Ahí introduciremos los sguientes comandos, no se te olvide el punto que va al final (.):
    Unix:
    cp $DERBY_HOME/demo/programs/workingwithderby/* .
    
    export CLASSPATH=$DERBY_HOME/lib/derby.jar:.

     Windows:
    copy %DERBY_HOME%\demo\programs\workingwithderby\* .
    
    set CLASSPATH=%DERBY_HOME%\lib\derby.jar;.

    Ahora en el directorio DERBYTUTOR en donde nos encontramos deben existir varios archivos java. Después de confirmar que los archivos WwdEmbedded.java y WwdUtils.java existan e introducir el siguiente comando para compilar ambos archivos:

    Unix y Windows:
    javac WwdEmbedded.java WwdUtils.java
    Si en este punto ocurre algún error probablemente es porque no se tiene bien configurado el jdk en nuestro sistema o que al definir el classpath algo no se hizo correctamente.

    Si todo salió bien no deberá aparecer nada al ejecutarse la linea anterior y los archivos se habrán compilado satisfactoriamente, creando los archivos WwdEmbedded.class y WwdUtils.class.

    A continuación ejecutamos el ejemplo con el siguiente comando y sucederá algo como lo que sigue:

    java WwdEmbedded 
    org.apache.derby.jdbc.EmbeddedDriver loaded.
    Connected to database jdbcDemoDB
     . . . . creating table WISH_LIST
    Enter wish-list item (enter exit to end):
    a peppermint stick
      __________________________________________________________
    On 2009-05-08 13:12:09.058 I wished for a peppermint stick
      __________________________________________________________
    Enter wish-list item (enter exit to end):
    a long vacation
      __________________________________________________________
    On 2009-05-08 13:12:09.058 I wished for a peppermint stick
    On 2009-05-08 13:12:21.28 I wished for a long vacation
      __________________________________________________________
    Enter wish-list item (enter exit to end):
    exit
    Closed connection
    Database shut down normally
    Getting Started With Derby JDBC program ending.

    ¿Que sucede aquí? Estamos accediendo una base de datos Derby embebida he insertando datos en una tabla. Asi es, sin un servidor Derby activo, simplemente con la aplicación actual.

    En el enlace del ejemplo podrás obtener más detalles, lo único que me gustaría comentar aquí es como se logra la conexión en la clase WwdEmbedded a través de que detalles.

    Lo único que cambia, con respecto al uso de cualquier JDBC es que utiliza los siguientes parametros:
       // define driver a usar (el contenido en la libreria derby.jar)
          String driver = "org.apache.derby.jdbc.EmbeddedDriver";
       // nombre de la base de datos 
          String dbName="jdbcDemoDB";
       // URL que Derby usara
          String connectionURL = "jdbc:derby:" + dbName + ";create=true";

    Y con esto simplemente creamos la conexión de manera normal:

    String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    ...
    try {
        Class.forName(driver); 
    } catch(java.lang.ClassNotFoundException e) {
      ...
    }
    String connectionURL = "jdbc:derby:" + dbName + ";create=true";
    ...
    try {
        conn = DriverManager.getConnection(connectionURL);
        ...  
    }  catch (Throwable e)  {   
       ...
    }

     Aquí concluiría este blog, cualquier otra duda te invito a checar la documentación de los ejemplos, es bastante clara (Aunque en inlgés) y para fines prácticos yo la veo bastante útil.

    Puedes ver el sitio oficial de Derby aqui.