【问题标题】:JSP mysql connections not closing, however in Java class it doesJSP mysql连接没有关闭,但是在Java类中它确实
【发布时间】:2018-09-11 20:38:06
【问题描述】:

我正在使用 Java、JSP、MySQL 开发一个 Web 应用程序。我无法在 JSP 中关闭 MySQL 连接,但它在 Java 类中工作。我有以下代码:

A.首先,我有一个类在运行 get 查询时获取 ResultSet,如下所示:

public static ResultSet get(String query) {
    ResultSet rs = null;
    try {
        Class.forName(JDBC_DRIVER);
        connection = DriverManager.getConnection(DB_URL + DB_NAME, USERNAME, PASSWORD);
        statement = connection.createStatement();
        rs = statement.executeQuery(query);
    } catch (ClassNotFoundException | SQLException ex) {
        ex.printStackTrace();
    } 
    return rs;
}

B.我有一个 java 类,使用上面的方法返回 MySQL 结果对象如下:

public static <E> E getByFromOtherRS(E element, List<String> columns, String tableName, String whereColumn, String whereValue, Method getFromRS) {
    try {
        String query = "Select * from " + tableName + " where " + whereColumn + "='" + whereValue + "';";
        ResultSet rs = SQLAccessor.get(query);
        while (rs.next()) {
            try {
                element = (E) getFromRS.invoke(element, rs);
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    } catch (SQLException ex) {

    } finally {
        try {
            SQLAccessor.getConnection().close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return element;
}

C.然后我在下面的课程中使用上面的内容。当我运行 main 方法时,我得到了预期的结果。另外,当我这样做时

显示类似“%onn%”的状态

在 MySQL shell 中,Threads_connected 的数量与运行代码之前相同。

public static void main(String[] args) {
    Gson gson = new Gson();
    System.out.println(gson.toJson(getUserByUsername()));
}

public static User getUserByUsername() {
    User user = Accessor.getByFromOtherRS(new User(), Accessor.getColumns("user"), "user", "username", "linda", Accessor.getFromRSMethod(UserAccessor.class));
    return user;
}

D.问题出在 JSP 上。我在 JSP 中有以下代码。我正确地收到了用户的电子邮件,但问题出在 MySQL - 当我运行与上面相同的命令时,Threads_connected 的数量现在多了 17 个。

    <%

    User user = DatabaseAccessor.getUserByUsername();
    System.out.println(user.getEmail());
%>

在这方面的任何帮助将不胜感激。

【问题讨论】:

  • 请发帖minimal reproducible example。您当前的代码不完整(并且难以理解)。您可能还想考虑学习更现代的技术,因为在 JSP 中使用代码片段在十多年前就已经过时了。
  • 我的建议是丢弃所有代码并重新启动。不使用连接池会给您带来性能问题。但最糟糕的是拥有一个非线程安全的静态 Connection 属性;想象一下,如果两个线程在其中一个调用 SQLAccessor.getConnection().close() 之前调用 get 方法会发生什么。
  • 当然,catch (SQLException ex) { //empty } 不是发现运行时错误的好方法... -.-

标签: java mysql jsp jdbc


【解决方案1】:

看不到完整代码...

鉴于代码 sn-p,最好在 finally 块中对连接发出“关闭”以确保它被关闭。

finally {
    if (connection!=null) { connection.close();}
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2020-09-16
    • 2011-05-08
    相关资源
    最近更新 更多