Hibernate 3.2.5 can和xB4;t禁用休眠缓存

Hibernate 3.2.5 can和xB4;t禁用休眠缓存,hibernate,caching,java-6,Hibernate,Caching,Java 6,我在尝试禁用hibernate缓存时遇到很多问题。我将Hibernate3.2.5与ZK框架和DB2数据库一起使用。Java Web版本是6。 我所做的只是: 1-禁用二级缓存 <property name="hibernate.cache.use_second_level_cache">false</property> <property name="hibernate.cache.use_query_cache">false</prope

我在尝试禁用hibernate缓存时遇到很多问题。我将Hibernate3.2.5与ZK框架和DB2数据库一起使用。Java Web版本是6。 我所做的只是:

1-禁用二级缓存

  <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="hibernate.cache.use_query_cache">false</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>     
<property name="cache.region_factory">org.hibernate.cache.impl.NoCachingRegionFactory</property>
4-在重新启动会话时,会发生这种情况

public static void reOpenSession() {
    clearSession();
    // flushSession();
    clearSession();
    closeSession();
    getSession();
    clearSession();
  }
5-当我获取列表时,我使用setCacheMode(CacheMode.REFRESH),如中所示

尽管如此,有时在表中进行一些更新之后,我会读取旧的数据值,即使它们在数据库中是正确的。我是否缺少禁用完整缓存的内容?有一些结果,我不能向用户显示错误的数据,因为它们会弄乱应用程序

编辑: 也许我的刀有什么问题

公共类DAO{

private static final ThreadLocal session = new ThreadLocal();

public DAO(Class classe) {

}

public static Session getSession() {
    Session session = (Session) DAO.session.get();
    if (session == null) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
        //session.getSessionFactory().evict(EduProduto.class);
        session.setCacheMode(CacheMode.REFRESH);
        session.setFlushMode(FlushMode.ALWAYS);
        DAO.session.set(session);
        //Messagebox.show("CAIU AQUI"); 
        //System.out.println("CAIU AQUI");
    }

    return session;
}

public static void clearSession() {
    getSession().clear();
}

public static boolean isTransactionOpen() {
    if (getSession().getTransaction().isActive()) {
        return true;
    }
    return false;
}

public static void abrirTransaction() {
    if (!isTransactionOpen()) {
        getSession().beginTransaction().begin();
    }
}

public static void commitTransaction() {
    flushSession();
    getSession().getTransaction().commit();

}

public static void rollBack() {
    getSession().getTransaction().rollback();
}

public static void closeSession() {
    getSession().close();
    DAO.session.set(null);
}

public static void flushSession() {
    getSession().flush();
}

public static void reOpenSession() {
    //  clearSession();
    // flushSession();
    clearSession();
    closeSession();
    getSession();
    // clearSession();
    //    flushSession();
}

}

退出方法更改为分离状态。表示从会话中删除对象,而不是使用保存方法。 我认为以下陈述是问题的根源

DAO.getSession().evict(clazz.getClass().getCanonicalName());

删除此项,替换为save(),您的问题将得到解决

例如:

session.beginTransaction();
        Stock stock = new Stock();

        stock.setStockCode("k0923");
        stock.setStockName("elias");

        session.save(stock);

经过进一步搜索,我找到了问题的根源: 我改变了方法

私有静态最终ThreadLocal会话=新ThreadLocal()

现在是:

private Session session;


 public Session getSession() {
    if (session == null || !session.isOpen()) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
    }
    return session;
}

