1

所以我目前正在开发一个应该将特定事件记录到数据库中的 java 应用程序。我预计每分钟最多会有 15 到 20 次插入,基本上我想知道是否应该为每个插入语句建立一个新连接,或者只要应用程序正在运行就保持一个打开。

我正在做的是:

public void logEvent(MyCustomEvent e) {
    Connection con = null;
    Statement st = null;
    ResultSet rs = null;

    try {
        con = DriverManager.getConnection(url, user, password);
        st = con.createStatement();

        st.executeUpdate("INSERT INTO Table(" + e.data + ");");

    } catch (SQLException ex) {
        Logger lgr = Logger.getLogger(MySQLConnector.class.getName());
        lgr.log(Level.SEVERE, ex.getMessage(), ex);

    } finally {
        try {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
            if (con != null) {
                con.close();
            }

        } catch (SQLException ex) {
            Logger lgr = Logger.getLogger(MySQLConnector.class.getName());
            lgr.log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
}

每次建立新连接是否没有问题,或者我可以/应该以某种方式缓冲输入吗?

4

2 回答 2

1

建立联系很昂贵,因此最好不要继续建立联系。但是,始终保持一个连接打开有其自身的问题(如果它由于某种原因关闭会发生什么?)

为什么不看看数据库连接池——谷歌会为你展示几个相互竞争的连接池实现。你会得到两全其美的。对于您的应用程序,连接似乎是永久打开的,但如果连接由于某种原因失败,连接池将为您处理重新打开它。

于 2013-06-24T12:41:06.567 回答
1

您应该保持连接打开并重复使用它。启动和断开 JDBC 连接的成本很高,尤其是在使用 SSL 保护它的情况下。

另一种选择是使用所谓的连接池,其中应用程序不直接创建 JDBC 连接,而是从珍贵打开的连接池中获取一个。完成后,它将连接返回到池。

您的数据库提供者可以提供一个连接池库,或者您可以使用 C3PO 之类的东西。此问答列出了一些其他选项:Java JDBC 连接池库在 2011/2012 年的选择?


在 MySQL 中长时间保持连接打开有一个问题。问题是 MySQL 有几个小时的默认“空闲连接”超时(我认为是 10 左右)。因此,如果您的应用程序长时间处于空闲状态,它会发现其连接已断开。连接池可能会为您重新连接。否则,此问题的标准解决方法是将默认超时增加到非常大的值。例如:MySQL 连接超时

于 2013-06-24T12:41:15.283 回答