hibernate查询与缓存

告别第三方应用!用Android原生API搭建Miracast投屏接收器 本文深入探讨如何利用Android原生API开发Miracast接收器,绕过第三方依赖,实现高效的屏幕共享。通过Wi-Fi P2P直连、反射调用隐藏API和RTSP会话协商等核心技术,为开发者提供了一套完整的Miracast接收端解决方案,适用于多屏协同场景。 阅读详情
Hibernate查询 
首先介绍get()和load()方法的区别: 
get()方法和load()方法的区别主要在于对二级缓存的使用上。 
load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 
get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据. 

load():如果数据库中没有记录会抛出异常,如果有数据返回的是一个代理对象。 

get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载
get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。
get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL

list和iterator()方法之间的区别:(N+1?) 
list()方法在执行时,直接运行查询结果所需要的查询语句。 
iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。 
因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数). 
结果集的处理方法不同: 
list()方法会一次活的所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。 
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。 
HQL:HQL是一种面向对象的查询语言,HQL的操作对象是类、实例和属性等。 
SQL:sql的操作对象是数据表和列等数据对象。 
Hql是完全面向对象的查询语言,因此可以支持继承和多条等特征。 
HQL查询依赖于Query类,每个Query实例对应一个查询对象。 
定参数的功能,Query 接口才是真正的HQL查询接口。 
//创建一个Query 对象 
Java代码   收藏代码
  1. Query query = session.createQuery ("from Customer as c where c.name=:customerName and c.age=:customerAge");  

//动态绑定参数 
Java代码   收藏代码
  1. query.setString("customerName","Tom");  
  2. query.setInteger("customerAge",21);  

//执行查询语句,返回结果 
Java代码   收藏代码
  1. List result = query.list();  

HQL查询步骤: 
1:获取Hibernate Session对象。 
2:编写HQL语句。 
3:以HQL语句作为参数,调用Session的createQuery方法创建查询对象。 
4:如果HQL语句包含参数,调用Query的setXXX()方法为参数赋值。 
5: 调用Query对象的list等方法遍历查询结果。 
Query还包含两个方法: 
Java代码   收藏代码
  1. setFirstResult(int firstResult)://设置返回的结果集从第几条记录开始。  
  2. setMaxResults(int maxResults)://设置本次查询返回的结果数。  

实体的删除和更新。 
投影查询:只查询属性的一部分。 
   查询一个属性返回的是字符串 
   查询二个字段返回的是数组 
动态构造查询:主要用于几十个表查询; 
       要构建一个新的对象,要加上一个构造函数; 
  在new对象的时候要加上包名 
不要使用count(*) 要count(持久化对象) 
分组与排序: 
Order by子句可以通过asc或desc关键字排序 
     如: 
Java代码   收藏代码
  1. form User u Order by u.name asc,u.age desc;  

Group by子句与统计查询: 
如: 
Java代码   收藏代码
  1. String hql = "select count(u),u.age from User u group by u.age having count(u)>10";  
  2.  List list = session.createQuery(hql).list();  

标准的SQL聚合函数都可以在HQL语句中使用,比如:count(),sum(),max(),min(),age()等 

连接查询: 
内连接:inner join 
左外连接:left outer join 
右外连接:right outer join 
全连接:full join(不常用) 
迫切外连接:left outer join fetch,left join 
fetch:用于一次性获取连接数据,特别是集合数据。减少与数据库交互的次数。 
left out join:使用做外连接位于left join 左侧表的所有记录及对应的order类的记录信息都将显示出来。 
right out join:与 left out join 正好相反,right out join 返回的是HQL右侧表中的所有记录以及对应的Customer对象记录信息。 

获取集合数据的四种方式: 
1:Hibernate.initialize(user.getOrder()); 
2:user.getOrder().size(); 
3:左右迫切连接 
4:高级过滤器 
条件查询语句(Criteria Queries):利用对象进行对象查询。 
    主要的接口有:Criteria、Criterion和expression_r和Restrictions类组成。能够支持在运行时动态生成SQL语句。 
条件查询步骤: 
1:通过seesion的CreateCriteria()方法,创建一个Criteria对象 
2:设置查询对象,name指对象的属性 
3:把查询条件添加到Criteria对象中 
4:执行list()查询返回结果。 
条件查询通过三个类完成: 
Criteria:代表一次查询. 
Criterion:代表一个查询条件. 
Restrictions:产生查询条件的工具类. 

