2013-05-13 23 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