我在应用程序中使用的静态变量非常多。现在应用程序状态完成后,我遇到垃圾收集问题。声明为静态的变量永远不会被垃圾收集,我的内存很快耗尽。
具体问题是关于mysql连接。我将连接变量存储在静态变量中,因此每次运行查询时都不必打开连接。这导致每次使用连接变量执行查询时都使用所有内存的问题,并且未释放使用的内存。将连接变量存储在静态变量中是一个好主意吗?当我每次尝试打开和关闭连接而没有静态变量时,我解决了内存管理问题,但应用程序的响应速度减慢了10到20倍。
您是否需要更多信息才能了解此问题?如果是,请在没有投票的情况下问我。谢谢!
修改的 这是我的连接器类
import java.sql.*;
public class connect {
public Connection conn = null;
public connect() {
try {
if (conn == null) {
String userName = "root";
String password = "password";
String url = "jdbc:mysql://localhost/pos?zeroDateTimeBehavior=convertToNull";
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url, userName, password);
System.out.println("Database connection established");
}
} catch (Exception e) {
System.err.println("Cannot connect to database server");
}
}
}
这是我存储连接的课程
public class variables {
public static connect con = new connect();
}
这个方法我用来执行查询
public class mysql_query {
public static ResultSet execute_mysql(Connection con, String sqlStatement) {
try {
//ResultSet result = null;
java.sql.Statement cs = con.createStatement();
ResultSet result = cs.executeQuery(sqlStatement);
return result;
} catch (SQLException ex) {
Logger.getLogger(mysql_query.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
public static void main(String args[]){
String sql = "SELECT * FROM pos_user_login WHERE moderator='1' AND "
+ "company_id='1'";
ResultSet rs = execute_mysql(variables.con.conn, sql);
}
}
答案 0 :(得分:5)
使用连接池而不是静态变量可能会更好......连接池维护一堆打开的连接,并在需要时将它们提供出去。应该解决你的性能问题和你的记忆问题。
答案 1 :(得分:5)
只是一个想法:您可能没有正确关闭ResultSet
和Statement
个对象。如果不这样做,MySQL JDBC驱动程序可能会保留许多您不再需要的资源。特别是ResultSet
可能非常痛苦,因为数据库游标的某些部分仍在内存中。
给你一个想法的一个例子是:
PreparedStatement stmt = null;
ResultSet rs = null;
try {
stmt = connection.prepareStatement(...);
rs = stmt.executeQuery();
}
// Close your resources in a finally block! Because the finally block
// is executed even if you have exceptions in the try block.
// If you do this a lot of times, write utility methods...
finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException ignore) {}
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException ignore) {}
}
答案 2 :(得分:0)
静态变量不会被垃圾收集,但如果你只是存储一些连接数据,它应该不是问题。你究竟存放了什么?
利玛
答案 3 :(得分:0)
那么,根据你说的来判断,你有一个对象(我们称之为Obj)类,它包含带有连接的静态变量。由于您每次创建一个新的Obj并且您在那时存储它,我认为您正在做大量的JVM无法清理的连接副本,因为它们是静态的。
您可以考虑在Model类中存储此类信息的可能性,或者删除静态标记以使JVM正确收集此对象。