所以我目前正在研究一个应该将特定事件记录到数据库中的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);
}
}
}
每次建立新连接都没有问题,或者我是否应该以某种方式缓冲输入?
答案 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