H2 数据库 1.3.156(或之前)和 1.3.157(及更高版本)之间的数据库连接问题
Posted
技术标签:
【中文标题】H2 数据库 1.3.156(或之前)和 1.3.157(及更高版本)之间的数据库连接问题【英文标题】:DB connection issue between H2 database 1.3.156 (or prior) and 1.3.157 (and onwards) 【发布时间】:2013-10-21 13:10:46 【问题描述】:最近在我的项目中迁移到最新的 H2 数据库 jar 时,我遇到了连接问题。
它在我们项目中的工作方式是一个程序以服务器模式启动H2数据库并连接到数据库。同一 JVM 中的另一个程序使用 URL "jdbc:h2:tcp://localhost/myfolder/mydb;IGNORECASE=TRUE" 并尝试使用 java.sql.DriverManager 创建与同一数据库的连接,即连接连接 = DriverManager.getConnection(this.url, this.user, this.password);
但是在我迁移到最新的 H2 jar 之后连接对象没有被创建(之前我们使用的是 1.2.147,它在那里工作正常)。经过一些分析,我可以缩小范围,如果我使用 H2 版本 1.3.156 或更低版本,此代码可以正常工作,但如果我开始使用 H2 版本 1.3.157 或更高版本,则不会为第二个程序创建连接。我检查了这两个版本的变更日志 (http://www.softpedia.com/progChangelog/H2-Database-Engine-Changelog-30870.html),但我找不到任何可能对此有所启发的内容。请注意,我们的 H2 数据库不包含任何具有 BLOB/CLOB 列的表。
同样的原因可能是什么?
问候, 阿迪亚
P.S.:异常堆栈跟踪:
org.h2.jdbc.JdbcSQLException: Connection is broken: "java.net.ConnectException:
Connection refused: connect: localhost" [90067-174]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:332)
at org.h2.message.DbException.get(DbException.java:161)
at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:417)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.jav
a:305)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:105)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:90)
at org.h2.Driver.connect(Driver.java:73)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.avaya.induna.server.db.DBConnectionManagerImpl.getConnection(DBCo
nnectionManagerImpl.java:34)
at com.avaya.induna.server.db.backup.BackupImplThread.takeBackup(BackupI
mplThread.java:313)
at com.avaya.induna.server.db.backup.BackupImplThread.run(BackupImplThre
ad.java:175)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at org.h2.util.NetUtils.createSocket(NetUtils.java:119)
at org.h2.util.NetUtils.createSocket(NetUtils.java:100)
at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:100)
at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:413)
... 9 more
【问题讨论】:
它会抛出异常吗?如果是,请发布异常消息和堆栈跟踪。还是该方法不返回?如果是的话,你能发布一个完整的线程转储吗? 添加了堆栈跟踪 FYR。我在这里使用了 H2 jar 1.3.173,但是对于任何版本为 1.3.157 或更高版本的 jar,我都会遇到相同的异常。 我认为要么服务器没有运行,要么有防火墙阻止访问此端口或 IP 地址,要么您的 TCP/IP 配置 (/etc/hosts
) 有问题。
很遗憾,您的两个选项都无效。我在其类路径中有 H2 1.3.156 jar 时启动我的 Web 服务器(Tomcat)。我尝试运行我的程序,它运行良好。然后我停止 Tomcat,用 H2 1.3.157 jar 替换 H2 1.3.156 并再次启动 Tomcat(在这两种情况下,H2 jar 都被重命名为“h2.jar”,因为这是它在类路径中的名称)。我的程序现在没有运行,我得到了上面提到的错误。
能否检查一下是否可以使用 telnet 连接到服务器,端口 9092?
【参考方案1】:
问题在于 H2 版本 1.3.157(及更高版本)发生了变化,现在对启动 H2 TCP 服务器的参数进行了更严格的检查。这导致服务器无法启动。例如,在 H2 版本 1.3.156 及更早版本中,允许以下内容:
Server.createTcpServer("");
而在以后的版本中,这会失败。
【讨论】:
以上是关于H2 数据库 1.3.156(或之前)和 1.3.157(及更高版本)之间的数据库连接问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 在下一个 h2 之前解析 HTML 并在一个 h2 之后获取所有 h3