【发布时间】: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 }不是发现运行时错误的好方法... -.-