2011-10-24 63 views
1
數據庫連接

我在我的數據庫類下面的方法返回給定的SQL語句一個結果:關閉Java中

public static ResultSet sqlStatement(String query) throws SQLException{ 
    ResultSet result = null; 
    Connection conn = connect(); 
    Statement newStatement = conn.createStatement(); 
    result = newStatement.executeQuery(query); 
    conn.close(); 
    return result; 
} 

我想才返回結果集關閉與數據庫的連接,但它拋出以下異常:

java.sql.SQLException: out of memory 

我是一個Java小白和試驗,所以任何的幫助深表感謝。

+0

通過-Xmx啓動參數增加內存,或者不返回儘可能多的行 - 你知道有多少你查詢返回? –

+0

你使用了哪個數據庫?你可以發佈你的查詢嗎?它看起來好像是數據庫本身耗盡內存 –

+0

它的表格大約有4列和3行,表述爲「SELECT * FROM table」。我很確定這不會導致內存問題。 – Alex

回答

1

在我過去的經驗(沒有文件或任何東西),我就明白了「的ResultSet」像C的指針我敢打賭,當你執行你的查詢,將緩存從數據庫中的一些行..

因此,如果您關閉連接,然後嘗試使用結果集,所有這些緩存的結果集沒有正確的信息和獲取下一個緩存等。因此,它會拋出內存異常..

使用那些在Java反正有道..

Connection con... 
try{ 
    create connection 
    execute query 
    use your resultset completely.. 
}catch(...){ 
}finally{ 
    close connection; 
} 

希望這將有助於

+0

非常感謝您的幫助,我想我必須在方法中創建一個ArrayList並返回此。不知道如何維護表結構... – Alex

1

conn.close()置於finally塊中,以便在引發異常時執行事件。

+2

這不太可能是因爲內存不足異常 –

0

始終,始終,始終關閉您的數據庫資源在finally塊!

我懷疑你的邏輯會按原樣工作。 ResultSet僅在連接打開時可用。您需要在之前處理整個ResultSet 關閉連接。

+0

從JavaDoc看來,如果ResultSet所產生的Statement被關閉,ResultSet會關閉。這在文檔中提到了ResultSet和Statement的close()方法。但是,沒有關於關閉連接的信息。只要聲明未關閉,關閉連接可能是安全的。 –

+0

好的。有沒有辦法將結果集轉換成java對象,保留表結構?我想我可以用數組列表的方式解決問題。 – Alex

+1

@G_H,no:關閉連接會關閉由該連接打開的語句,因此也會關閉結果集。它沒有在文檔中明確提及,但它在Connection上提到:'SQL語句被執行並且結果在連接的上下文中返回'和Connection。close():'立即釋放此Connection對象的數據庫和JDBC資源,而不是等待它們被自動釋放'。這意味着關閉連接時語句也會關閉。 –

0

除了關閉finally塊中的資源外,還必須關閉PreparedStatementResultSet。事實上,你不應該返回ResultSet並保持它打開太久。相反,您可以將其讀入某種中介數據存儲庫,例如List<Object[]>

在另一方面,你沒有得到一個java.lang.OutOfMemoryError,所以有可能是你的數據庫本身是跑出來的內存