本地sql查询:使用手写的SQL来完成所有的create\update\delete操作也包括存储过程 
本地sql步骤: 
1:通过session创建一个SqlQuery对象。 
2:编写sql语句 
3:以SQL语句作为参数,调用Session的createSQLQuery方法创建查询对象 
4:如果SQL语句包含参数,则调用Query的setXX方法为参数赋值 
5:调用SQLQuery对象的addEntity或addScalar方法,将选出的结果与实体或标量值关联. 
如:HQL的sql 
Java代码   收藏代码
  1. String sql = "select c.c_id as {c.id},c.c_name as {c.name} from CUSTOMER c where c.id = 1";  

注意:如果使用*,表的别名和类的别名要一致 
Java代码   收藏代码
  1. String sql1 = "select {c.*} from CUSTOMER c where c.c_id=2 ";  

如:条件查询的sql 
Java代码   收藏代码
  1. SQLQuery query = session.createSQLQuery(sql);  
  2. query.addEntiy("c",Customer.class);  

多态查询: 
多态查询是指可以查询到当前类及所有子类的实例,HQL和条件查询都支持多态查询。 
如:hql语句查询出所有的持久化对象 
Java代码   收藏代码
  1. Query query = session.createQuery("from java.lang.object");  
  2. System.out.println(query.list());  


HQL支持多态查询,多态查询是指查询出当前类及所有子类的实例, 
session.createQuery("from Employee"); or session.createCriteria(Employee.class); 
如果Employee类有两个子类:HourlyEmployee和SalariedEmployee,那么这个查询语句会查出所有的Employee实例,以及HourlyEmployee类和SalariedEmployee类的实例。 
Java代码   收藏代码
  1. session.createQuery("from HourlyEmployee");  
  2. session.createCriteria(HourlyEmployee.class);//只检索子类  

查询结果集排序: 
Hql与条件查询都支持查询结果集排序,只是HQL采用Order by关键字,而条件查询采用order类进行查询结果排序。 

分页查询: 
分页查询是数据库应用中常见的处理方式,Query和Criteia接口都提供了用于分页查询的方法. 
Java代码   收藏代码
  1. setFistResult(int):  //指定从哪一个对象开始查询,参数是索引位置从0开始。  
  2. setMaxResults(int):  //指定一次最多查询的对象数量。  

子查询: 
  1:查询有一个订单以上的客户。 
如: 
Java代码   收藏代码
  1. from Customer c where 1<(select count(o) from  c.orders o)  

hql子查询依赖于底层数据库 对子查询支持的能力。 
所有的子查询可以使用连接查询和分组查询语句来代替。 
如:  
Java代码   收藏代码
  1. select c from Customer c join c.orders o group by c.id having count(o)>1  


如果子查询返回多条记录,可以使用关键字量化: 
1:all 2:any 3:some 4:in 5:exists 
如: 
Java代码   收藏代码
  1. //返回所有订单价格小于100的客户  
  2. from Customer c where 100>all(select o.price form c.orders o)  
  3. //返回有一条订单的价格小于100的客户  
  4. from Customer c where 100>any(select o.price from c.orders o)  
  5. //返回有一条订单的价格等于100的客户  
  6. from Customer c where 100=some(select o.price from c.order o)  
  7.   
  8. //返回有一条订单的价格等于100的客户  
  9. from Customer c where 100 = any (select o.prive from c.orders o)  
  10. //返回有一条订单的价格等于100的客户  
  11. from Customer c where 100 in (select o.price  from c.orders o)   


参数绑定: 
1:传统的JDBC的参数绑定 
  如: 
Java代码   收藏代码
  1. PrepareStatement pre = connection.prepare("select * from User where user.name = ?");  
  2. pre.setString(1,"Zhao");  
  3. ResultSet rs = pre.executeQuery();  

Hibernate参数绑定:在hibernate中有4种参数绑定方式 
1:按参数名称(命名参数)绑定,在语句中定义命名参数要用":"开头 
2:按参数位置绑定 
3:Hql查询中可以通过setParameter()方法绑定任意类型的参数 
4:setProperties()方法,将命名参数与一个对象的属性值绑定在一起 
如:参数":"开头 
Java代码   收藏代码
  1. Query query = session.createQuery("from User user where user.name = customername and user.age = :customerage");  
  2.   query.setString("customername",name);  
  3.   query.setInteger("customerage",age);  

