当前位置: 首页 > 面试题库 >

当我的应用失去连接时,我应该如何恢复它?

冯浩旷
2023-03-14
问题内容

我有一个要连接到MySQL数据库的应用程序。它在半夜断开连接,然后喷出有关null连接的信息,并且JDBC在X秒内没有收到消息。

getConnection()在进行任何需要与SQL Server通信的操作之前,我先打电话给我。

这是我的getConnection()方法:

private Connection getConnection() {
    try {
        if (connection != null) {
            if (connection.isClosed() || !connection.isValid(10000)) {
                this.initializeRamsesConnection();
            }
        } else {
            this.initializeRamsesConnection();
        }
    } catch (Exception e) {
        debug("Connection failed: " + e);
    }
    return connection;
}

在该initializeRamsesConnection()方法中,我将密码等信息放入字符串中,然后以标准JDBC方式创建连接。

然后我调用此方法:

private Connection getConnectionFromConnectionString() {
    Connection con = null;
    String driver = "com.mysql.jdbc.Driver";
    try {
        Class.forName(driver);//jdbc sorcery
        //if there is no connection string
        if (getConnectionString() == null) {
            HMIDatabaseAdapter.debug("No connection string");
        }
        //makes a string out of the values of db/host
        String str = getConnectionString();
        //if there is no driver
        if (driver == null) {
            debug("" + ": " + "No driver");
        }
        //Tries to make a connection from the connection string, username, and the password.
        con = DriverManager.getConnection(str, username, password);
        //if for some reason the connection is null
        if (con == null) {
            HMIDatabaseAdapter.debug("CONNECTION IS NULL, WHAT?");
        }
    } catch (Exception ex) {
        HMIDatabaseAdapter.debug("getConnection() " + ex);
    }
    return con;
}

我可以对这两种方法进行哪些更改以适应丢失的连接?


问题答案:

这不是检索连接的正确方法。您正在检索连接并将其分配为该类的实例变量(或更糟糕的是,静态变量)。基本上,您将使连接永远保持打开状态,并对所有查询重新使用单个连接。如果查询由不同的线程执行,则可能会导致灾难。另外,当它保持打开状态太长时间时,DB会回收它,因为它假定它已死/泄漏。

您应该在 尽可能短的范围内 获取 并关闭 连接。即与执行查询的位置相同。像这样: __try

public Entity find(Long id) throws SQLException {
    Entity entity = null;

    try (
        Connection connection = dataSource.getConnection(); // This should return a NEW connection!
        PreparedStatement statement = connection.prepareStatement(SQL_FIND);
    ) {
        statement.setLong(1, id);

        try (ResultSet resultSet = preparedStatement.executeQuery()) {
            if (resultSet.next()) {
                entity = new Entity(
                    resultSet.getLong("id"),
                    resultSet.getString("name"),
                    resultSet.getInt("value")
                );
            }
        }
    }

    return entity;
}

如果您担心连接性能并想重用连接,则应该使用连接池。您可以自己种一个,但是我强烈不建议这样做,因为您似乎还很陌生。只需使用现有的连接池,例如BoneCP,C3P0或DBCP即可。请注意,您应该
不会 如在上面的例子改变JDBC成语。您仍然需要在尽可能短的范围内获取并关闭连接。连接池本身将担心实际重用,测试和/或关闭连接。



 类似资料:
  • 问题内容: 我想使用Java 7和NIO 2编写异步服务器。 但是我应该怎么用呢? 例如,如果我开始: 然后,当我这样做时,该程序 终止, 因为该调用是 异步的 。如果我将该代码置于无限循环中,则会抛出。 关于如何使用编写一个简单的异步服务器的任何建议? 这是我的完整示例(类似于JavaDoc中的示例): 问题答案: 您走在正确的轨道上,从完成的回调中调用accept()以便接受更多连接应该起作用

  • 我试图创建一个简单的SpringBoot应用程序来连接和存储数据库中的一些数据,但是当我的代码试图提交一个新对象时,仍然会遇到401禁止消息。 我应该如何使用SpringBoot连接到ArangoDb,以便能够在数据库中保存节点? 我的系统上运行了ArangoDb,我可以在localhost登录到web控制台:http://localhost:8529 我有一个与下面的属性同名的数据库。我还尝试在

  • 我的问题是,我已经创建了一个传输控制协议,当它停留没有传输任何数据约1小时,它已经从服务器断开连接,但它不通知我,它已断开连接,我应该发送保持活动的数据包到服务器吗?或者我应该发送保持活动的数据包从服务器到客户端?或者我应该发送两个?

  • 我有一个活动,它为结果启动了一些其他活动,所以当结果回来时,该活动可能已经或可能没有被销毁和重新创建。 我已经重写了onSaveInstanceState,以便添加需要保留和恢复的数据。 当活动被销毁并重新创建时,onCreate被传递给savedInstanceState包;但也调用并传递了相同的捆绑包onRestoreInstanceState()。 那么我应该把从捆绑包中提取数据并恢复状态的

  • 我使用的是Netty 4.0.33-Final中的LengthFieldBasedFrameDecoder类。 我正在开发的软件可以在没有Netty的帮助下与电视通信,所以我在这里以非传统的方式使用Netty。我只是使用Netty作为解码器和通道管道来解码来自各种不同设备的消息。那至少是我的目标。 问题是LengthFieldBasedFrameDecoder将长度字段解释为十六进制值0x38,并

  • 在一个android应用中,我编写了一个在后台播放音乐的服务。我已经实现了来监听音频焦点的更改。问题是,在以下情况下,我没有收到对的回调。 > 在我的应用程序中播放音乐,并将应用程序放在后台。(背景不断播放音乐)。 启动youtube应用程序,播放任何视频。这将回调,在此我暂停媒体播放器。 现在我为youtube按home键(youtube停止播放)。