java - 避免在 servlet 中自动关闭 jdbc 连接

标签 java mysql jdbc

我在 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 block 中手动关闭它。

我发现了很多关于这个特定问题的帖子,但所有帖子都提到连接池概念作为解决方案。但我只是想避免在每次查询执行后自动关闭连接。这不应该是一个简单的参数吗?我现在没有面临任何特定的性能问题,但这似乎只是浪费处理器和网络周期。

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

最佳答案

问题是您正在 for 循环内关闭连接。只需将连接打开和连接关闭这两个语句移到循环之外即可。

conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
for (int i = 0; i < jsrequestarray.size(); i++) {
    try {
        //current code...
    } 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) {
}

关于java - 避免在 servlet 中自动关闭 jdbc 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23724960/

相关文章:

java - 我在 MNIST 数据集中读错了什么?

mysql - CakePhp根据经纬度从数据库获取结果

Java SQL 插入多个变量

ios - 在线数据加载时暂停 Swift 代码执行?

java - Netbeans 8.0.2安装 native 库错误

java - 使用 Java 中的 N1QL 查询通过 where 子句从 Couchbase 过滤记录

java - 这种循环的复杂性是什么?

java - Null ResultSet 以及如何填充它

mysql - 无法从 Mac OS X 上的 Ballerina.io 连接到 MySQL

oracle - JDBC 瘦驱动程序的 NLS_LANG 设置?