H2DB服务端模式跨设备连接报错数据库不存在问题求助
问题原因
- H2数据库从1.4.200版本开始,默认禁止远程连接场景下自动创建不存在的数据库,仅允许本地连接时自动建库。你本机运行时属于本地访问,会自动在你当前用户目录下创建对应的数据库文件,因此运行正常;将服务部署到其他电脑后,目标机器的对应用户目录下没有提前创建该数据库,且远程访问时默认禁止自动建库,就会抛出该错误。
- 你的JDBC URL中
/~指代的是H2服务运行所在机器的当前用户目录,不同电脑的用户目录路径不同,也可能出现路径匹配不上的问题。
解决方案
开发测试环境(无需考虑安全风险)
直接在启动TcpServer时添加-ifNotExists参数,允许远程连接自动创建不存在的数据库,修改startServer方法中TcpServer创建的代码即可:
tcpServer = Server.createTcpServer("-tcpAllowOthers", "-tcpPort", "55756", "-ifNotExists");
生产环境(需保障安全)
不要开启-ifNotExists参数,提前在部署H2服务的机器上预创建对应数据库即可,两种常用预创建方式:
- 访问你已经开启的H2 web控制台(端口8092),输入对应JDBC URL、用户名、密码连接一次,系统会自动生成数据库文件
- 登录部署H2服务的机器,本地执行一次数据库连接操作,自动生成库文件
可选优化
如果不想数据库文件默认存放在用户目录,可以修改JDBC URL中的路径为固定绝对路径,或者在启动TcpServer时添加-baseDir参数指定数据库文件的存储根目录,避免不同机器路径不一致的问题。
内容的提问来源于stack exchange,提问作者JavaGuest2000
相关产品推荐
相关产品推荐