如:参数位置绑定 
Java代码   收藏代码
  1. Query query = session.createQuery("from User user where user.name =? and user.age = ?");  
  2.  query.setString(0,name);  
  3.  query.setInteger(1,age);  

如:setParameter他有三个参数一般写两个参数 
Java代码   收藏代码
  1. String hql = "from User user where user.name = :customername";  
  2. Query query = session.createQuery(hql);  
  3. query.setParameter("customername",name,Hibernate.STRING);  


如:setProperties 
Java代码   收藏代码
  1. Customer customer = new Customer();  
  2. customer.setName("sdsd");  
  3. customer.setAge(99);  
  4. Query query = session.createQuery("from Customer c where c.name=:name and c.age = :age");  
  5. query.setProperties(customer);  


定义命名查询: 
命名的SQL语句不是放在程序中,而是放在配置文件中,这种方式是以松耦合的方式配置SQL语句,可以提高程序解耦. 
在Customer.hbm.xml配置文件中 
Java代码   收藏代码
  1. <query name="findCustomer">  
  2.  <!CDAATA[from Customer c where c.name = :name] />  
  3. </query>  

程序中的代码: 
Java代码   收藏代码
  1. Query query = session.getNamedQuery("findCustomer");  
  2. query.setString("name","tiger");  
  3. List list = query.list();  

命名的SQL语句: 
Java代码   收藏代码
  1. <sql-query name="mysqlquery">  
  2.  <!-- 关联返回的结果与实体类 -->  
  3.  <return alias="s" class="com.lovo.po.Customer">  
  4.  <!-- 定义命名SQL查询的SQL语句 -->  
  5.  select {c.*}  
  6.  from Customer Customer c where c.name like "刘德华"  
  7. </sql-query>  

sql_query是hibernate-mapping元素的子元素,因此可以直接通过session访问 



缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域, 
目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能. 
  Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候 
就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应 
用程序对物理数据源的访问,使得程序的运行性能明显的提升. 

缓存分两级,一级session缓存,就是常说的一级缓存;二级应用缓存(二级缓存); 
一级缓存,一级缓存依赖于session,在一个session中就是一个缓存,当session失效时,缓存消失。 

/**两个session两次加载**/ 

Java代码   收藏代码
  1.  public void loadBookAgain(){  
  2.   Session session = HibernateSessionFactory.getSession();  
  3.   Book book1 = (Book) session.get(Book.class, 6);  
  4.   Book book2 = (Book) session.get(Book.class, 6);  
  5.   session.close();  
  6.     
  7. //  Session session1 = HibernateSessionFactory.getSession();  
  8. //  Book book2 = (Book) session1.get(Book.class, 6);  
  9. //  session1.close();  
  10.  }  


在一个session里面查询两次相同的book,只会执行一次sql。 
但若放在不同的session中,将会执行两次数据库查询。 
解决问题的办法就是用二级缓存。 
二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等。 
  参考 http://www.javaeye.com/topic/249465  
  不是所有的数据都适合放在二级缓存中 
  下面这几种情况就不适合加载到二级缓存中: 
  1.经常被修改的数据 
  2.绝对不允许出现并发访问的数据 
  3.与其他应用共享的数据 
  下面这己种情况合适加载到二级缓存中: 
  1.数据更新频率低 
  2.允许偶尔出现并发问题的非重要数据 
  3.不会被并发访问的数据 
  4.常量数据 
  5.不会被第三方修改的数据 

配置二级缓存比较简单,以ehcache为例: 

添加缓存文件ehcache-hibernate-local.xml 
Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <ehcache>  
  3.   
  4.  <diskStore path="java.io.tmpdir/hibernate/book" />  
  5.  <defaultCache maxElementsInMemory="10000" overflowToDisk="true" eternal="false"  
  6.   memoryStoreEvictionPolicy="LRU" maxElementsOnDisk="10000000"  
  7.   diskExpiryThreadIntervalSeconds="600"  
  8.   timeToIdleSeconds="3600" timeToLiveSeconds="100000" diskPersistent="false" />  
  9.  <!-- Special objects setting. -->  
  10.  <cache name="bean.entity.Book" maxElementsInMemory="500" overflowToDisk="true"  
  11.   eternal="true">  
  12.  </cache>  
  13. </ehcache>  

  maxElementsInMemory为缓存对象的最大数目, 
  eternal设置是否永远不过期, 
  timeToIdleSeconds对象处于空闲状态的最多秒数, 
  timeToLiveSeconds对象处于缓存状态的最多秒数 。 

  在实体bean的hbm.xml文件中加上缓存配置: 
