解决因内置hsql锁死出现的各种诸如暂存错误的解决方法

我是社区第58841位番薯,欢迎点我头像关注我哦~
本帖最后由 sdueducn998 于 2016-5-19 13:54 编辑

剥离HSQL服务,设置为独立Server模式(以下为文字说明,附件包里面有图文版说明和相关文件)
FineReport集成的HSQL服务会莫名其妙的出现各种问题,例如当前线程锁死,无法使用暂存等等。原因在于自带HSQL服务启动模式并非server,所以会出现多线程使用时锁死,无法访问。解决这一问题的方法是运行系统时不使用Finereport自带服务启动和管理finedb下的数据库,而使用其他方式。
目前使用mysql作为服务管理的插件已经上线,虽然可以替代大部分的原HSQL管理下的功能,但是部分功能无法实现,例如填报暂存功能。在FR不进行大的变动前,比较合适的方法是将HSQL单独提取做成独立服务,并采用server多线程模式。具体方法如下:
1.     下载HSQLDB(可以直接从官网下载)提取hsqldb.JAR,或者直接下载该hsqldb.JAR。
2.     下载完成后,将FineReport \WebReport\WEB-INF目录下的finedb文件夹,整体拷贝到你需要的目录,作为以后独立HQSL服务器要访问的数据库。
例如放到C盘根目录下。名称可以任意,尽量不要用中文和特殊符号。该目录下的文件,也可以重新命名,但要注意的是,所有文件的名称必须相同,后缀不可以更改。建议还是不要修改,用默认的db做文件名即可。注意:拷贝后需要删除db.lck文件(如有)!
3.     将下载完成的hsqldb.jar或者HSQLDB解压后lib目录内的hsqldb.jar拷贝至刚才路径的finedb文件夹中。例如我这里是c:\finedb
4.     测试hsql服务器是否可以正常使用(该步骤可以跳过,直接进入下一步)
1)  以管理员模式启动CMD模式,进入到存放hsqldb.jar这个文件的文件夹,录入我这里是C:\FINEDB
2)  输入以下命令(直接拷贝粘贴即可):

java -classpath hsqldb.jar org.hsqldb.Server -database.0../finedb/db -dbname.0 xdb

注释:这是启动hsql服务的命令,Server代表启动的是服务器模式,可以多线程访问,”-database.0 ../finedb/db”是指定数据库存放路径及数据库名称,../finedb/是路径,db是数据库名,这里应用的是相对路径,当然也可以使用绝对路径。-dbname.0 xdb 是数据库别名,xdb可以任意设定,这个别名下面会用到。整个命令的含义是,打开相对路径finedb下的db数据库,并命名别名为xdb。如果该目录下没有该数据库,则新建。注意命令行内是有空格的!!!
成功界面如下:
3)  测试数据库是否可以连接。
一定不要关闭刚才打开的CMD窗口,关闭以后服务就中止了。
新开一个CMD窗口,依旧进入C:\FINEDB,输入以下命令:

java -cp hsqldb.jar org.hsqldb.util.DatabaseManager

这是调取hsql图形化数据库管理器的命令。成功后如下图:
按照如下设置:
Type这里我们启动的是Server模式,所以要选择Server,URL这里,将我们刚才命名的别名xdb添加上,然后点击OK,出现下列画面就代表Server启动和连接正常。左侧就是finedb下db.data里面的所有表了。如果设置了非9001端口,请加上端口号。如出现下列界面,证明服务器启动正常,可以顺利连接。左侧出现的就是db数据库里面的数据了。
5.     如果第四步执行的没有问题,那我们就可以将单独的HSQL服务设置为随系统启动了。
1)  建立两个bat批运行文件。名称自定义即可,我的是runServer.bat和runManager.bat。
runServer.bat是启动HSQL服务的,是必须;runManager.bat是启动管理界面的,可选用。建议也一起创建。
2)  打开runServer.bat,用文本打开或者用notepad++,建议用notepad++,里面写入如下内容:
cd C:\finedb
@Java -classpath hsqldb.jar org.hsqldb.Server-database.0 ../finedb/db -dbname.0 xdb
注释:cd后面是你存放数据库文件和hsqldb的路径,可以根据实际情况进行修改,这一句的作用就是转至该目录下;下一句就是在该目录下执行什么命令,与前面进行测试的命令行是一致的,不再解释。
3)  修改完毕后,保存。
4)  然后直接运行该bat文件,可以看到服务已经启动。注意在运行时,不能关闭cmd窗口,关闭窗口服务会一同关闭。
6.     将hsql服务设置成随系统自动启动
如果要成为随系统启动的服务,可以将runServer.bat设置成自动启动,不过这样每次都有个cmd窗口,不小心关了就麻烦。所以我们用vbs做一个隐藏cmd窗口的功能。
1)  新建一个文本文档,输入以下内容:

