包含javaevict的词条

博主:adminadmin 2022-12-25 11:39:08 70

今天给各位分享javaevict的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。