【问题标题】:H2 Database connection timeout with new computerH2 与新计算机的数据库连接超时
【发布时间】:2018-08-20 18:44:42
【问题描述】:

我在我的 Java 项目中使用了两个 H2 数据库。最近,我更换了我的计算机,从那时起,使用我的 Java 代码连接到其中一个数据库没有问题,但另一个数据库出现问题。它与我用来启动连接的代码完全相同(最多 PATH_TO_DATABASE):

import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConfig {

    private static java.sql.Connection connection;

    public static void init() {
        if (connection == null) {
            try {
                connection = DriverManager.getConnection("jdbc:h2:tcp://192.168.178.50:9092/C:/Users/PATH_TO_DATABASE", "USER", "PW");
            } catch (SQLException e) {
                System.err.println("SQLException");
                e.printStackTrace();
                System.exit(0);
            }
        }
    }

    [...]
}

这是我得到的堆栈跟踪:

SQLException
org.h2.jdbc.JdbcSQLException: Connection is broken: "java.net.SocketTimeoutException: connect timed out: 192.168.178.21:9092" [90067-196]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:168)
    at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:457)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:334)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:116)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:100)
    at org.h2.Driver.connect(Driver.java:69)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at data.DatabaseConfig.init(DatabaseConfig.java:20)
    ...
Caused by: java.net.SocketTimeoutException: connect timed out
    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:103)
    at org.h2.util.NetUtils.createSocket(NetUtils.java:83)
    at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:115)
    at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:453)
    ... 8 more

使用网络界面,我可以轻松连接到两个数据库。

我有点迷路了,因为我无法弄清楚其中一个数据库出了什么问题。奇怪的是,其他数据库一切正常。

编辑:我刚刚意识到错误消息中的 IP 地址与代码中的 IP 地址不同(192.168.178.21:9092 与 192.168.178.50:9092)。也许这就是错误的原因。代码中的一个是正确的 IP 地址。为什么我在错误消息中得到不同的消息?这就是我的问题的原因吗?

【问题讨论】:

    标签: java timeout connection database-connection h2


    【解决方案1】:

    如果是远程连接,请发送ipconfig 以查明是否为 192.168.x.x。地址变了。

    如果是本地连接,您可以将 URL 简化为

    jdbc:h2:~/PATH_TO_DATABASE
    

    【讨论】:

    • 192.168.178.50:9092 是正确的 IP 地址。但是看看我的帖子的编辑。也许这就是问题所在......
    【解决方案2】:

    我刚刚解决了这个问题(这有点像我的愚蠢):该项目无法在新计算机上构建,因为 H2 jar 未正确包含在构建路径中。这就是为什么 Eclipse 一直调用旧的 .class 文件并因此尝试连接到旧计算机 (192.168.178.21:9092) 而不是新计算机 (192.168.178.50:9092)。我没有意识到eclipse没有编译并且正在执行旧的东西。

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2018-12-21
      相关资源
      最近更新 更多