2013-06-24 99 views
1

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

什么我做的是:

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); 
     } 
    } 
} 

是否有建立新连接,每次都没问题,也可以/我应该在某种程度上缓冲输入?

回答

1

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

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

1

您应该保持连接打开并重用。启动和拆除JDBC连接非常昂贵,特别是如果您使用SSL保护它的话。

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

你的数据库提供者可以提供一个连接池库,或者你可以使用类似C3PO的东西。这种问答& A列出了其他一些选项:Java JDBC connection pool library choice in 2011/2012?


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