2017-01-23 35 views
1
PreparedStatement ps = null; 
ResultSet rs = null; 
try { 
    ps = getConnection().prepareStatement(sql); 
    if (ps != null) { 
     ps = doSomething(ps); 
     ps.executeUpdate(); 
    } 
} finally { 
    if (ps!=null) { 
     ps.close(); 
    } 
} 

private PreparedStatement doSomething(PreparedStatement ps) { 
    ps.setString(1, "test"); 
} 

「執行更新只被調用一次」。字符串「sql」在不同的條件下是不同的,並且會有不同數量的綁定變量,方法doSomething在子類中有不同的實現來設置綁定變量。是否有一個資源(準備語句)在此代碼中泄漏?

Eclipse抱怨說這是潛在的泄漏,因爲重新分配準備好的語句。這裏有資源泄漏嗎?

+1

(1)考慮試用資源。 (2)爲什麼'doSomething'需要返回語句,而不是像本例中那樣修改它? – chrylis

+0

這是因爲doSomething被覆蓋以在不同的子類中做不同的事情。 – gaenshr

+1

這並不回答這個問題。它做了什麼不能是'空白'? – chrylis

回答

-1

在行:

ps = doSomething(ps); 

ps原始值可能進行,這取決於它是否被doSomething保持下降。

總而言之,Java保留垃圾收集器下的所有東西,所以沒有什麼像「內存泄漏」。稱它掉落或丟失。

+1

你絕對可以有一個內存泄漏,例如一個失控的緩存,Java可以泄漏資源,如數據庫連接。 – chrylis

+0

@chrylis好的,本地人是另一回事,我的意思是純Java,沒有Sun的內部或本地流 –

+0

JDBC連接*是*純Java。 – chrylis