Hibernate中的优化 优化这东西更多的在于意,而不是技。而意的增长,是需要不断的磨练技才行,绝不是看了几页书能够完成的。 书上讲的优化,大致分为3个大类。 第一部分是lazy,延迟加载。延迟加载就其目的来说,为了减少数据库的操作而出现。因为在Hibernate中,一个对象被加载之后,其中的一些指向的实体对象是在使用的时候被加载的。这也就涉及了一定的问题。比方说一个对象从持久化变成脱管后,失去了Hibernate管理,以前脱管时候的代理类在使用的时候就无法抽取数据库中的值。 第二部分是fetch。简单的说也是和上面一样的问题。就是在n+1和笛卡尔集之间取得一个平衡 第三部分,2级缓存。大型仓库。更加的抽象。用它有两个条件。第一,不用的时候要有一定的性能,其次,使用了之后效果不能不明显。 总说 其实HQL语句和SQL语句的基本理念几乎完全相同。所以也就介绍一些简单的操作 分页 setMaxresult()和setFirstResult()这没有什么好说的。 参数绑定 这也没什么好多说的,就是:变量名 就是记住,如果有参数是一个对象的话,可以用以下两种方式来处理。看具体代码吧 /* 方法一 * Query queryitem = session1.createQuery(queryString) .setEntity("seller", seller);*/ /** * 这里觉得方法二比较清楚一点。因为可以通过代码看到类型 * 这种绑定的方式可以提供很大的灵活性。因为你不必把查询的条件降解到基本数据类型, * 可以用ADT的方式来处理。 */ Query queryitem =session1.createQuery(queryString) //方法二 .setParameter("seller", seller, Hibernate.entity(User.class)); 查询提示 主要是以下几点, 一个是关闭自动清理缓存,因为在Hibernate中,Query的执行之前,Hibernate会让缓存和数据库同步一次。但是有时候却不需要这么来做。 这时候,可以通过setFlushMode为commit来处理 如果有二级缓存, setCacheMode为CacheMode.IGNORE或者setHit(”org.hibernate.cachemode“,"org.hibernate.Cachemode.ignore") 二,返回readonly setreadonly(true),或者setHint("org.hibernate.readonly",true) 三,超时 setTimeout(60) //60秒,单位为秒 setHint("org.hibernate.timeout",60) 四,fetchsize setfetchsize(50)或者setHint("org.hibernate.fetchsize",50) 五.comment setComment 或者setHint("org.hibernate.comment",” “) 六,LOCKMODE setLockMode() 游标 记住query.scroll这个方法,然后查api就好 最后就是连接查询。 我直接给代码吧。因为没什么好多说的 /** * 隐式查询 * Hibernate: select bid0_.BID_ID as BID1_39_, bid0_.BID_NAME as BID2_39_, bid0_.TYPE_ID as TYPE3_39_ from SESSION_BID bid0_, SESSION_ITEM item1_, SESSION_USER user2_ where item1_.seller=user2_.USERID and bid0_.TYPE_ID=item1_.TYPE_ID and ( user2_.USER_NAME like '%USER1%' ) */ public void testLinkQuery1(){ Session session1 = HibernateUtil.getSessionFactory().openSession(); Transaction tx1 = session1.beginTransaction(); Query query = session1.createQuery("from Bid bid where bid.item.seller.name like '%USER1%'"); List<?> bids = query.list();; Bid bid = (Bid) bids.get(0); System.out.println(bid.getName()); tx1.commit(); session1.close(); } /** * 显示查询 * Hibernate: select bid0_.BID_ID as BID1_39_, bid0_.BID_NAME as BID2_39_, bid0_.TYPE_ID as TYPE3_39_ from SESSION_BID bid0_ inner join SESSION_ITEM item1_ on bid0_.TYPE_ID=item1_.TYPE_ID, SESSION_USER user2_ where item1_.seller=user2_.USERID and ( user2_.USER_NAME like '%USER1%' ) * */ public void testLinkQuery2(){ Session session1 = HibernateUtil.getSessionFactory().openSession(); Transaction tx1 = session1.beginTransaction(); /** * 如果这里会更具select语句中选中的来改变。 * 如果没有,则是返回为一个包含object[]数组的链表 */ Query query = session1.createQuery("select bid from Bid bid join bid.item i where i.seller.name like '%USER1%'"); List<?> bids = query.list();; Bid bid = (Bid)bids.get(0); System.out.println(bid.getName()); tx1.commit(); session1.close(); } /** * fetch的连接查询 */ public void testLinkQuery3(){ Session session1 = HibernateUtil.getSessionFactory().openSession(); Transaction tx1 = session1.beginTransaction(); /** * 如果这里会更具select语句中选中的来改变。 * 如果没有,则是返回为一个包含object[]数组的链表 */ Query query = session1.createQuery("select bid from Bid bid join fetch bid.item i where i.seller.name like '%USER1%'"); List<?> bids = query.list();; Bid bid = (Bid)bids.get(0); System.out.println(bid.getName()); tx1.commit(); session1.close(); } 相关资源:敏捷开发V1.0.pptx
