H2 数据库,进程死锁导致访问异常的问题
来源:互联网 发布:素描教学软件下载 编辑:程序博客网 时间:2024/06/07 23:42
问题现象:
H2数据库启动后,Web Server运行正常,能通过9090端口访问,但无法访问数据库。
问题复现:
通过启动脚本重启H2数据库,复现的概率非常高(测试人员反应运行中的H2数据库也会出现连接异常的问题,该场景暂时未复现)。
问题分析:
初步断定是进程死锁导致。根据程序的堆栈信息,也支持这一判断。
对造成死锁的原因进行分析:
1 H2服务器有多种启动方式,我们使用的是Console模式,且全部使用默认参数;这种场景下,H2会按顺序逐次启动WebServer,TcpServer,PgServer。
WebServer能支持用户通过浏览器访问数据库,TcpServer支持Java程序中通过api访问数据库,PgServer支持通过PgAdmin客户端访问数据库。
2 WebServer启动后,会有一个自我检测的环节,也就是创建一个Socket去连接WebServer,来检测WebServer是否已启动;因此,WebServer的第一个
WebThread线程,就是用来处理这个自检请求的,由于自检请求没有携带正常的启动信息,因此会引发异常,进而去执行DbException.traceThowable()函数。
3 与此同时,Main函数会继续启动TcpServer,过程中会加载org.h2.Driver类;如果此时WebThead线程也恰好正在执行Driver的初始化,就会导致
死锁;如果此时WebThread线程已经执行结束并正常退出,那么Main函数就可以正常的启动TcpServer。
这也就可以解释为什么启动失败是偶发事件。
解决方案:
Console模式的启动顺序是:WebServer->OpenBrowser->TcpServer->PgServer;我们的使用场景中,其实不需要启动浏览器和PgServer;另外,WebServer在TcpServer
之前启动,会偶发启动失败的问题,应该是H2的一个bug。
H2同时提供了另一种启动模式——Server模式,该模式中各服务器的启动顺序是:TcpServer->PgServer->WebServer->OpenBrowser;
因此可以通过Server模式来启动,来避免启动失败的问题。
java -cp $H2HOME/h2-1.4.192.jar org.h2.tools.Server -web -webPort 9090 -webAllowOthers -tcp -tcpPort 9092 –tcpAllowOthers
- H2 数据库,进程死锁导致访问异常的问题
- 进程异常退出导致死锁的解决办法
- 解决进程间共享内存,由于某个进程异常退出导致死锁问题
- 数据库死锁导致站点访问故障解决方案
- 误用Connection.setAutoCommit导致的数据库死锁问题
- Localtime导致进程死锁问题探源-转
- Mysql数据库更新操作导致死锁问题
- 进程死锁的危害、导致原因、解决方法
- 进程死锁的危害、导致原因、解决方法
- 关于oracle设置不活动自动断开连接导致java访问数据库时发生异常的问题
- 能够可视化访问和查看H2数据库的工具
- H2数据库的使用
- H2 数据库的使用
- 关于waitForCondition导致死锁的问题
- 关于waitForCondition导致死锁的问题
- SendMessage会导致死锁的问题
- 关于服务器并发访问导致重复写数据库的问题
- 关于使用Spring导致c3p0数据库死锁问题
- Java:String和Date、Timestamp之间的转换
- Leetcode-599.Minimum Index Sum of Two Lists
- Mac的最大连接数限制和端口的相关参数的设置
- ORA-28001错误
- Java多线程中实现原子操作的方法
- H2 数据库,进程死锁导致访问异常的问题
- 微信、支付宝没网也能支付的原理
- 发力VR内容开发,Adobe直接将SkyBox技术收入囊中
- 在eclipse里导入codestyle后仍无出现模板注释
- 7Series FPGA SelectIO
- jQuery ajaxComplete()方法,判断ajax请求状态
- [已解决]windows 上面git 克隆clone 的时候报错 warning:Clone succeeded,but checkout failed
- ssm项目打包后mybatis的mapper.xml文件没有放进去
- 双系统Linux无法挂载Windows分区解决方案