Hibernate4中session.createQuery的list查询缓存同步问题

qq_24344261 2016-11-16 05:22:46
各位大神:
关于createQuery的缓存问题,代码如下
测试代码,期间在程序执行过程中,从数据库底层直接修改了数据,模拟其他线程操作数据库,10秒过后,虽然发出了两次查询,但数据依然是缓存的数据。翻阅了很多帖子,求问如何解决此类缓存与数据库同步的问题?

@Test
public void test_List() throws InterruptedException
{ // 第一次
String hql = "from Player";
Query query = session.createQuery(hql);
List<Player> plist = query.list();
if (plist.size() > 0)
System.out.println("数据库记录数为 " + plist.size());
for (Player p : plist)
{
System.out.println(p.getName());
}
Thread.sleep(10000);
// 第二次
Query query4 = sessionFactory.openSession().createQuery(hql);
List<Player> plist4 = query4.list();
if (plist4.size() > 0)
System.out.println("数据库记录数为 " + plist4.size());
for (Player p : plist)
{
System.out.println(p.getName());
}

执行结果
Hibernate: select player0_.playerid as playerid1_0_, player0_.address as address2_0_, player0_.name as name3_0_, player0_.phone as phone4_0_ from player player0_
数据库记录数为 9
略。。。
yyyyy1233333333333333
Hibernate: select player0_.playerid as playerid1_0_, player0_.address as address2_0_, player0_.name as name3_0_, player0_.phone as phone4_0_ from player player0_
数据库记录数为 9
略。。。
yyyyy1233333333333333 此处应该为修改数据库后的2323232,但仍然是yyyy1233333333333


数据库配置
<!DOCTYPE hibernate-configuration PUBLIC  
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/XXXXXX?useUnicode=true&characterEncoding=utf8
</property>
<!-- 数据库连接设置 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<!-- show_sql 生成SQL语句输出到日志以供调式 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">false</property>
<property name="hibernate.use_sql_comments">false</property>
<!-- SQL dialect 方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- 指定session通过当前执行的线程来跟踪和界定 -->
<property name="hibernate.current_session_contecxt_class" >
thread
</property>

<!-- 添加实体类的映射文件 <mapping resource="XXXXX.hbm.xml" /> -->
<!-- <mapping resource="com/aikan/bean/player.hbm.xml"/>-->
<mapping class="com.aikan.bean.Player" />
</session-factory>

</hibernate-configuration>


测试方法的前后处理

@Before
public void setUp() throws Exception
{
sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
logger.error("【初始化session】");
System.out.println("");
}

@After
public void end()
{
session.close();
sessionFactory.close();
logger.error("【session已关闭】");
}

...全文
281 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_24344261 2016-11-16
  • 打赏
  • 举报
回复
// 第二次 Query query4 = sessionFactory.openSession().createQuery(hql); 第二次我从新获取的session,依然无效,是我配置有问题吗? 哦对了 暂时不考虑其他框架的包装,例如spring等等

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