DIM objShell
setobjShell=wscript.createObject("wscript.shell")
WScript.Sleep(1000)
iReturn=objShell.Run("cmd.exe /Cc:\finedb\runserver.bat", 0, TRUE)

这里c:\finedb\runserver.bat可以根据你的批处理文件位置和名称进行更改。其他保持不变。或者根据情况修改。然后另存为vbs文档。
2)  将该vbs文件拖到启动文件夹内即可。
7.     将我们剥离出来的HSQL服务设置成默认的finedb服务,打开设计器,定义数据连接,定义为剥离出的服务器,然后打开datascource.xml文件,JDBCDatabaseAttr部分的复制出来,放在config.xml文件的底部,保存重启服务即可。详情请参考:http://bbs.fanruan.com/thread-64463-1-1.html
经过以上步骤,将原集成的HSQL,剥离出来,并设置为自动启动的server模式,基本上可以解决所有因为多线程锁死导致的问题。欢迎大家一起交流。

所用软件,已经打包。本人测试环境为win7 x64 SP1.
     
     具体操作步骤和相关文件请下载附件
     这个说明也是在参考了论坛和其他高手的文档基础之上制作,所以免费。也希望FR可以做的更好,如果有可能,是否可以考虑将HSQL更换为通用型更好的mysql或者sqlserver数据库。

参与人数 +1 F豆 +6666 +88 F币 +66 理由
传说哥 + 6666 + 88 + 66 赞一个!

查看全部评分

发表于 2016-5-19 13:21:25
666666{:5_127:}
发表于 2016-5-19 13:21:34
这个不错,
发表于 2016-5-19 13:26:00
高 。真是高手啊
发表于 2016-5-19 13:49:40
关于如何将剥离后的hqsl设置成服务,请参考大佬的帖子http://bbs.fanruan.com/thread-64463-1-1.html
发表于 2016-5-19 15:27:03
等测试成功后,再来给楼主送上大奖励
发表于 2016-5-19 15:31:51
为什么这么牛
发表于 2016-5-19 19:26:20
系统内置的hsql服务,如果要单独剥离出来,是需要自行修改剥离以后的数据库的。我提供的是一个基本的思路和方法。具体碰到问题还需要具体解决。
hsql转mysql的那个插件,也是有一定的问题,包括我的方法也是有一定的问题。最最主要的就是剥离后,db数据库里面表ID的自动生成会有问题。
解决方法就是用相应的工具,将存在问题的表的ID设置成自动生成,基本都可以解决。
PS:本人不是学数据的,接触数据库不到2个月。纯粹的瞎研究。欢迎大牛指导。
将FR的一些bug逐步解决,用起来也舒服。
发表于 2016-5-19 19:26:43
来自手机
膜拜大神
发表于 2016-5-20 09:27:50
{:8_209:}先收藏,待用
发表于 2016-5-20 09:42:35
{:8_209:}收藏,待用
发表于 2016-5-20 13:24:12
好大方啊,。。。。。。。。。
发表于 2017-3-23 08:43:07
666666666666666 非常不错
发表于 2018-5-14 12:59:44
独立部署以后原来FineReport \WebReport\WEB-INF下的finedb文件夹需要删除吗?
发表于 2018-8-24 13:49:26
压缩包有问题,解压不出来了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

14回帖数 1关注人数 16818浏览人数
最后回复于:2018-8-24 13:49

返回顶部 返回列表