Session session = sessionFactory.openSession(); User user1 = (User) session.load(User.class, new Integer(1)); User user2 = (User) session.load(User.class, new Integer(1)); System.out.println(user1 == user2); session.close();第二次查询数据时,由于在快取中找到数据对象,于是直接返回,这与第一次查询到的数据对象是同一个实例,所以会显示true的结果。
Session session = sessionFactory.openSession();
User user1 = (User) session.load(User.class, new Integer(1));
session.evict(user1);
User user2 = (User) session.load(User.class, new Integer(1));
System.out.println(user1 == user2);
session.close();
由于user1所参考的对象被从快取中移去了,在下一次查询时,Session在Map容器中找不到对应的数据,于是重新查询数据库并再封装一个对象,所以user1与user2参考的是不同的对象,结果会显示false。Session session = sessionFactory.openSession();
User user1 = (User) session.load(User.class, new Integer(1));
session.clear();
User user2 = (User) session.load(User.class, new Integer(1));
System.out.println(user1 == user2);
session.close();
同样的道理,这次也会显示false。Session session1 = sessionFactory.openSession();
User user1 = (User) session1.load(User.class, new new Integer(1));
session1.close();
Session session2 =sessionFactory.openSession();
User user2 = (User)session2.load(User.class, new Integer(1));
session2.close();
System.out.println(user1 == user2);
第一个Session在关闭后,快取也关闭了,在第二个Session的查询中并无法用到第一个Session的快取,两个Session阶段所查询到的并不是同一个对象,结果会显示false。Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
while(....) { // 大量加载对象时的循环示意
....
session.save(someObject);
if(count % 100 == 0) { // 每100笔资料
session.flush(); // 送入数据库
session.clear(); // 清除快取
}
}
tx.commit();
session.close();
在SQL Server、Oracle等数据库中,可以在Hibernate设定文件中设定属性hibernate.jdbc.batch_size来控制每多少笔数据就送至数据库,例如:....
<hibernate-configuration>
<session-factory>
....
<property name="hibernate.jdbc.batch_size">100</property>
....
</session-factory>
<hibernate-configuration>
在MySQL中则不支持这个功能。