2013-05-13 24 views
1

我正在制定一个时间表调度程序作为最后一年的项目。在过去的两天里,我得到一个OutOfMemoryException。我已经阅读了很多关于异常的内容,并试图增加通过-Xms和-Xmx选项分配的内存。这些似乎都不适合我。OutOfMemoryError

我评测的项目,发现的最大空间是由HashMap的对象消耗,也可以通过MySQL连接。我已经使用一个静态的连接如下

public final class Connector 
{ 
private static Connector connector; 
Connection con; 
String driverName; 
String dbname; 
String username; 
String password; 
String connString; 

private Connector(){ 
    driverName = "com.mysql.jdbc.Driver"; 
    dbname = "timegen"; 
    username = "root"; 
    password = "root"; 
    connString = "jdbc:mysql://localhost:3306/" + dbname; 
    openConnection(); 
} 

public void openConnection(){ 
    try{ 
     Class.forName(driverName); 

     con = DriverManager.getConnection(connString, username, password); 
    } catch(Exception e){ 
     System.out.println(e); 

    } 
} 


public void terminateConnection(){ 
    try{ 
     con.close(); 
    } catch(Exception e){ 
     System.out.println(e); 
    } 

} 

public static Connector createConnection() { 

    if (connector == null){ 
     connector = new Connector(); 
    } 

    return connector; 
} 

public Connection getCon() { 
    return con; 
} 
public String getConnString() { 
    return connString; 
} 

public void setConnString(String connString) { 
    this.connString = connString; 
} 

} 

。这是一个名为MasterData类,其通过访问数据库

public class MasterData{ 
    static Connector con; 
    static Statement st; 

    MasterData(){ 
    try { 
     con = Connector.createConnection(); 
     st = con.getCon().createStatement(); 
    } catch (SQLException ex) { 
     Logger.getLogger(MasterData.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    } 

    public Statement createStatement() throws SQLException{ 
     Statement st = con.getCon().createStatement(); 
     return st;  
    } 
    public void closeConnection(){ 
     con.terminateConnection(); 
    } 


} 

使用一个类的实例的所有其他类扩展码这

public class Teacher extends MasterData{ 

int teacherid; 
String teachername; 
String subject; 
String post; 

@Override 
public String toString() { 
    return "Teacher{" + "teacherid=" + teacherid + ", teachername=" + teachername + ", 
post=" + post + ", subject=" + subject + '}'; 
} 



public Teacher(int teacherid, String teachername,String subject, String post) { 
    this.teacherid = teacherid; 
    this.teachername = teachername; 
    this.subject = subject; 
    this.post = post; 
} 

public Teacher(String teachername) { 
    this.teachername = teachername; 
} 

public Teacher(){} 

public String display(){ 

    String s ="\nTeacher name = " + teachername 
      + "\nSubject = " + subject 
      + "\nPost = "+post; 
    return s; 
} 


public ArrayList<String> getSubjectTeachers(String s){ 
    ArrayList<String> teachers = new ArrayList<String>(); 
    try{ 
     ResultSet rs = st.executeQuery("select teachername from teacher where 
subject='"+s+"';"); 
     while(rs.next()){ 
      teachers.add(rs.getString(1)); 
     } 
    }catch(Exception e){e.printStackTrace();} 

    return teachers; 
} 

public List<Teacher> getFree() 
{ 
    List<Teacher> lst = new ArrayList<Teacher>(); 
    try{ 
     ResultSet rs = st.executeQuery("select * from teacher where teacherid not 
in(select classteacher from division where classteacher!=null)"); 
     while(rs.next()) 
     { 
      lst.add(new 
Teacher(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4))); 
     } 

    }catch(Exception e){e.printStackTrace();} 
    return lst; 
} 




public int getTeacherid() { 
    return teacherid; 
} 

public void setTeacherid(int teacherid) { 
    this.teacherid = teacherid; 
} 

public String getTeachername() { 
    return teachername; 
} 

public void setTeachername(String teachername) { 
    this.teachername = teachername; 
} 


public String getSubject() { 
    return subject; 
} 

public void setSubject(String subject) { 
    this.subject = subject; 
} 

public String getPost() { 
    return post; 
} 

public void setPost(String post) { 
    this.post = post; 
} 

public boolean checkDuplicate(){ 
    try{ 
     ResultSet rs = st.executeQuery("select * from teacher where 
teachername='"+teachername+"';"); 
     if(rs.next()) 
      return true; 

    }catch(Exception e){e.printStackTrace();} 

     return false; 

} 

public boolean insert(){ 
    int t; 
    try{ 
     t = st.executeUpdate("insert into teacher(teachername,subject,post)  
values('"+teachername+"','"+subject+"','"+post+"');"); 
     if(t!=0) return true; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
     return false; 

    } 
    return false; 
} 


public boolean delete(){ 
    int t; 
    try{ 
     new AssignedTeacher().deleteTeacher(teacherid); 
     t = st.executeUpdate("delete from teacher where teacherid="+teacherid+";"); 
     if(t!=0) return true; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
     return false; 

    } 
    return false; 
} 

public boolean update(){ 
    int t; 
    try{ 
     t = st.executeUpdate("update teacher set teachername = '"+teachername+"',     
subject='"+subject+"', post='"+post+"' where teacherid="+teacherid+";"); 

     if(t!=0) return true; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
     return false; 

    } 
    return false; 
} 

} 

我的意图是为整个程序创建一个单一的静态连接。它似乎运作良好。但是这是问题的可能原因吗?

+0

@SotiriosDelimanolis:我没有得到一个空指针exception.The整个程序运作良好,直到我增加了一些功能。然后我开始出现OutOfMemory异常 – AartiRajan 2013-05-13 21:07:14

+0

这个getter是否简单地返回'Connector'的'Connection con'字段? – 2013-05-13 21:09:04

+0

是啊,就是这样.. – AartiRajan 2013-05-13 21:14:02

回答

0

它看起来像你创建了太多Connection秒。

您可以验证您的openConnection方法中的连接is valid您也可以使用一些Connection Pool

编辑:

在我看来,你已经尽力实现Active record pattern因为有insertdeleteupdategetSubjectTeachers方法。无论如何,它并不总是一个好主意extend Teacher from MasterData。作为副作用,将为每个MasterData的实例创建新的连接。 static Connection con将被重新分配给新对象,但之前的连接将不会关闭。与MasterData#createStatement一样。

此外,作为greedybuddha指出,确保您HashMap没有以同样的方式重新分配。

+0

如果我每次查询数据库时都打开和关闭连接,会有帮助吗?而不是使用这两个类? – AartiRajan 2013-05-13 21:06:05

+0

这不是真的有必要。你允许重复使用一些外部罐子吗?如果是这样的话,有几个好的实现可用,例如[C3PO](http://www.mchange.com/projects/c3p0/index.html) – lifus 2013-05-13 21:15:24

+0

我会试试看。谢谢 – AartiRajan 2013-05-13 21:29:26

0

尝试设置这些参数,以及:

-XX:PermSize 
-XX:MaxPermSize 
+0

看起来她已经尝试过_并尝试增加通过-Xms和-Xmx options_分配的内存。随后的'OutOfMemoryError'只是一个时间问题,因为代码中存在一些问题。 – lifus 2013-05-13 23:49:30

+0

另外,我不确定它是'PermGen space'错误,因为'static'对象仍然存储在堆中。 – lifus 2013-05-14 00:01:38