Java代码   收藏代码
  1. <!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write  
  2.  nonstrict-read-write transactional-->  
  3.  <cache usage="read-write" />  

  
  现在大部分的hibernate应用不再写实体映射配置文件,那么就在实体bean中加上 
  //默认的缓存策略. 
Java代码   收藏代码
  1. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  

  
  在hibernate定义sessionFactory中加上查询缓存配置: 
    <!-- 设置二级缓存插件EHCache的Provider类--> 
 
Java代码   收藏代码
  1. <property name="hibernate.cache.provider_class">  
  2.    org.hibernate.cache.EhCacheProvider  
  3.   </property>  

  <!-- 启动"查询缓存" --> 
 
Java代码   收藏代码
  1. <property name="hibernate.cache.use_query_cache">true</property>  
  2.   <property  
  3.    name="hibernate.cache.provider_configuration_file_resource_path">  
  4.    /ehcache-hibernate-local.xml  
  5.   </property>  

  如果项目试用了spring,那么相应配置为: 
 
Java代码   收藏代码
  1. <property name="hibernateProperties">  
  2.    <props>  
  3.     <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
  4.     <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
  5.     <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>  
  6.     <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>  
  7.     <prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate-local.xml</prop>  
  8.    </props>  
  9.   </property>  

  
两种配置基本一致。 

