發表於 程式分享

spring + hibernate db效能調整遇到的問題

因為hibernate每次存取DB的速度過慢,一次查詢竟然需要5秒鐘,

經查發現我寫的程式碼在初始化spring bean Dao以下4行的前3行就是問題的所在:

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.load(new ClassPathResource(“../applicationContext.xml"));
ctx.refresh();
waServiceDao = ctx.getBean(“WAServiceDao",WAServiceDao.class);

故將前3行改為static的方式,不要每次存取DB都做初始化

private static GenericXmlApplicationContext ctx = null;
static {
ctx = new GenericXmlApplicationContext();
ctx.load(new ClassPathResource(“../applicationContext.xml"));
ctx.refresh();
}

但竟變成每次查詢都有db cache,明明資料庫已異動,但怎麼查都是舊資料,上網google發現hibernate cache有level 1及2,level 1是session level,level 2是application level,原本一直往level 2的方向查,但怎麼調整還是有cache (applicationContext.xml加上如下指令也不work)

<prop key="current_session_context_class">org.hibernate.context.ManagedSessionContext</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>

後來想到有可能是卡在level 1 – session cache,全部共用hibernate同一個session,故調整如下紅字,就沒cache了~

protected Session getSession() {
if (session == null || session.isOpen() == false)
session = sessionFactory.openSession();
else
        session.clear();
return session;
}

發表留言