<script type="text/javascript"></script><script type="text/javascript"></script>
<!--[if !supportLists]-->1. <!--[endif]-->从方法调用到事件处理
在hibernate当中,大部分操作最终都是转化为事件,然后由对应的事件处理函数来处理。而事件内部主要包含的就是对Session实例的引用
<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->2. <!--[endif]-->数据加载
数据加载主要在LoadEventListener的doLoad()内部完成。doLoad在加载数据时,会查询他的两级缓存。当在缓存当中找不到时,才会进行实际的数据库操作。
<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->2.1. <!--[endif]-->loadFromSessionCache
Session的缓存主要是指他的PersistenceContext,每次当SessionFactory要创建一个新的Session时,他都会为其创建一个新的PersistenceContext实例。一般情况下,Session的生命周期都非常短,所以PersistenceContext作为缓存的作用并不明显。但是在Web开发当中,我们经常会在一个Long Conversation中重用同一个Session,此时,PersistenceContext作为缓存的意义将会变得重要。
如果我们在PersistenceContext中找不到所需的实例,则他将会通过Session所关联的Interceptor来获取实例,这里就给了我们一个绕开数据库注入实例的机会。
<!--[if !supportLists]-->2.1.1. <!--[endif]-->代码
public Object getEntityUsingInterceptor(EntityKey key) throws HibernateException {
final Object result = persistenceContext.getEntity(key);
if ( result == null ) {
final Object newObject = interceptor.getEntity( key.getEntityName(), key.getIdentifier() ); if ( newObject != null ) {
lock( newObject, LockMode.NONE );
}
return newObject;
}else {
return result;
}
}
注:这段代码是主要的数据加载部分,从代码可以看到在加载数据时,首先调用的是
persistenceContext.getEntity(),当失败时则调用interceptor.getEntity()。
<!--[if !supportLists]-->2.2. <!--[endif]-->loadFromSecondLevelCache
如果我们在hibernate的配置文件中启用了cache,那么在这里他将会查询二级缓存。查询Cache的过程比较简单,首先是生成一个CacheKey,并根据这个来查询。
<!--[if !supportLists]-->2.2.1. <!--[endif]-->代码
protected Object loadFromSecondLevelCache(
final LoadEvent event,
final EntityPersister persister,
final LoadEventListener.LoadType options) throws HibernateException {
final SessionImplementor source = event.getSession();
final boolean useCache = persister.hasCache() &&
source.getCacheMode().isGetEnabled() &&
event.getLockMode().lessThan(LockMode.READ);
if (useCache) {
final SessionFactoryImplementor factory = source.getFactory();
final CacheKey ck = new CacheKey(
event.getEntityId(),
persister.getIdentifierType(),
persister.getRootEntityName(),
source.getEntityMode(),
source.getFactory()
);
Object ce = persister.getCache()
.get( ck, source.getTimestamp() );
……
if ( ce != null ) {
CacheEntry entry = (CacheEntry) persister.getCacheEntryStructure()
.destructure(ce, factory);
// Entity was found in second-level cache...
return assembleCacheEntry(
entry,
event.getEntityId(),
persister,
event
);
}
}
return null;
}
注:在操作二级缓存时,Hibernate并不是直接使用Object的ID或者hashCode来作为Key,而是使用一个自
定义的CacheKey类。而所存储的对象也不仅仅是实体本身,而是一个经过assemble的对象。
<!--[if !supportLists]-->2.3. <!--[endif]-->loadFromDatasource
这是loadFromDataSource的大致流程,主要的操作都是在类UniqueEntityLoader内部完成,前半部分主要是生成JDBC的PreparedStatement,并进行数据库查询。当结果返回以后,需要把结果先放到Session的PersistenceContext当中,这通过TwoPhaseLoad的addUninitializedEntity()和postHydrate()完成。前一个方法主要是存入一个实例,该实例只设置了id属性。后续的EntityPersister.hydrate(),用于获取其他的属性值,当所有属性值获取以后将调用postHydrate()方法更新属性值。在存入PersistenceContext以后,要操作的就是二级缓存,这通过TwoPhaseLoad.initializeEnttiy()完成。
<!--[if !vml]--><!--[endif]-->
<!--[if !supportLists]-->3. <!--[endif]-->总结:
在整个Hibernate的get操作里面,我们可以通过提供不同的Interceptor,或者直接操作他的二级缓存来改变他的整个查询策略。
了解了这点,可以部分改进我们的数据库测试。当我们的某些操作仅仅依赖于get操作时,我们可以把测试数据直接通过Interceptor或者二级缓存压入Hiberante,而不用真正的写入数据库。
相关推荐
这是react-lazy-load-image-component NPM 包的演示。 它既不打算在现实生活中使用,也不是好的编程实践的一个例子,而是要给出一个如何使用包react-lazy-load-image-component及其道具的例子。 观看现场演示: : ...
ng2-image-lazy-load, Angular2图像迟缓加载程序库 当前未维护现在,你可以尝试使用这个伟大的延迟加载 库来实现。 上面的库唯一没有的是Web工作支持- 我希望在未来的某个时候循环,或者者为tjoskar提供辅助。 ng2-...
前端项目-vanilla-lazyload,Lazyload是一个快速、轻量级和灵活的脚本,仅在图像即将进入可滚动区域的视区时才加载图像,并对渐进式JPEG图像格式提供了极好的支持。类型脚本模块定义可用。
react-lazy-load, 当子元素进入viewport时,响应它们呈现子元素 延迟加载 组件反应 延迟加载 很容易使用响应组件,它帮助你以可以预测的方式延迟加载内容。 速度快,工作在 IE8+,6KB 缩小,在默认情况下使用去抖...
前端项目-vue-lazyload,用于在Vue.js应用程序中延迟加载图像的Vue模块。
前端项目-jquery-lazyload-any,jquery插件为图像、iframe或任何东西提供了lazyload函数。
vue-l-lazyload Vue.js v2.x +的惰性加载和视图内检测插件。 演示版 或npm install vue-l-lazyload && npm run startDev进行播放! 拉请求是受欢迎的:) 执照 LGPL-V3 特征 除了Vue外,没有其他依赖项 渐进式配置 ...
本文介绍了浅谈vue-lazyload实现的详细过程,分享给大家,也给自己留个笔记 首先 ,在命令行输入npm install vue-lazyload&&cnpm install vue-lazyload 然后,在main.js里引入这个模块。 import 'VueLazyload' from ...
不必担心lazyload SEO问题,因为Google已经支持它。 我们只是。安装$ npm install hexo-lazyload-image --save用法首先从您的hexo项目的_config.yml添加配置。 lazyload : enable : true onlypost : false # ...
React Lazy Load是易于使用的React组件,可帮助您以可预测的方式推迟加载内容。 它速度很快,可在IE8 +中运行,最小化为6KB,默认情况下使用去抖动功能。 您还可以在滚动容器内使用组件,例如带有滚动条的div。 它会...
react-use-lazy-load-image使用为延迟加载的图像提供高性能解决方案,该图像不涉及滚动事件侦听器。 IntersectionObserver API仍然很新,因此较旧的浏览器可能不支持此功能,但是对于这些用例,可以使用一些不错的...
一个组件实现lazyload图片当在视窗内(或附近)时才加载
In this article I want to discuss the lazy loading mechanism provided by NHibernate. It is recommended for maximum flexibility to define all relations in your domain as lazy loadable. This is the ...
Angular-lazy-load-img.zip,发出,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入。angular的设计目的是全面解决开发人员的web应用程序工作流。
hqy-lazyload 一个轻量级的纯JavaScript脚本,用于延迟加载和多服务图像。 它可以在包括IE7 +在内的所有现代浏览器中使用。 它是用纯JavaScript编写的,因此它不依赖于jQuery之类的第三方库。 它使您可以延迟加载...
react-lazy-load-images
vue-lazyload, 在你的应用程序中,你的图像或者组件的一个 Vue.js 插件 lazyload 用于应用程序中lazyloading图像的Vue模块。 这个项目的一些目标值得注意:轻巧,功能强大,易于使用处理任何图像类型加载图像时添加...
$ npm i vue-lazyload -S CDN CDN: : < script src =" https://unpkg.com/vue-lazyload/vue-lazyload.js " > </ script > < script > Vue . use ( VueLazyload ) . . . </ script > ...
Laravel开发-eloquent-log-lazy-loading 记录(或禁用)雄辩的延迟加载关系。
图片延迟加载-juery-lazyload 很不错