2010-12-01 6 views
8

Esto está relacionado con mi anterior question. Como dice la pregunta anterior, tengo una aplicación de escritorio que usa un método Principal diferente que iniciará un proceso en particular. Tanto la aplicación de escritorio como el método principal independiente accederán a la misma base de datos HSQLDB.Varias aplicaciones Java que acceden a un HSQLDB hace que la aplicación cuelgue

Antes de llegar hasta aquí, mi aplicación de escritorio acababan de ser de acceder a una base de datos HSQLDB usando una dirección URL de conexión como ésta:

jdbc:hsqldb:file:/some/path/myDatabase 

Ahora bien, esto funciona bien en un entorno de usuario único. Ahora que tengo un entorno multiusuario con la aplicación de escritorio y el proceso Main separado que desea leer/escribir en/desde esta base de datos, quería hacer de esta base de datos un recurso compartido.

He echado un vistazo al HSQLDB documentation y esta publicación sobre Creating a shared HSQLDB database pero fue en vano.

En la publicación se habla sobre la puesta en marcha del servidor a través del código. No creo que esto sea lo que quiero hacer, ya que me gustaría tener la base de datos HSQLDB funcionando todo el tiempo, ya que podría haber múltiples usuarios de la aplicación de escritorio.

En cuanto a la documentación oficial HSQLDB, se establece que se puede iniciar un servidor HSQLDB como esto:

java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb 

Si funciono con el comando anterior con mi propio archivo de base de datos y el nombre, parece que la puesta en marcha de acuerdo :

[[email protected]]: [Thread[main,5,main]]: checkRunning(false) entered 
[[email protected]]: [Thread[main,5,main]]: checkRunning(false) exited 
[[email protected]]: Startup sequence initiated from main() method 
[[email protected]]: Loaded properties from [/some/path/myDatabase/server.properties] 
[[email protected]]: Initiating startup sequence... 
[[email protected]]: Server socket opened successfully in 16 ms. 

entonces me cambió la dirección URL de conexión a lo siguiente:

jdbc:hsqldb:hsql://localhost/xdb 

Esto no parece funcionar para mí. ¿Alguna idea sobre lo que hice mal o sobre lo que podría extrañar?

Además, cuando la aplicación de escritorio se desconecta del método Main externo, la aplicación de escritorio simplemente se cuelga cuando el método Main externo advierte que la aplicación de escritorio parece tener un bloqueo en la base de datos. Tan pronto como apago la aplicación de escritorio, el método Principal externo realmente hace lo que esperaba que hiciera.

Respuesta

10

usando jdbc:hsqldb:file:/some/path/myDatabase que está creando una base de datos en proceso por lo que este no debe ser compartida entre múltiples JVM (idealmente), sin embargo hay una manera según guía

"En 1.8.0, puede ejecutar un servidor instancia en un hilo de la misma máquina virtual como su aplicación y proporciona acceso externo a su base de datos en proceso ".

imho, una mejor manera sería comenzar en modo servidor en jvm separado.

actualización:

comprobar que se conecte cuando el servidor hsqlsdb se está iniciando:

[[email protected]]: Initiating startup sequence... 
[[email protected]]: Server socket opened successfully in 31 ms. 
[[email protected]]: Database [index=0, id=0, db=file:test, alias=] opened sucessfully in 250 ms. 

coincidir con el nombre de alias en la url controlador

Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/", "sa", ""); 

en este caso no se sin alias Acabo de probar esto y funciona bien.

+0

eso es lo que yo ya estoy tratando de hacer. Estoy tratando de iniciar la base de datos en un jvm por separado, pero parece que todavía no funciona ... – digiarnie

+0

He actualizado la respuesta para incluir un ejemplo, a ver si eso ayuda. – kunal

+0

Los mensajes que aparecen cuando inicio son como se muestran en mi publicación original. No parece tener una línea que diga el alias como el tuyo. ¿Cómo puedo obtener ese bit de alias para aparecer? – digiarnie

4

La respuesta de @kunal es correcta. Pero tiene un archivo server.properties que puede contener la siguiente configuración:

server.database.0 file:mydb 
server.dbname.0 xdb 

utilizar el archivo de configuración para server.properties, o alternativamente la línea de comandos. No use ambos.

Una vez que haya iniciado el servidor, la aplicación de escritorio ya no podrá conectarse a la base de datos con la URL jdbc:hsqldb:file:/some/path/myDatabase. Necesita conectarse con la URL jdbc:hsqldb:hsql://localhost/xdb.

HSQLDB tiene una solución genérica para invocar el método principal para un proceso diferente. Use esta clase para invocar cualquier proceso MainInvoker class source

2

Tuve un problema similar, una aplicación escribe en el hsqldb y otra lee de ella.

He resuelto todo sin usar Server, todo lo que utilicé fueron algunas configuraciones encontradas here.

I añadió siguientes propiedades:

  • aplicación que escribe:
    • readonly = false
    • hsqldb.lock_file = false
  • aplicación que sólo lee:
    • readonly = true
Cuestiones relacionadas