В моей заявке мне нужно указать cache
данные в HashMap
или TreeMap
, это экономит много времени, потому что очень важно потребляющую задачу, чтобы каждый раз извлекать записи с DB server
и обрабатывать их.
Я также делаю профилирование этого приложения с помощью JProfiler
, и я чувствую, что, когда я получаю запись из DataBase
положить в Map
подключении к ResultSet
и Statement
не закрыто, потому что он показывает мне эти classes
занимает так много памяти.
Является ли это чем-то, что я слишком остро реагирую на это или это действительно проблема?
Кстати, я закрываю connection
в finally block
. Я отправляю его код.Кэширование данных в HashMap (соединение, ResultSet и Statement открывается после получения данных из него и ввода карты)
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;
}
метод
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 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'? –