默认情况下,二级缓存将被禁用。你能提供你的配置XML吗?我更新了文件。我正在尝试一些其他的东西,但仍然得到旧的数据我可以看到你没有使用任何二级缓存。所以说禁用缓存毫无意义。使用setCacheMode(CacheMode.REFRESH)的任何特定原因;我想你可以删除它。我使用了setCacheMode(CacheMode.REFRESH);以尝试清除缓存,但仍不起作用。我想我会像你说的那样删除它。我删除了逐出方法。仍在获取旧数据。使用save方法是什么意思?我应该删除逐出还是用save替换它们?我尝试使用save方法,但我的问题仍然没有解决。classe=(T)DAO.getSession().merge(clazz);DAO.flushSession();DAO.getSession().refresh(classe);salvarLogGeral(clazz,(EduPadrao)级,“S”);DAO.getSession().save(classe);//DAO.getSession().execut(clazz);//DAO.getSession().recit(clazz.getClass().getCanonicalName());提交交易();实际上我使用的是合并而不是保存。有什么问题吗?我删除了逐出(对象),我只使用合并(对象);现在
<?xml version="1.0" encoding="UTF-8"?>
    <property name="dialect">org.hibernate.dialect.DB2Dialect</property>
    <property name="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>


    <property name="hibernate.connection.url">jdbc:db2://localhost:50000/database</property> 
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">mypassword</property>  


    <property name="hibernate.current_session_context_class">managed</property>

    <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="hibernate.cache.use_query_cache">false</property>
    <property name="cache.region_factory">org.hibernate.cache.impl.NoCachingRegionFactory</property>


    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>     

    <property name="show_sql">true</property>

   <property name="hibernate.connection.isolation">2</property>


    <mapping class="EduProduto"/>
oUsuario"/>

</session-factory>
   public static Session getSession() {
    Session session = (Session) DAO.session.get();
    if (session == null) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
        session.getSessionFactory().evict(EduProduto.class);
        session.setCacheMode(CacheMode.REFRESH);
session.setFlushMode(FlushMode.ALWAYS);
        DAO.session.set(session);
        //Messagebox.show("CAIU AQUI"); 
        //System.out.println("CAIU AQUI");
    }

    return session;
}
private static final ThreadLocal session = new ThreadLocal();

public DAO(Class classe) {

}

public static Session getSession() {
    Session session = (Session) DAO.session.get();
    if (session == null) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
        //session.getSessionFactory().evict(EduProduto.class);
        session.setCacheMode(CacheMode.REFRESH);
        session.setFlushMode(FlushMode.ALWAYS);
        DAO.session.set(session);
        //Messagebox.show("CAIU AQUI"); 
        //System.out.println("CAIU AQUI");
    }

    return session;
}

public static void clearSession() {
    getSession().clear();
}

public static boolean isTransactionOpen() {
    if (getSession().getTransaction().isActive()) {
        return true;
    }
    return false;
}

public static void abrirTransaction() {
    if (!isTransactionOpen()) {
        getSession().beginTransaction().begin();
    }
}

public static void commitTransaction() {
    flushSession();
    getSession().getTransaction().commit();

}

public static void rollBack() {
    getSession().getTransaction().rollback();
}

public static void closeSession() {
    getSession().close();
    DAO.session.set(null);
}

public static void flushSession() {
    getSession().flush();
}

public static void reOpenSession() {
    //  clearSession();
    // flushSession();
    clearSession();
    closeSession();
    getSession();
    // clearSession();
    //    flushSession();
}
DAO.getSession().evict(clazz.getClass().getCanonicalName());
 session.getSessionFactory().evict(EduProduto.class);
session.beginTransaction();
        Stock stock = new Stock();

        stock.setStockCode("k0923");
        stock.setStockName("elias");

        session.save(stock);
public static Session getSession() {
    Session session = (Session) DAO.session.get();
    if (session == null) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
        //session.getSessionFactory().evict(EduProduto.class);
        session.setCacheMode(CacheMode.REFRESH);
        session.setFlushMode(FlushMode.ALWAYS);
        DAO.session.set(session);
        //Messagebox.show("CAIU AQUI"); 
        //System.out.println("CAIU AQUI");
    }

    return session;
}
private Session session;


 public Session getSession() {
    if (session == null || !session.isOpen()) {
        session = HibernateUtil.getInstance().getSessionFactory().openSession();
    }
    return session;
}