0

我有以下设置:

  • mybase.odb一个连接到 HSQLDB Split-DB的 LibreOffice Base ,名为mydb
  • 带有用于打开报告的按钮的表单
  • 此按钮后面的宏基本上执行:
   shell(convertToUrl(Tools.Strings.DirectoryNameOutOfPath( _
                      ThisComponent.Parent.getURL(), "/") & "myReport.cmd"), HIDE)
  • myReport.cmd包含:
    :: From: http://hsqldb.org/doc/2.0/guide/listeners-chapt.html#lsc_listener_types
    start /min java -cp %~dp0driver/hsqldb.jar org.hsqldb.server.Server
        --database.0 file:mydb --dbname.0 mydb

    timeout /t 3

    :: From: http://jasperstarter.cenote.de/index.html
    jasperstarter -v pr %~dp0myReport.jasper -r -o . -f pdf
        -H [localhost|127.0.0.1] --db-port 9001 -n mydb -u myuser

[此处插入换行符以便于阅读。]

HSQLDB 服务器启动成功:

...
[Server@1742700]: Startup sequence completed in 382 ms.
[Server@1742700]: 2016-05-09 23:05:49.129 HSQLDB server 2.3.2 is online on port 9001
...

随后JasperStarter没有显示任何错误,但没有PDF创建。

在 HSQLDB 服务器输出之后,Server@1742700我也尝试过(希望不大):

jasperstarter ... -H 1742700 ... -n Server

无济于事。

下面的myReport.cmd作品就像一个独立的魅力:

jasperstarter pr %~dp0myReport.jasper -r -o . -f pdf -t generic
    --jdbc-dir %~dp0driver --db-driver org.hsqldb.jdbcDriver
    --db-url jdbc:hsqldb:file:%~dp0database/mydb;sql.syntax_mys=true;shutdown=true
    -u myuser

[此处插入换行符以便于阅读。]

但当然不是,如果mybase.odb是开放的:

Unable to connect to database: Database lock acquisition failure: lockFile:
org.hsqldb.persist.LockFile@68306856[file =<path>\database\mydb.lck, exists=true,
locked=false, valid=false, ] method: checkHeartbeat read: 2016-05-09 21:25:13
heartbeat - read: -6188 ms.

顺便说一句,为什么locked=false当锁定文件存在时?

4

2 回答 2

2

根据fredt的回答,我创建了一个myapp.cmd包含:

start "My DB Server" /min java -cp %~dp0driver/hsqldb.jar org.hsqldb.server.Server
   --database.0 file:%~dp0database/mydb --dbname.0 mydb
timeout /t 2
start /b /max %~dp0mybase.odb

myReport.cmd现在只包含:

jasperstarter -v pr %~dp0myReport.jasper -r -o %~dp0 -f pdf
   -H localhost --db-port 9001 -n mydb -u myuser

我意识到:

jasperstarter ... -o .

没有按预期工作。使用 ' .' 它C:\Program Files (x86)\LibreOffice 5\program作为输出目录(如果从 Base 中调用则可以理解)。因此,我将其更改为 absolute %~dp0

于 2016-05-10T20:03:32.833 回答
1

一次只有一个 Java 进程可以连接到一个文件:数据库。该消息表明第二个进程无法获取锁,因为锁文件已由另一个进程创建并且确实存在。

您应该更改设置,以便在启动 LibreOffice 之前启动 HSQLDB Server。然后 LibreOffice 连接到服务器数据库,您的宏不再启动服务器,而是使用服务器 URL 启动报告生成器。

于 2016-05-09T22:51:33.300 回答