这个时候在按实体的ID来查询的时候即使不在一个session中,hibernate也只是执行一次sql。 
查询缓存做到现在,有一点效果,但基本还是个摆设。 
看下面代码: 
Java代码   收藏代码
  1. public void listBookTwice(){  
  2. String hql = "from Book";  
  3. Session session = HibernateSessionFactory.getSession();  
  4. Query q = session.createQuery(hql);  
  5. List<Book> list1 = q.list();  
  6. List<Book> list2 = q.list();  
  7. session.close();  

同一个query。list了两次,按照之前的效果,应该是执行一个sql。事实是,他要去查两次, 
在一个query尚且如此,两个不用说,肯定也是没有用到缓存了。 
难道缓存失效了?呵呵,其实是因为我们虽然配置了缓存,但是在query级却没有设置缓存,如果需要query缓存, 
则需要手工写入: 
q.setCacheable(true);来激活查询缓存。 
修改代码如下: 
Java代码   收藏代码
  1. public void listBookTwice(){  
  2.   String hql = "from Book";  
  3.   Session session = HibernateSessionFactory.getSession();  
  4.   Query q = session.createQuery(hql);  
  5.   q.setCacheable(true);  
  6.   List<Book> list1 = q.list();  
  7.   for(Book b : list1){  
  8.    System.out.println(b.getBname()+"--------->list1");  
  9.   }  
  10. //  List<Book> list2 = q.list();  
  11.   session.close();  
  12.     
  13.   Session session2 = HibernateSessionFactory.getSession();  
  14.   Query q2 = session2.createQuery(hql);  
  15.   q2.setCacheable(true);  
  16.   List<Book> list2 = q2.list();  
  17.   for(Book b : list2){  
  18.    System.out.println(b.getBname()+"--------->list2");  
  19.   }  
  20.   session2.close();  
  21.  }  


在两个session立分别list查询,ok,只输出一条sql。说明二级缓存在list查询的时候也起作用了。 
那hibernate是根据什么来缓存list呢,参考: http://www.javaeye.com/topic/18904  

对于查询缓存来说,缓存的key是根据hql生成的sql,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。 
比如hql: 
from Cat c where c.name like ? 
生成大致如下的sql: 
select * from cat c where c.name like ? 
参数是"tiger%",那么查询缓存的key*大约*是这样的字符串(我是凭记忆写的,并不精确,不过看了也该明白了): 
select * from cat c where c.name like ? , parameter:tiger% 
这样,保证了同样的查询、同样的参数等条件下具有一样的key。 
现在说说缓存的value,如果是list方式的话,value在这里并不是整个结果集,而是查询出来的这一串ID。 
也就是说,不管是list方法还是iterate方法,第一次查询的时候,它们的查询方式很它们平时的方式是一样的, 
list执行一条sql,iterate执行1+N条,多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候,就都和iterate的行为一样了, 
根据缓存的key去缓存里面查到了value,value是一串id,然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。 
可以看出来,查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候,都是既填充查询缓存又填充class缓存的。 
这里还有一个很容易被忽视的重要问题,即打开查询缓存以后,即使是list方法也可能遇到1+N的问题!相同条件第一次list的时候, 
因为查询缓存中找不到,不管class缓存是否存在数据,总是发送一条sql语句到数据库获取全部数据,然后填充查询缓存和class缓存。 
但是第二次执行的时候,问题就来了,如果你的class缓存的超时时间比较短,现在class缓存都超时了,但是查询缓存还在, 
那么list方法在获取id串以后,将会一个一个去数据库load!因此,class缓存的超时时间一定不能短于查询缓存设置的超时时间 
!如果还设置了发呆时间的话,保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况,比如class缓存被程序强制evict了, 
这种情况就请自己注意了。 
另外,如果hql查询包含select字句,那么查询缓存里面的value就是整个结果集了。 


可以理解为hibernate缓存了每次查询的hql语句作为缓存map的key,将对应对象的id作为value缓存,每次遇到相同的hql,就将id取出来, 
如果在缓存里面有对象,就从缓存取,没有的话就去数据库load 

缓存什么时候更新呢? 

看代码: 
Java代码   收藏代码
  1. public void update(){  
  2.   Session session = HibernateSessionFactory.getSession();  
  3.   Transaction tran = session.beginTransaction();  
  4.   tran.begin();  
  5.   Book b = (Book) session.get(Book.class, 7);  
  6.   b.setIsbn("567890");  
  7.   session.saveOrUpdate(b);  
  8.   tran.commit();  
  9.   session.close();  
  10.  }  
  11. public void listBookTwice(){  
  12.   String hql = "from Book";  
  13.   Session session = HibernateSessionFactory.getSession();  
  14.   Query q = session.createQuery(hql);  
  15.   q.setCacheable(true);  
  16.   List<Book> list1 = q.list();  
  17.   for(Book b : list1){  
  18.    System.out.println(b.getBname()+"----"+b.getIsbn()+"--------->list1");  
  19.   }  
  20.   session.close();  
  21.  }  
  22.    
  23.  public void listBookAgain(){  
  24.   String hql = "from Book";  
  25.   Session session2 = HibernateSessionFactory.getSession();  
  26.   Query q2 = session2.createQuery(hql);  
  27.   q2.setCacheable(true);  
  28.   List<Book> list2 = q2.list();  
  29.   for(Book b : list2){  
  30.    System.out.println(b.getBname()+"----"+b.getIsbn()+"--------->list3");  
  31.   }  
  32.   session2.close();  
  33.  }  
  34.  public static void main(String[] args) {  
  35.    BookDao dao = new BookDao();  
  36.    dao.listBookTwice();  
  37.    dao.update();  
  38.    dao.listBookAgain();  
  39.  }  


  先list一次,之间更新一个book,第二次list,输出: 
Java代码   收藏代码
  1. Hibernate: select book0_.id as id0_, book0_.bname as bname0_, book0_.isbn as isbn0_, book0_.price as price0_ from hibernate_test.dbo.book book0_  
  2.  book1250672666171----123456--------->list1  
  3.  book1250672666203----123456--------->list1  
  4.  book1250672666203----123456--------->list1  
  5.  book1250672666203----123456--------->list1  
  6.  book1250672666203----123456--------->list1  
  7. Hibernate: update hibernate_test.dbo.book set bname=?, isbn=?, price=? where id=?  
  8. Hibernate: select book0_.id as id0_, book0_.bname as bname0_, book0_.isbn as isbn0_, book0_.price as price0_ from hibernate_test.dbo.book book0_  
  9. book1250672666171----123456--------->list3  
  10. book1250672666203----567890--------->list3  
  11. book1250672666203----123456--------->list3  
  12. book1250672666203----123456--------->list3  
  13. book1250672666203----123456--------->list3  

可见,当数据库有更新的时候,缓存就失效了。 


整理收集自互联网。

http://www.iteye.com/topic/19577

http://www.iteye.com/topic/1021213

Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示 通过以上步骤,我们实现了Flutter加载本地HTML的完整流程,并简单介绍了如何通过WebView与HTML页面进行交互。HTML文件作为一种灵活、易维护的富文本展示方式,能有效提升Flutter应用的内容呈现能力。这种方法在展示新闻、资讯或帮助文档等内容时非常有用,能够让开发者灵活调整内容的样式和排版。希望这篇文章能对你在Flutter开发中的HTML加载有所帮助! 阅读详情

相关推荐

性能测试软件(LR12) 具体汉化(中文)方法

LoadRunner 12 的下载及安装详细过程请参考:https://blog.youkuaiyun.com/xiao66guo/article/details/105465854 1、在LoadRunner文件中找到 Setup.exe 可执行文件,并以管理员的身份运行: C盘 —> Temp—>HP LoadRunner 12.02 Community Edition—> D...

多谢大人光临寒舍,请随便看看,喝口茶吧 ☕️☕️☕️ 1993

Hibernate缓存及查询策略研究

公司现在有一个比较旧的SSH项目,使用hibernate作为数据访问层框架。因为表之间的关系比较复杂,所以在类与类之间配置了很多的一对多,多对多关联关系,在查数据的时候会查出很多不需要的数据,导致了查询性能的低下,一次简单的分页查询却要耗时一秒以上。 不过,Hibernate也提供了一些方式来提高多表查询性能:可以通过查询策略来优化生成的sql语句,也可以通过缓存来减少sql的生成。下面就介绍下我对查询及缓存策略如何优化查询性能的一些测试与研究。 查询策略 先介绍一下查询策略,指的是Hibernate在查询

Yaber的博客 679

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

Hibernate查询缓存如何工作

介绍 既然我已经介绍了实体和集合缓存,现在该研究查询缓存的工作原理了。 查询缓存与实体严格相关,它在搜索条件和满足该特定查询过滤器的实体之间绘制关联。 像其他Hibernate功能一样,查询缓存也不像人们想象的那么琐碎。 实体模型 对于我们的测试用例,我们将使用以下域模型: Post实体与Author 具有多对一关联,并且两个实体都存储在第二级缓存中。 启用查询缓存 默...

最佳 Java 编程 260

Notepad++ XML Tools插件:手把手教你格式化混乱XML与一键语法检查(保姆级教程)

本文详细介绍了如何使用Notepad++的XML Tools插件格式化混乱的XML文件并进行一键语法检查。通过插件安装、格式化实战和语法排错的完整流程,帮助开发者高效处理XML数据,提升API通信和数据存储的工作效率。特别适合需要快速验证和整理XML配置的开发人员。

weixin_42619742的博客 326

STM32F401RCT6最小系统原理图设计

STM32F401RCT6最小系统原理图设计一、主控芯片二、电源电路三、晶振电路三、下载电路四、完整电路图      本文章基于STM32F401RCT6进行最小系统原理图设计,包含主控芯片,电源,晶振电路,下载电路等几部分 一、主控芯片 主控芯片采用STM32F401RCT6,需注意: VBAT在不接电池的情况下需接3.3V,VDDAVREF+需接3.3V,否则会造成芯片供电不正常,无法启动和识别的情况 VDDAVREF+和VCAP1处电容需按照规格书

weixin_43278295的博客 2万+

hibernate缓存机制详细分析

本文转载至博客园。 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别)、二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题。 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解。 一、N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题:...

