Я работаю с java.sql PreparedStatements, и мне было интересно узнать следующее:
В Java является передачей по значению, Черт! , следующее задано какПример соглашений Java Pass-By:
public void foo(Dog d) {
d = new Dog("Fifi"); // creating the "Fifi" dog
}
Dog aDog = new Dog("Max"); // creating the "Max" dog
// at this point, aDog points to the "Max" dog
foo(aDog);
// aDog still points to the "Max" dog
В моем коде это выглядит следующим образом (псевдокод полу-Java):
public void method() {
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
rs = executeStatement(sql-string, pstmt, conn, vars...);
} catch (....) { /* error-handling */ }
/// do stuff with the data
rs.close();
}
, где executeStatement
- это (что-то похожее на следующее:
ResultSet executeStatement(String sql, PreparedStatement pstmt, Connection conn, Object[] vars...) {
pstmt = conn.prepareStatement(sql);
/// set pstmt variables...
ResultSet rs = pstmt.execute();
return rs;
}
Из того, что я понимаю в соглашениях о передаче Java, мне бесполезно делать что-либо с pstmt в основном коде, так как он все равно будет нулевым, даже после вызоваexecuteStatement
.Однако, поскольку закрытие PreparedStatement
также закрывает ResultSet, я знаю, что PreparedStatement
, созданный в executeStatement
, не закрывается при обработке ResultSet.
Означает ли это, что существуетутечка памяти здесь?(Мое понимание утечек памяти и того, как их можно диагностировать / исправить, в лучшем случае нечеткое).Есть ли способ, которым я мог бы структурировать это по-другому, чтобы избежать утечки, но продолжать иметь метод, который может выполнить строку SQL и вернуть ResultSet абстрактным способом?