1 在hibernate 中对jdbc 事物的封装
因为在hibernate.cfg.xml 中已经进行数据库的的连接 ,所以当session 去的数据库的连接之后,在 session.beginTrastion 时,即默认 自动调用jdbc 层的setAutoCommite(false),在最后 HibernateSessionFactory.closeSession(); 提交关闭事物。
在jdbc 的提交模式中,如果数据库连接是自动连接,那么每次执行一个sql语句之后就会进行一次提交,然后开启下一个新的事物。
2 cache 缓存机制 www.cnblogs.com/wean/archive/2012/05/16/2502724.html
hibernate 中存在一级和二级缓存机制,
首先 当在频繁的调用数据使用数据时,由于每次都从数据库中调用 似的开销较大 影响性能,所以让数据在本地保留一个镜像,下次访问直接从内存中读取。cache 位于数据库和应用程序之间,从数据库中更新数据,并给程序提供数据。
当需要使用数据时,先从一级cache 查询,在查询二级数据,如果都没有,在查找数据库,然后将这条数据如果是增删改查就放入一级cache ,或者相应的二级cache。
一级cache 由session 提供,事物级数据缓存,一个session 对应一个数据库事务或者一个程序事物。 当使用save update 来保存数据时,或者 load find list 来获取数据时得到对象时,session-cache 也会自动调用。
二级 也叫做 session -factory cache ,默认情况下是不自动调用的,保存的是 “”“ 持久性实例散装形式的数据”“”“,不被修改并且经常被读的数据。
范围进程范围或者集群范围 ,缓存被同一个进程或集群范围内所有事务共享
用户可以再单个类或类的单个集合的粒度上配置第二级缓存,
什么样的数据适合存放到第二级缓存中?
1) 很少被修改的数据
2) 不是很重要的数据,允许出现偶尔并发的数据
3) 不会被并发访问的数据
4) 常量数据
不适合存放到第二级缓存的数据?
1) 经常被修改的数据
2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
3) 与其他应用共享的数据。 为不同线程提供session 。当客户端发送一个请求时,sessionfactory 会为其提供一个session、
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
configuration 主要是负责管理hibernate 的配置信息,他主要是用于在获取sessionfactory 时候使用
session 它并不是线程安全的,一个持久化类与session 关联 然后 通过 get () load() 方法
在save()保存一个对象到数据库中的时候, 根据映射文件配置主键id生成算法
然后将对象缓存到session的内部缓冲中。
当事物提交时,清理session 对象缓存中的数据,并将新对象持久化到数据库中、
注意 在调用save方法时,并不是立即生成sql语句 而是当提交后,清理缓存之后在执行。save方法的调用只是临时的即将其保存到缓存中,在未提交之前仍然可以进行修改。