내 애플리케이션에서 cache
데이터가 HashMap
또는 TreeMap
이므로 매우 시간이 많이 걸리기 때문에 많은 시간을 절약 할 수 있습니다. DB server
에서 매번 레코드를 가져와 처리하는 작업을 수행합니다.
는 또한 JProfiler
를 사용하여이 응용 프로그램의 프로파일 링을하고있는 중이 야 그리고 내가 DataBase
에서 레코드를 얻고 때이 classes
너무 많은 메모리를 가지고 저를 보여주고 있기 때문에 폐쇄되지 않은 ResultSet
및 Statement
에 Map
연결에 넣어 생각합니다.
이 문제는 내가 과도하게 반응하거나 실제로 문제가되는 것입니까?
그런데 connection
을 닫고 있습니다. finally block
입니다. 나는 그것의 코드를 게시하고있다.HashMap의 데이터 캐싱 (Connection, ResultSet 및 Statement가 데이터를 가져 와서 Map에 넣은 후 열림)
HMDBUtil.close() 메소드
public static void close(Connection con, Statement stmt, ResultSet rs)
throws SomeException {
if (log.isDebugEnabled())
log.debug("Invoked");
close(rs);
close(stmt);
close(con);
if (log.isDebugEnabled())
log.debug("Leaving");
}
모든 연결 닫습니다 사용되는 모든 가까운 방법
public Map someFunction() throws SomeException{
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
String sql=null;
Map <String,String> testMap=new TreeMap<String, String>();
try {
con=HMDBUtil.getConnection();
if(cacheSize==0) {
sql = "SELECT SOMETHING FROM SOMEWHERE";
}else {
sql = "SELECT SOMETHING FROM SOMEWHERE_ELSE where rownum<"+cacheSize;
}
stmt=con.createStatement();
stmt.setFetchSize(100000);
rs=stmt.executeQuery(sql);
long count=0;
while(rs.next()) {
testMap.put(rs.getString(1).trim(), rs.getString(2));
count++;
}
} catch (SQLException e) {
log.fatal("SQLException while fetching Data",e);
throw new SomeException("SQLException while fetching Data",e);
}finally {
HMDBUtil.close(con, stmt, rs);
}
return testMap;
}
--- - 설정
public static void close(Connection con) throws SomeException {
try {
if (log.isDebugEnabled())
log.debug("Invoked");
if (con != null) {
con.close();
con = null;
}
if (log.isDebugEnabled())
log.debug("Leaving");
} catch (SQLException e) {
log.fatal("SQLException while Closing connection ", e);
throw new SomeException("SQLException while Closing connection ",
e, false, true);
}
}
public static void close(Statement stmt) throws SomeException {
try {
if (log.isDebugEnabled())
log.debug("Invoked");
if (stmt != null) {
stmt.close();
stmt = null;
}
if (log.isDebugEnabled())
log.debug("Leaving");
} catch (SQLException e) {
// log.error("Exception while Closing statement ", e);
log.fatal("SQLException while Closing statement ", e);
throw new SomeException("SQLException while Closing statement ", e, false, true);
}
}
public static void close(ResultSet rs) throws SomeException {
try {
if (log.isDebugEnabled())
log.debug("Invoked");
if (rs != null) {
rs.close();
rs = null;
}
if (log.isDebugEnabled())
log.debug("Leaving");
} catch (SQLException e) {
log.fatal("SQLException while Closing rs", e);
throw new SomeException("SQLException while Closing rs", e, false, true);
}
}
더 유연하고 효율적인 방식으로 캐싱 API를 사용하면 어떨까요? –
그러나 다시 질문은 내 프로파일 러가 이러한 DataBase 클래스를 보여주는 이유입니다. 심지어 내가 닫았습니다. –
'HMDBUtil.close' 메소드를 보여줄 수 있습니까? –