【发布时间】:2011-08-30 07:24:28
【问题描述】:
我在我的应用程序中大量使用静态变量。现在,在应用程序状态完成后,我面临着垃圾收集的问题。声明为静态的变量永远不会被垃圾回收,我的内存很快就会耗尽。
具体问题出在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);
}
}
【问题讨论】:
-
澄清一下:您是否使用同一个连接对象来执行应用程序中的所有查询?您使用的是什么特定的连接类?
-
很难说。你能描述一下你的应用吗?是批处理作业吗?一个摇摆应用程序?一个网络应用程序?可以使用套接字连接到的独立服务器?等等……
-
@Lukas Eder:它是一个摇摆应用程序
-
当你说“每次都打开连接”时,你的意思是“每次都做一个新的连接对象”?
-
从您发布的代码中,您似乎很清楚您没有正确关闭您的资源...在我的回答中查看如何执行此操作的示例...
标签: java mysql static connection