【发布时间】:2025-12-10 08:15:02
【问题描述】:
我在 Jetty 9 服务器上部署了一个 servlet,它使用来自 http://dev.mysql.com/downloads/connector/j/5.0.html 的 Connector/J JDBC 驱动程序连接到 MySQL 5.6.17 服务器。
这个特殊的 servlet 会在 for 循环中触发一条 SQL 语句,该循环循环大约 10 次。我必须包括
DriverManager.getConnection(DB_URL, USER, PASSWORD);
在此循环中的行,因为在循环的每次迭代中执行 SQL 语句后连接会自动关闭。
有没有办法保持连接打开,这样getConnection() 只需在循环开始前执行一次,然后我可以在 finally 块中手动关闭它。
我发现了很多关于这个特定问题的帖子,但都提到了连接池的概念作为解决方案。但我只是想避免在每次查询执行后自动关闭连接。这不应该是一个简单的参数吗?我现在没有遇到任何特定的性能问题,但这似乎只是在浪费处理器和网络周期。
Servlet 代码:
public class CheckPhoneNumberRegistrationServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException {
System.err.println("started CheckPhoneNumberRegistrationServlet");
// define database connection details
final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
final String DB_URL = DatabaseParameters.SlappDbURL;
final String USER = DatabaseParameters.DbServer_Username;
final String PASSWORD = DatabaseParameters.DbServer_Password;
PreparedStatement prpd_stmt = null;
Connection conn = null;
ResultSet rs = null;
int resultValue;
// open a connection
/*try {
conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}*/
JsonParser jsparser;
JsonElement jselement;
JsonArray jsrequestarray;
JsonArray jsresponsearray = new JsonArray();
StringBuffer jb = new StringBuffer();
String line = null;
try {
BufferedReader reader = req.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
} catch (Exception e) {
e.printStackTrace();
}
try {
jsparser = new JsonParser();
jselement = (JsonElement) jsparser.parse(jb.toString());
jsrequestarray = jselement.getAsJsonArray();
for (int i = 0; i < jsrequestarray.size(); i++) {
// System.err.println("i : " + i +
// jsrequestarray.get(i).toString());
try {
conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
prpd_stmt = conn
.prepareStatement("select slappdb.isPhoneNumberRegistered(?)");
prpd_stmt.setString(1, jsrequestarray.get(i).toString()
.replace("\"", ""));
rs = prpd_stmt.executeQuery();
if (rs.first()) {
//System.err.println("result sert from sql server : " + rs.getString(1));
//slappdb.isPhoneNumberRegistered() actually returns Boolean
//But converting the result value to int here as there is no appropriate into to Boolean conversion function available.
resultValue = Integer.parseInt(rs.getString(1));
if(resultValue == 1)
jsresponsearray.add(jsparser.parse("Y"));
else if(resultValue == 0)
jsresponsearray.add(jsparser.parse("N"));
else throw new SQLException("The value returned from the MySQL Server for slappdb.isPhoneNumberRegistered(" + jsrequestarray.get(i).toString().replace("\"", "") + ") was unexpected : " + rs.getString(1) + ".\n");
// System.err.println("y");
}
else throw new SQLException("Unexpected empty result set returned from the MySQL Server for slappdb.isPhoneNumberRegistered(" + jsrequestarray.get(i).toString().replace("\"", "") + ").\n");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (prpd_stmt != null)
prpd_stmt.close();
} catch (SQLException e1) {
}
try {
if (conn != null)
conn.close();
} catch (SQLException e1) {
}
}
}
resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("text/plain");
// resp.setContentLength(1024);
resp.getWriter().write(jsresponsearray.toString());
System.err.println(jsresponsearray.toString());
} catch (Exception e) {
// crash and burn
System.err.println(e);
}
【问题讨论】:
-
发布您当前的代码。
-
如何判断连接正在关闭?你要关闭它吗?
-
我没有关闭它。它以某种方式自动发生。我意识到了这一点,因为如果我将 getConnection() 移到循环上方,我会得到无持久 SQL 连接异常。
-
conn.close();是做什么的? -
你是绝对正确的。我迷失在方括号的迷宫中,错误地认为 finally 块在 for 循环之后。