- 浏览: 27061 次
最新评论
文章列表
适用于线程间的简单同步:在不使用线程池(ThreadPoolExecutor)的情况下,而且线程不需要返回值(即线程继承自Runnable而非Callable接口)thread.join()应该是让当前线程block住,等被依赖的thread执行完之后,再继续执行
ClassLoader
- 博客分类:
- JavaSE
一、什么是ClassLoader?
大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能 ...
OutOfMemory种类和简单分析
- 博客分类:
- JavaSE
1) 永久区溢出 Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
PermGen space = Permanent Generation space
永久保存区域主要存放放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域(包括常量池: 静态变量),它和 ...
get()和load()区别
- 博客分类:
- Hibernate
相同:都是根据ID查找记录区别:get()先在一级缓存中查找,再从二级缓存中找,都没有的话查询数据库
对于load(), 具体要看lazy为true或者false了
1. lazy=true
先在一级缓存中查找对应ID, 如存在则返回; 如不存在则建立实体的代理对象(该对象为该实体类的子类,由CGLib动态生成并被class loader加载)
等到具体使用该对象的时候,在查询二级缓存,如不存在进而查询数据库
如果DB中存在相应记录则返回,如果没有则返回ObjectNotFoundException
2. lazy=false
和get() ...
一级缓存:事务级缓存 或 Session级缓存 其实质是由Hibernate自动维护的一个map,根据id来缓存实体对象(不存放普通属性的查询) ***不能跨sesseion/transaction访问 无论是list(), load()还是iterate,只要读出的是对象, 都会自动填充一级缓存 但是list()本身不去使用缓存, iterate是先去DB中select id出来,在一个一个load(),如果缓存中有就直接返回,没有的话再去数据库中查询 二级缓存 SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存,可以跨session访 ...