Smiling8866的博客 179

Codex 100个真实案例 - 用AI自动生成API测试用例(接口测试全覆盖)

API 测试是保障后端质量的关键环节,但手写测试用例既枯燥又容易遗漏。本案例将展示如何用 Codex 从 Swagger/OpenAPI 规范文档自动生成 pytest 测试用例——包括正常流程测试、边界值测试、异常参数测试、性能压力测试,还能自动生成 Mock 数据和精美的 HTML 测试报告。全程自然语言驱动,让 API 测试覆盖率从 0 飙到 90%+!

yueyeguzhuo的专栏 270

java hibernate 缓存机制_java – Hibernate的本机查询和缓存机制

我有一个关于Hibernate缓存机制的问题.我在文章中读到了hibernate中本机SQLquery的执行,使缓存的所有区域无效,因为hibernate对它将影响哪个特定实体一无所知.这里缓存的所有区域意味着我们在讨论二级缓存的各个区域或两个级别的缓存(第一级缓存,第二级缓存)或仅第二级缓存还是仅第一级缓存?解决方法:此article解释了Hibernate查询缓存的工作原理以及本机查询对现有缓...

weixin_28685487的博客 178

couldn‘t upgrade db schema: insert into ACT_GE_PROPERTY values (‘common.sche[已解决]

启动整合了flowable的项目,初始化时报错。flowable没有自动建表, 原因 测试数据库版本是MySQL5.7。经过查询和尝试,原因是:在这个数据库里面,已经有一个数据库里面有activiti的这些表了,它检索的时候全库检索查到它了,所以flowable不去建表了,但是我们指定的这个schema里卖弄还是空的,所以它报了找不到表。解决方法:mysql的链接上加上参数如下,让本schema成为默认的schema。...

JavaPub 6010

19、多项式基算术:原理与运算详解

本文深入探讨了有限域 $GF(2^m)$ 中的多项式基算术,详细介绍了加法、减法、乘法和平方运算的原理与实现方法。重点分析了多项式基表示形式、模约简技术以及乘法优化策略,如高基数乘法、并行与顺序乘法器设计,并提到了Karatsuba-Ofman算法在减少乘法次数方面的优势。此外,文章还讨论了多项式基算术在密码学、编码理论等领域的应用前景,并展望了未来在高效算法设计与硬件加速方面的研究方向。

yellow的专栏 150

hibernate查询缓存_Hibernate查询缓存如何工作

hibernate查询缓存 介绍 现在,我已经介绍了实体和集合缓存,现在该研究查询缓存的工作原理了。 查询缓存与实体严格相关,它在搜索条件和满足该特定查询过滤器的实体之间绘制关联。 像其他Hibernate功能一样,查询缓存也不像人们想象的那么琐碎。 实体模型 对于我们的测试用例,我们将使用以下域模型: Post实体与Author 具有多对一关联,并且两个实体都存储在第二级缓...

最佳 Java 编程 904

uniapp(全端兼容) - 最新详细实现瀑布流列表及布局设计,uni-app全平台兼容的瀑布流示例,view容器自适应瀑布流布局,图片瀑布流布局、图像+文字卡片式瀑布流,类似小红书(详细示例代码)

uni-app,瀑布流,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,瀑布流布局,如何实现图片瀑布流,怎么做文字+图像瀑布流,uniapp仿小红书笔记瀑布流效果,uniAPP仿快手抖音布局列表,瀑布流列表详细教程,编译所有平台都能用的瀑布流列表,商品瀑布流列表,图文列表,小程序瀑布流,页面触底懒加载,瀑布流插件,详细示例代码教程,uni-app H5实现瀑布流效果,uniapp小程序做瀑布流,纯css瀑布流,用uniapp写瀑布流商品列表,

✅ 精选推荐文章 1万+

Hibernate缓存——查询缓存

Hibernate缓存——查询缓存 默认情况下关闭设置的缓存对HQL和QBC查询时无效,需要打开查询缓存。 查询缓存依赖于二级缓存。 1.设置          true 2.在打开了查询缓存之后,需要注意,调用query.list()操作之前,必须显式调用query.setCachable(true)来标识某个查询使用缓存。   pu

fkngl的博客 1293

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Hibernate缓存☞查询缓存

Hibernate缓存☞一级缓存 Hibernate缓存☞二级缓存 Hibernate缓存☞查询缓存 Hibernate缓存☞总结 网上说 query.setCacheable(true) 或criteria.setCacheable(true) 这两种方式的缓存命中率低,个人认为谈论这个“无卵用”; 我在测试的时候发现,上面的操作会受配置的限制,必须在配

Sucre 2933

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Hibernate的二级缓存之查询缓存

  查询缓存(Query Cache):对于经常使用的查询语句,如果启用了查询缓存,当第一次执行查询语句时,Hibernate会把查询结果存放在第二缓存中。以后再次执行该查询语句时,只需从缓存中获得查询结果,从而提高查询性能。     查询缓存适用于以下场合:l 在应用程序运行时经常使用的查询语句。l 很少对与查询语句关联的数据库数据进行插入、删除或更新操作。     Hibernate的Quer

DiscussQuestions的专栏 890

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hibernate查询缓存_深入研究Hibernate的查询缓存

hibernate查询缓存 我已经很长时间没有使用过Hibernate了,甚至更久没有写过博客了 。 最近,我在建立常绿缓存的工作范围内撰写博客文章。 在编写演示代码时,我遇到了一些与Hibernate的查询缓存有关的问题:它没有按我预期的那样工作。 终于,一段时间后,我设法解决了这个问题。 这篇文章旨在更深入地研究Hibernate的Query Cache,以帮助遇到同样问题的其他开发人员...

dlz00001的博客 628

Hibernate缓存之查询缓存简述

Hibernate独有的查询缓存

SirouW的博客 586

hibernate二级缓存 和 查询缓存

<br />二级缓存和查询缓存都相当于一个map。 <br />二级缓存缓存的key为id,value为实体对象。一般load(),iterate()使用到二级缓存,list()需要结合查询缓存使用。iterate()和list()区别如下: <br />iterate()不需要开启查询缓存,它首先发出一个sql如”select s.id from Student s”去数据库把id属性列表取出来,然后再根据id列表一个一个load(),如果缓存有从缓存取,如果缓存没有就从数据库取:select s.id,

liu372267001的专栏 5030

Hibernate开启查询缓存

由于查询缓存,依赖于二级缓存,所以先必须开启二级缓存!! 步骤如下: 首先,通过配置文件开启查询缓存      情况一,项目有hibernate.cfg.xml文件                     通过修改hibernate.cfg.xml文件,开启查询缓存功能 true org.hibernate.cache.EhCacheProvider tru

yh_zeng2的博客 1457

hibernate二级缓存VS查询缓存

hibernate二级缓存VS查询缓存(Second cache VS query cache)这两个概念,因为对查询缓存重视度不够,容易混。从以下维度比较下: 1.处理时机 2.缓存格式 3.适用范围 4.稍微分析利弊 处理时机说明: 1.查询缓存在一二级缓存前,使能情况下,先去找查询缓存里面的东西; 2.所有的缓存一定是在调用HQL后发生的,代码一定得走到HQL那块,然后由hiberna

石权的博客 660

hibernate的查询缓存机制

<br />原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://yangfei520.blog.51cto.com/1041581/287380    在hibernate的使用中,大家多数时间都在讨论一级缓存和二级缓存,而往往忽略了查询缓存。其实hibernate的查询缓存在使用过程中也起着同样重要的作用。hibernate的查询缓存是主要是针对普通属性结果集的缓存, 而对于实体对象的结果集只缓存id。在一级缓存,二级缓存和查询缓存都打开的

FG2006的专栏 1085

Hibernate实战——查询缓存

一配置 <?xml version="1.0" encoding="GBK"?> <!-- 指定Hibernate配置文件的DTD信息 --> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://...

实践求真知 215

Hibernate旅程(九)Hibernate缓存机制--查询缓存

Hibernate查询缓存 我们介绍了Hibernate一级缓存,二级缓存。而hibernate二级缓存时针对Id查询的缓存策略,对于条件查询则毫无作用。因此hibernate提供了针对条件查询的QueryCache(查询策略)。 下面来看session控制的查询缓存。 一、查询缓存配置 1、          在hibernate.cfg.xml中加入查询缓存

Xinghf 3192

hibernate查询缓存_在Hibernate中启用实体和查询缓存

hibernate查询缓存 1.简介 在我执行过的与性能相关的任务中,这就是其中之一。 令人担心的是,如果对于特定实体每次都调用相同的查询,并且表数据在特定的时隙内不易更改,则我们可以使用Hibernate缓存查询结果。 这意味着,如果我们需要ID为1234的Student的详细信息,则查询将仅针对第一个请求执行并访问数据库。 后续请求与查询缓存中的结果一起提供。 这对我们注意到的响应时间产生...

最佳 Java 编程 354

Hibernate-查询缓存

Hibernate查询缓存 一级缓存和二级缓存都只是存放实体对象的,如果查询实体对象的普通属性的数据,只能放到查询缓存里 查询缓存还存放查询实体对象的id。 查询缓存的生命周期不确定,当它关联的表发生修改,查询缓存的生命周期就结束。这里表的修改指的是通过hibernate修改,并不是通过数据库客户端软件登陆到数据库上修改。 hibernate的查询缓存...

89
上一篇: Hibernate高效查询,只查询部分/指定字段
下一篇: Hibernate 高级查询技巧——集合过滤与子查询
narutobing
博客等级 码龄18年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值