缓冲MySQL查询或建立多个连接?

时间:2013-06-24 12:36:13

标签: java mysql

所以我目前正在研究一个应该将特定事件记录到数据库中的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);
        }
    }
}

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

2 个答案:

答案 0 :(得分:1)

建立连接是昂贵的,所以最好不要继续制作它们。但是,一直打开一个连接有其自身的问题(如果因某种原因关闭会发生什么?)

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

答案 1 :(得分:1)

您应该保持连接打开并重复使用它。启动和拆除JDBC连接非常昂贵,尤其是在使用SSL保护它的情况下。

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

您的数据库提供商可以提供连接池库,或者您可以使用C3PO之类的东西。此Q& A列出了其他一些选项:Java JDBC connection pool library choice in 2011/2012?


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