我正在开发一个使用 MySQL 的服务器,并且我一直在尝试了解使用连接池与保持打开的单个连接并通过应用程序传递给不同方法的优势。
使用连接池的想法是可以理解的,但是在某些情况下,这可能会造成瓶颈,如果没有连接池就不会出现这种情况。
使用代码更好地解释我的意思:
假设同时调用以下方法connectionPoolSize + 1(例如 10) 次,这意味着我们已经用尽了连接池中的连接,最后一次查询尝试将失败,因为没有可用的连接:
public void getData(con) {
Connection con = null;
Statement s = null;
ResultSet rs = null;
try {
con = connectionPool.getConnection();
s = con.createStatement();
rs = s.executeQuery("SELECT * FROM MY_TABLE;");
// Some long process that takes a while....
catch(Exception e) {
throw new Exception(e.getMessage())
} finally {
s.close();
rs.close();
con.close();
}
}
但是,如果我们使用一个保持打开的连接,并且所有方法都可以使用它,那么任何方法都不需要等待连接被发送回池(正如我们在上面看到的,可能需要一段时间)。
例如调用这个方法10次,这会工作
public void getData(con) {
Statement s = null;
ResultSet rs = null;
try {
s = con.createStatement();
rs = s.executeQuery("SELECT * FROM MY_TABLE;");
// Some long process that takes a while....
// But this time we don't care that this will take time,
// since nobody is waiting for us to release the connection
catch(Exception e) {
throw new Exception(e.getMessage())
} finally {
s.close();
rs.close();
}
}
显然,在方法完成之前,语句和结果集仍将保持打开状态,但这不会影响连接本身,因此它不会阻止任何其他使用此连接的尝试。
我假设我缺少一些进一步的见解,我了解标准正在使用连接池,那么您如何处理这些问题?