包含javaevict的词条
今天给各位分享javaevict的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java 需要加注释。
- 2、JAVA中hibernate的缓存怎么解决?
- 3、java相关,关于hibernate中判断持久化对象的状态的问题,谢谢!
- 4、Java批量数据库操作,如何性能优化
- 5、JAVA Hibernate工作原理及为什么要用
- 6、聊聊hikari连接池的maxLifetime属性及evict操作
java 需要加注释。
注释的很详细了 还有什么不明白的可以给我留言
此外给楼主点建议,打好基础,这套代码乱七八糟,写的太烂了。不适合用来学习,要学习就找好代码,不然很容易被误导。
/**
*此类事dao层中的一个类 使用hibernate完成持久层的控制
*继承自抽象类AbstractDAO并实现了抽象类的相关方法
*主要包括获取图书列表,获取图书记录,添加图书信息,添加和更新图书信息,
*获取图书信息和判断判断是否可以删除图书信息这几个功能
*/
public class BookDAO extends AbstractDAO {
//无参数构造方法
public BookDAO() {
}
/**治理竟然加了个主方法,恕在下愚钝,除了添乱之外想不出别的解释
*也可能是测试阶段用来测试 然后忘记删除了
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
/**
* 获取图书信息 根据关键字使用模糊查询 得到包含关键字的图书信息列表
*如果输入的book对象的bookName属性为控制或者空字符串 默认查询所有图书信息
*@pamar book 图书信息的持久化对象 应该对应数据库中的一张表bookinfo
*@pamar pager 应该是一个封装了分页逻辑的对象
*@return List 返回的数据库中包含book中关键字(图书名)的图书信息列表
*默认情况返回数据库中所有图书的信息,
*这里返回值设计成ListBookinfo会更好 当然由于集成的抽象类的限制改不了(抽象类设计的不好 )
**/
public List getBookList(Bookinfo book,Pager pager) throws DataAccessException{
//hql语句 默认情况下 返回数据库中所有的图书信息
String hql = " from com.jframe.biz.book.Bookinfo book" +
" where 1=1 ";
/*如果book名存在且不是空串
*重新构造hql语句 添加限制条件 返回book名字的模糊查询结果集
*/
if(book.getBookName()!=null!"".equals(book.getBookName())){
hql += " and book.bookName like '%"+book.getBookName()+"%'";
}
//如果书的作者不为空且不是空串 添加限制条件 返回指定作者的模糊查询结果集
if(book.getAuthor()!=null!"".equals(book.getAuthor())){
hql += " and book.author like '%"+book.getAuthor()+"%'";
}
//创建查询对象 执行hql语句
Query query = this.getSession().createQuery(hql);
//以下两条记录设置了从数据库的第几条记录开始 查到第几条 用于分页
//设定结果集的大小 就是分页逻辑设定的每页显示的记录数
query.setMaxResults(pager.getPageSize());
//从分页中逻辑中传过来的起始记录开始查
query.setFirstResult((pager.getCurrentPage()-1)*pager.getPageSize());
//返回查询到的结果
return query.list();
}
/**
*查询指定条件的图书的记录数
*@pamar book 一个图书信息对象
*@return int 图书的记录数
*/
public int getBookCount(Bookinfo book) throws DataAccessException{
//设定默认的hql 查询所有的图书的记录
String hql = " select count(bookName) from com.jframe.biz.book.Bookinfo book" +
" where 1=1 ";
//如果图书名不为空且不是空串 添加限制条件--图书名的模糊查询
if(book.getBookName()!=null!"".equals(book.getBookName())){
hql += " and book.bookName like '%"+book.getBookName()+"%'";
}
// 如果图书作者不为空且不为空串 添加限制条件--图书作者的模糊查询
if(book.getAuthor()!=null!"".equals(book.getAuthor())){
hql += " and book.author like '%"+book.getAuthor()+"%'";
}
Query query = this.getSession().createQuery(hql);
//返回查询的结果集到list
List list = query.list();
//如果结果集对象不为空且存在结果
if(list!=nulllist.size()0)
//将结果集中第一个元素转换成整形然后返回
return ((Integer)query.list().iterator().next()).intValue();
else
//没有记录返回0
return 0;
}
/**
*添加图书信息
*@parma book 图书信息对象
*@return 很费解 为啥这个方法还有返回值,即使需要返回值也是布尔型的啊
*/
public Bookinfo addBookInfo(Bookinfo book) throws DataAccessException{
//创建hibernate模板对象
HibernateTemplate template = this.getHibernateTemplate();
//调用模板的保存方法保存图书信息
template.save(book);
//清理缓存或者说清理脏数据 检验内存中的持久态对象是否已经存入数据库
template.flush();
template.evict(book);
//以后返回值就不解释了 方法头上面有参数和返回值的解释
return getBookInfo(book);
}
/**
*保存或者更新方法 注意 这个方法在旧版的hibernate里有 貌似hibernate3.0以上版本就删掉了
*@parma book 图书信息对象
*@return 为啥这个和上个方法还有返回值,即使需要返回值也是布尔型的啊
*/
public Bookinfo saveBookInfo(Bookinfo book) throws DataAccessException{
//同上个方法 以后不解释
HibernateTemplate template = this.getHibernateTemplate();
//如果数据库中没有则插入 如果有则更新
template.saveOrUpdate(book);
return book;
}
/**
*删除指定图书
*@parma book图书信息
*@return void
*/
public void deleteBookInfo(Bookinfo book) throws DataAccessException{
HibernateTemplate template = this.getHibernateTemplate();
//调用模板的删除方法
template.delete(book);
}
/**
*根据书号查询图书信息
*@param book 图书对象
*@return 图书信息
*/
public Bookinfo getBookInfo(Bookinfo book) throws DataAccessException{
HibernateTemplate template = this.getHibernateTemplate();
//sql语句 查询指定书号的图书信息
String hql = " from com.jframe.biz.book.Bookinfo book" +
" where 1=1 and book.bookNo='"+book.getBookNo()+"'";
//调用查询的模板的查询类
List list = template.find(hql);
//将查询结果集的第一个值强制转换成对象返回
if(list!=nulllist.size()0)
return (Bookinfo) list.iterator().next();
else
return null;
}
/**
*r如果日志信息中记录的书号是可删除的 并且在数据库中存在则返回true
*/
public boolean isCanDelete(Bookinfo book) {
boolean flag = false;
HibernateTemplate template = this.getHibernateTemplate();
String hql = " from com.jframe.biz.log.Loginfo log" +
" where 1=1 and log.bookinfo.bookNo='"+book.getBookNo()+"'";
List list = template.find(hql);
if(list!=nulllist.size()0)
flag = false;
else
flag = true;
return flag;
}
}
JAVA中hibernate的缓存怎么解决?
缓存有好几种,一级,二级,可以直接用evict()方法清空某一个特定对象
java相关,关于hibernate中判断持久化对象的状态的问题,谢谢!
有些语句完全没必要标注,没必要非要弄清楚哪句是什么状态,
暂时态:和Session没有发生任何关系的对象;
持久态:和Session发生了关系,如save、get、query方法;
游离态:用session.evict(Object obj)方法,即和Session解除关系;
如果你映射文件没问题那save方法正确,commit就相当于直接对数据库进行操作的时候用到的commit,目的是确保修改记录插入到数据库中
Java批量数据库操作,如何性能优化
ListStudent list = new ArrayListStudent();
for(int i=0;ilist.size();i++){
Student st = (Student)list.get(i);
Object o = getHibernateTemplate().get(Student.class, st.getStudentId());
if(null == o){
...
Address addr = new Address();
...
getHibernateTemplate().saveOrUpdate(addr);
getHibernateTemplate().saveOrUpdate(o);
getSession().flush();
getSession().evict(addr);
getSession().evict(o);
} else {
...
Address addr = methodForFindAddr(o);
...
getHibernateTemplate().saveOrUpdate(hql);
getHibernateTemplate().saveOrUpdate(o);
getSession().flush();
getSession().evict(addr);
getSession().evict(o);
}
}
现在实现如上面代码所示,如果list数据量比较小的话,还可勉强凑合,若超过数万条数据,需耗费大量时间,有什么好的建议对此进行优化?
我曾试两种方法:1.过线程池的方式,可方法methodForFindAddr可能会出现同步问题,线程之间数据串了。
2.将所有saveOrUpdate的对象抽取出来,循环批量保存,每循环50次,flush一次。可是两个循环耗费的时间仍然很长。
JAVA Hibernate工作原理及为什么要用
hibernate 简介:
hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库。
hibernate核心接口
session:负责被持久化对象CRUD操作
sessionFactory:负责初始化hibernate,创建session对象
configuration:负责配置并启动hibernate,创建SessionFactory
Transaction:负责事物相关的操作
Query和Criteria接口:负责执行各种数据库查询
hibernate工作原理:
1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的mapping resource="com/xx/User.hbm.xml"/读取并解析映射信息
3.通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory
4.Session session = sf.openSession();//打开Sesssion
5.Transaction tx = session.beginTransaction();//创建并启动事务Transation
6.persistent operate操作数据,持久化操作
7.tx.commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
为什么要用hibernate:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Hibernate是如何延迟加载?get与load的区别
1. 对于Hibernate
get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据
库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本(bibernate3.2以上)中get方法也会查找二
级缓存!
2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:
(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为
实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一
个ObjectNotFoundException。
(2)若为false,就跟Hibernateget方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
这里get和load有两个重要区别:
如果未能发现符合条件的记录,Hibernate get方法返回null,而load方法会抛出一个ObjectNotFoundException。
load方法可返回没有加载实体数据的代 理类实例,而get方法永远返回有实体数据的对象。
(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正
确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加
载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数
据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)
总之对于get和load的根本区别,一句话,hibernate对于
load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方
法,hibernate一定要获取到真实的数据,否则返回null。
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
说下Hibernate的缓存机制:
Hibernate缓存的作用:
Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据
Hibernate缓存分类:
Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存
Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。
Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。
什么样的数据适合存放到第二级缓存中?
1 很少被修改的数据
2 不是很重要的数据,允许出现偶尔并发的数据
3 不会被并发访问的数据
4 常量数据
不适合存放到第二级缓存的数据?
1经常被修改的数据
2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
3 与其他应用共享的数据。
Hibernate查找对象如何应用缓存?
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存
删除、更新、增加数据的时候,同时更新缓存
Hibernate管理缓存实例
无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。
当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。
Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数
如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰
hibernate的开发步骤:
开发步骤
1)搭建好环境
引入hibernate最小的jar包
准备Hibernate.cfg.xml启动配置文件
2)写实体类(pojo)
3)为实体类写映射文件"User.hbm.xml"
在hibernate.cfg.xml添加映射的实体
4)创建库表
5)写测试类
获得Configuration
创建SessionFactory
打开Session
开启事务
使用session操作数据
提交事务
关闭资源
聊聊hikari连接池的maxLifetime属性及evict操作
本文主要研究一下hikari连接池的maxLifetime属性及evict操作
用来标记连接池中的连接不可用,这样在borrow连接的时候,如果是标记evict的,则会继续获取连接
HikariCP-2.7.6-sources.jar!/com/zaxxer/hikari/pool/HikariPool.java
HikariCP-2.7.6-sources.jar!/com/zaxxer/hikari/pool/HikariPool.java
hikari连接池的maxLifetime用来标记connection在连接池中的存活时间,为0表示无限期。其到期的操作,主要是依靠在创建poolEntry的时候,注册一个延时任务,在连接存活将要到达maxLifetime之前触发evit,用来防止出现大面积的connection因maxLifetime同一时刻失效。除了这个延时任务,用户也可以主动去调用evict标记连接为evict。
触发时间距离maxlifetime的差值是根据 maxLifetime 10_000 ? ThreadLocalRandom.current().nextLong( maxLifetime / 40 ) : 0;
来计算( up to 2.5% of the maxlifetime )。
标记为evict只是表示连接池中的该连接不可用,但还在连接池当中,还会被borrow出来,只是getConnection的时候判断了,如果是isMarkedEvicted,则会从连接池中移除该连接,然后close掉。
javaevict的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、javaevict的信息别忘了在本站进行查找喔。
发布于:2022-12-25,除非注明,否则均为
原创文章,转载请注明出处。