2010-09-07 11 views
10

No quiero usarlo en modo incrustado ya que también puedo permitir que otras aplicaciones externas accedan a él. Y quiero ejecutar el inicio del servidor al mismo tiempo que Tomcat carga mi aplicación (o simplemente cuando se ejecuta Tomcat para el caso). Esto es así para que no tenga que pedirle a los clientes que ejecuten hsqldb manualmente con un comando o script antes de que puedan poner mi guerra en tomcat y ejecutarlo (para mantener las cosas simples).¿Cómo puedo iniciar y seguir ejecutando hsqldb en modo servidor desde mi aplicación web?

Puedo llamar al Server desde main enviando comandos desde Java, pero esto me dará un hilo interminable, no estoy seguro de cómo lidiar con eso. ¿Hay alguna forma más fácil de hacer esto?

Respuesta

9

De acuerdo con la documentación HSQLDB es posible iniciar la base de datos de código Java: http://hsqldb.org/doc/2.0/guide/listeners-chapt.html#listeners_appstart-sect. De modo que puede usar un servlet para cargar la base de datos cuando se inicia la aplicación web. Los pasos deben ser los siguientes:

  1. Crear un servlet "InitDatabase" y poner el código para iniciar la base de datos en el método init()

    @Override 
    public void init() throws ServletException { 
        super.init(); 
        try { 
         System.out.println("Starting Database"); 
         HsqlProperties p = new HsqlProperties(); 
         p.setProperty("server.database.0", "file:/opt/db/crm"); 
         p.setProperty("server.dbname.0", "mydb"); 
         p.setProperty("server.port", "9001"); 
         Server server = new Server(); 
         server.setProperties(p); 
         server.setLogWriter(null); // can use custom writer 
         server.setErrWriter(null); // can use custom writer 
         server.start(); 
        } catch (AclFormatException afex) { 
         throw new ServletException(afex); 
        } catch (IOException ioex) { 
         throw new ServletException(ioex); 
        } 
    } 
    
  2. En su web.xml añadir la propiedad cargar al inicio y configurarlo en 1. Esto para llamar al método init() cuando se inicia la aplicación web.

    <servlet> 
        <servlet-name>InitDatabase</servlet-name> 
        <servlet-class>bo.hsqltest.InitDatabase</servlet-class> 
        <load-on-startup>1</load-on-startup> 
    </servlet> 
    

Después de hacer esto de la aplicación Web se iniciará HSQLDB en un nuevo hilo. Para apagar la base de datos cuando se detiene la aplicación, puede anular el método destroy() de InitServlet. En el método destroy, debe ejecutar el comando "SHUTDOWN" como consulta sql normal (a través de JDBC).

1

Puede usar HSQLDB en cualquier servidor web/de aplicaciones en modo incrustado y permitir que las aplicaciones externas accedan a él ejecutando org.hsqldb.server.Servlet en su servidor web/de aplicaciones. Las aplicaciones externas se conectarán al servlet usando jdbc: hsqldb: http: type url's.

Si desea ejecutar org.hsqldb.server.Server (la clase de la versión 2.0) u org.hsqldb.Server, como un proceso separado como Tomcat, puede utilizar la clase org.hsqldb.util.MainInvoker para llame al método principal para múltiples clases (por ejemplo, Servidor Tomcat y HSQLDB) con Servidor llamado primero.

Cuestiones relacionadas