java中的静态变量问题

时间:2011-08-30 07:24:28

标签: java mysql static connection

我在应用程序中使用的静态变量非常多。现在应用程序状态完成后,我遇到垃圾收集问题。声明为静态的变量永远不会被垃圾收集,我的内存很快耗尽。

具体问题是关于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);
  }
}

4 个答案:

答案 0 :(得分:5)

使用连接池而不是静态变量可能会更好......连接池维护一堆打开的连接,并在需要时将它们提供出去。应该解决你的性能问题和你的记忆问题。

答案 1 :(得分:5)

只是一个想法:您可能没有正确关闭ResultSetStatement个对象。如果不这样做,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正确收集此对象。