??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产一区视频,区三区激情福利综合中文字幕在线一区亚洲视频1 ,亚洲婷婷国产精品电影人久久http://m.tkk7.com/zhangwei217245/archive/2010/03/23/316264.htmlX-SpiritX-SpiritTue, 23 Mar 2010 03:21:00 GMThttp://m.tkk7.com/zhangwei217245/archive/2010/03/23/316264.htmlhttp://m.tkk7.com/zhangwei217245/comments/316264.htmlhttp://m.tkk7.com/zhangwei217245/archive/2010/03/23/316264.html#Feedback0http://m.tkk7.com/zhangwei217245/comments/commentRss/316264.htmlhttp://m.tkk7.com/zhangwei217245/services/trackbacks/316264.html

原文 http://blog.csdn.net/woshichenxu/archive/2006/01/22/586361.aspx


1.     关于hibernate~? 存的问题Q?/font>

1.1.1.         基本的缓存原?/font>

Hibernate~存分ؓ二Q第一U存放于session中称ZU缓存,默认带有且不能卸载?/span>

W二U是?/span>sessionFactory控制的进E~存。是全局׃n的缓存,凡是会调用二U缓存的? 询方?/span>都会从中受益。只有经正确的配|后二~存才会发挥作用。同? 在进行条件查询时必须使用相应的方法才能从~存中获取数据。比?/span>Query.iterate()Ҏ?/span>load?/span>getҎ{。必L意的?/span>session.findҎ永远是从数据库中获取数据Q不会从二~存中获取数据,? 便其中有其所需要的数据也是如此?/span>

查询时用缓存的实现q程为:首先查询一U缓存中是否h需? 的数据,如果没有Q查询二U缓存,如果二~存中也没有Q此时再执行查询数据库的工作。要注意的是Q此3U方式的查询速度是依ơ降低的?/span>

1.2.   存在的问?/span>

1.2.1.      一U缓存的问题以及使用二~存 的原?/font>

     因ؓSession的生命期往往很短Q存在于Session内部的第一U最快缓存的生命期当然也很短Q?span style="color: blue;">所以第一U缓存的命中率是很低?/span>。其对系l性能的改善也是很有限的。当Ӟq个Session内部~存的主要作用是保持Session内部数据状态同步。ƈ非是hibernateZ大幅提高pȝ性能所提供的?/span>

Z提高使用hibernate的性能Q除了常规的一些需要注意的Ҏ比如Q?/span>

使用延迟加蝲、迫切外q接、查询过滤等以外Q还需要配|?/span>hibernate的二U缓存。其对系l整体性能的改善往往h立竿见媄的效果!

Q经q自׃前作目的经验,一般会?/span>3~4倍的性能提高Q?/span>

1.2.2.      N+1? 查询的问?/font>

执行条g查询ӞiterateQ)Ҏh著名?/span>n+1ơ查询的问题Q也是说在W一 ơ查询时iterateҎ会执行满x件的查询l果数再加一ơ(n+1Q的查询。但是此问题只存在于W一ơ查询时Q在后面执行相同? 询时性能会得到极大的改善。此Ҏ适合于查询数据量较大的业务数据?/span>

但是注意Q当数据量特别大Ӟ比如水U数据等Q需要针Ҏ? 久化对象配置其具体的~存{略Q比如设|其存在于缓存中的最大记录数、缓存存在的旉{参敎ͼ以避 免系l将大量的数据同时装载入内存中引起内存资源的q速耗尽Q反而降低系l的性能Q!Q?/span>

1.3.   使用hibernate二~存的其他注? 事项Q?/font>

1.3.1.      关于数据的有效?/font>

另外Q?/span>hibernate会自行维护二U缓存中的数据,以保证缓存中的数据和数据库中的真实数据的一致性!无论何时Q当你调?/span>save()?/span>update()?/span> saveOrUpdate()Ҏ传递一个对象时Q或使用load()?/span> get()?/span>list()?/span>iterate() ?/span>scroll()Ҏ获得一个对象时该对象都被加入?/span>Session的内部缓存中?/span> 当随?/span>flush()Ҏ被调用时Q对象的状态会和数据库取得同步?/span>

也就是说删除、更新、增加数据的时候,同时更新~存。当然这? 包括二~存Q?/span>

只要是调?/span>hibernate API执行数据库相关的工作?/span>hibernate都会Z自动保证~存数据的有效性!Q?/span>

但是Q如果你使用?/span>JDBCl过hibernate直接执行Ҏ据库的操作。此ӞHibernate不会/也不可能自行感知到数据库被进行的变化改动Q也׃能再保证~? 存中数据的有效性!Q?/span>

q也是所有的ORM产品共同h的问题。幸q的是,Hibernate为我们暴露了Cache的清除方法,q给我们提供了一个手动保证数据有效性的ZQ!

一U缓存,二~存都有相应的清除方法?/span>

其中二~存提供的清除方法ؓQ?/span>

按对?/span>class清空~存

                按对?/span>class和对象的主键id清空~存

                清空对象的集合中的缓存数据等?/span>

   

1.3.2.      适合使用的情?/font>


q所有的情况都适合于用二U缓存,需要根据具体情冉|? 定。同时可以针Ҏ一个持久化对象配置其具体的~存{略?/span>

适合于用二U缓存的情况Q?/span>

1?/font>数据不会被第三方修改Q?/span>

一般情况下Q会?/span>hibernate以外修改的数据最好不要配|二U缓存,以免引v不一致的数据? 但是如果此数据因为性能的原因需要被~存Q同时又有可能被W?/span>3Ҏ?/span>SQL修改Q也可以为其配置二~存。只是此旉要在sql执行修改后手动调?/span>cache的清除方法。以保证数据的一致?/span>

 2、数据大在可接收范围之内;

     如果数据表数据量特别巨大Q此时不适合于二U缓存。原因是~存的数据量q大可能会引起内存资源紧张,反而降低性能?/span>

如果数据表数据量特别巨大Q但是经怋用的往往只是较新的那? 分数据。此Ӟ也可为其配置二~存。但是必d独配|其持久化类的缓存策略,比如最大缓存数、缓存过期时间等Q将q些参数降低至一个合理的范围Q太高会 引v内存资源紧张Q太低了~存的意义不大)?/span>

 3、数据更新频率低Q?/span>

     对于数据更新频率q高的数据,频繁同步~存中数据的代h可能?/span>查询~存中的数据从中获得的好处相当,坏处益处相抵消。此时缓 存的意义也不大?/span>

 4、非关键数据Q不是胦务数据等Q?/span>

  财务数据{是非常重要的数据,l对不允许出现或使用无效的数据,所以此时ؓ了安全v见最好不要用二U缓存?/span>

  因ؓ此时“正确?#8221;的重要性远q大?/span>“高性能”的重要性?/span>

2.     目前pȝ中?/span>hibernate~? 存的

1.4.   目前情况

 一般系l中有三U情况会l开hibernate执行数据?/span>操作Q?/span>

   此种情况使用hibernate二~存会不可避免的造成数据不一致的问题Q?/font>

 详细的设计。比如在设计? 避免对同一数据表的同时的写入操作,

   使用数据库各U别的锁定机制{?/font>

2、动态表相关

   所?#8220;动态表”是指在系l运行时Ҏ用户的操作系l自动徏 立的数据表?/span>

   比如“自定义表?#8221;{属于用戯定义扩展开发性质的功能模块,因ؓ此时数据表是q行时徏立的Q所以不能进行hibernate的映。因此对它的操作只能 是绕开hibernate的直接数据库JDBC操作?/span>

      如果此时动态表中的数据没有设计~存Q就不存在数据不一致的? 题?/span>

   如果此时自行设计了缓存机Ӟ则调用自q~存同步Ҏ? 可?/span>

3、?/span>sql? hibernate持久化对象表q行扚w删除?/span>

     此时执行扚w删除后,~存中会存在已被删除的数据?/span>

? 析: 

   当执行了W?条(sql扚w删除Q后Q后l的查询只可能是以下三种方式Q?/span>

a. session.findQ)ҎQ?/span>

Ҏ前面的ȝQ?/span>findҎ不会查询二~存的数据,而是直接查询数据库?/span>

所以不存在数据有效性的问题?/span>

b. 调用iterateҎ执行条g查询Ӟ

Ҏiterate查询Ҏ的执行方式,其每ơ都会到数据库中查询满条g?/span>id|然后再根据此id 到缓存中获取数据Q当~存中没有此id的数据才会执行数据库查询Q?/span>

如果此记录已?/span>sql直接删除Q则iterate在执?/span>id查询时不会将?/span>id查询出来。所以,即便~存中有此条记录也不会被客户获得Q也? 不存在不一致的情况。(此情늻q测试验证)

c. ?/span>get?/span>loadҎ?/span>id执行查询Q?/span>

客观上此时会查询得到已过期的数据。但是又因ؓpȝ中执?span style="font-size: 12pt;">sql扚w删除一般是

针对中间兌数据表,对于

中间兌表的查询一般都是采用条件查?/span> ,?/span>id来查询某一条关联关pȝ几率很低,所以此问题也不存在!

   如果某个值对象确实需要按id查询一条关联关p?/span>,同时又因为数据量大?/span>?/span>sql执行扚w删除。当满此两个条件时,Z保证?/span>id 的查询得到正的l果,可以使用手动清楚二~存中此对象的数据的Ҏ!!

(此种情况出现的可能性较?/span>)

1.5.  

1、徏议不要?/span>sql直接执行数据持久化对象的数据的更斎ͼ但是可以执行扚w删除。(pȝ中需要批量更新的地方也较)

2、如果必M?/span>sql执行数据的更斎ͼ必须清空此对象的~存数据。调?/span>

SessionFactory.evict(class)

SessionFactory.evict(class,id)

{方法?/span>

3、在扚w删除数据量不大的时候可以直接采?/span>hibernate的批量删除,q样׃存在l开hibernate执行sql产生的缓存数据一致性的问题?/span>

4、不推荐采用hibernate的批量删除方法来删除大批量的记录数据?/span>

原因?/span>hibernate的批量删除会执行1条查询语句外?/span>满条g?/span>n条删除语句。而不是一ơ执行一条条件删除语句!Q?/span>

当待删除的数据很多时会有很大的性能瓉Q!Q如果批量删除数 据量较大,比如过50?/span>,可以采用JDBC直接删除。这样作的好处是只执行一?/span>sql删除语句,性能会有很大的改善。同Ӟ~存数据同步的问?/span>,可以采用 hibernate? 除二U缓存中的相x据的Ҏ?/span>

调用 SessionFactory.evict(class) Q?/span>SessionFactory.evict(class,id){方法?/span>

所以说Q对于一般的应用pȝ开发而言Q不涉及到集,分布式数 据同步问题等Q,因ؓ只在中间兌表执行批量删除时调用?/span>sql执行Q同时中间关联表一般是执行条g查询不太可能执行?/span>id查询。所以,此时可以直接执行sql删除Q甚至不需要调用缓存的清除Ҏ。这样做不会D以后配置 了二U缓存引h据有效性的问题?/span>

退一步说Q即使以后真的调用了?/span>id查询中间表对象的ҎQ也可以通过调用清除~存的方法来解决?/span>

4、具体的配置Ҏ 

Ҏ我了解的很多hibernate的用者在调用其相应方法时都迷信的怿“hibernate会自行ؓ我们处理性能的问?#8221;Q或 ?#8220;hibernate会自动ؓ我们的所有操作调用缓?#8221;,实际的情冉|hibernate虽然为我们提供了很好的缓存机制和扩展~存框架的支持,但是? ȝq正的调用其才有可能发挥作用!Q所以造成很多使用hibernate的系l的性能问题Q实际上q不是hibernate不行或者不好,而是因ؓ? 用者没有正的了解其用方法造成的。相反,如果配置得当hibernate的性能表现会让你有相当“惊喜?#8221;发现。下面我讲解具体的配|方?

 ibernate提供了二U缓存的接口Q?
net.sf.hibernate.cache.Provider,
? 时提供了一个默认的 实现net.sf.hibernate.cache.HashtableCacheProviderQ?
也可以配|? 其他的实?比如ehcache,jbosscache{?

具体的配|位|位于hibernate.cfg.xml文g?
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.provider_class">net.sf.hibernate.cache.HashtableCacheProvider</property>

很多的hibernate使用者在 配置?q一?׃?完事了,
注意Q其实光q样配,Ҏ 没有用hibernate的二U缓存。同时因Z们在使用hibernate时大多时候是马上关闭sessionQ所以,一U缓存也没有起到M? 用。结果就是没有用Q何缓存,所有的hibernate操作都是直接操作的数据库Q!性能可以惌?

正确的办法是除了以上的配|外q应该配|每一个vo对象的具体缓存策略,在媄文件中配置。例如:

<hibernate-mapping>
<class name="com.sobey.sbm.model.entitySystem.vo.DataTypeVO" table="dcm_datatype">
<cache usage="read-write"/>
<id name="id" column="TYPEID" type="java.lang.Long">
<generator class="sequence"/>
</id>

<property name="name" column="NAME" type="java.lang.String"/>
<property name="dbType" column="DBTYPE" type="java.lang.String"/>
</class>
</hibernate-mapping>


关键是q个<cache usage="read-write"/>Q其有几个选择
read- only,read-write,transactional,{?
然后在执行查询时 注意? Q如果是条g查询Q或者返回所有结果的查询Q此时session.find()Ҏ 不会获取~存中的数据。只有调用query.iterate()Ҏ时才会调~存的数据?

同时 get ?loadҎ 是都会查询缓存中的数?.

对于不同的缓存框架具体的配置Ҏ会有不同Q但是大体是以上的配|?/font>

Q另外,对于支持事务型,以及支持集群的环境的配置我会争取在后l的文章中中 发表出来Q?/font>

3.     ȝ

M是根据不同的业务情况和项目情? ?/span>hibernateq行有效的配|和正确的用,扬长避短。不存在适合于Q何情늚一?#8220;万能”的方案?/span>

以上l论及徏议均建立在自己在?/span> Hibernate 2.1.2中的试l果以及以前的项目经验的基础上。如有谬处,h家提 出指?)!

最后,大? 新年快乐Q!在新的一q里 取得人生的进步!Q!



X-Spirit 2010-03-23 11:21 发表评论
]]>
NetBeans中配|OperaMask+Spring+JPA教程http://m.tkk7.com/zhangwei217245/archive/2010/03/17/306338.htmlX-SpiritX-SpiritWed, 17 Mar 2010 05:33:00 GMThttp://m.tkk7.com/zhangwei217245/archive/2010/03/17/306338.htmlhttp://m.tkk7.com/zhangwei217245/comments/306338.htmlhttp://m.tkk7.com/zhangwei217245/archive/2010/03/17/306338.html#Feedback0http://m.tkk7.com/zhangwei217245/comments/commentRss/306338.htmlhttp://m.tkk7.com/zhangwei217245/services/trackbacks/306338.html创徏目Q?/h4>

打开NetBeans 6.5.1Q选择文g—》新建项目,选择Java WebQ然后在目列表中选择 Web 应用E序Q下一?

clip_image002

选择使用专用文g夹存储库Q指定库文g夹的位置Q通常是默认的.\libQ即目文g夹下的lib文g夹,下一?

clip_image004

选择Web应用服务器。这里选择Tomcat 6.0.18 QJava EE版本选择 Java EE 5Q下一?

clip_image006

在框架对话框中什么都不选择Q直接点d成?

配置目Q?/h4>

1. 配置OperaMask

在WEB-INF文g夹下新徏一个faces-config.xml文gQ内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2">

<application>

<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>

</application>

</faces-config>

在新创徏的项目中Q右键单?#8220;?#8221;节点Q选择d?

clip_image008

然后选择导入Q选择Spring 2.5库,选择导入库,d库?

clip_image010

再次选择d库,然后选择创徏。库名称为OperaMaskQ库cd为类库:

clip_image012

?#8220;定制?#8221;中选择“dJAR/文g?#8221;Q在弹出的对话框中选择OperaMask的基本jar包,q将导入方式指定为:复制到库文g夏V?

clip_image014

一路选是?

2. 配置Spring以及与OperaMask的整?/strong>

然后再创Z个OperaMask_SpringCompatibility库,OperaMask中的spring文g夹下的operamasks-spring.jardq来

然后在新创徏的项目中展开WEB-INF文g夹,打开web.xmlQ按照OperaMask包中的blank样例E序的配|进行配|?

之后Q在web.xml中配|如下内容:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext*.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

然后Q在源包节点下创建Spring配置文gapplicationContext.xmlQ选择如图所C的几个命名I间Q?

clip_image016

clip_image018

选择完成Q然后在Beans节点之间d如下内容Q?

<!-- 开启基于注解的配置 -->

<context:annotation-config/>

<!-- ?AOM 中的 LiteBean 同样能够?Spring 所感应?-->

<bean class="org.operamasks.faces.spring.ManagedBeanConfigurer"/>

3. 配置JPA持久化支?/strong>

在服务选项卡中Q选择MySQL数据库驱动,然后右键单击Q选择q接讄Q配|你要用的数据库:

clip_image020

数据库配|完毕,然后回到目选项卡,右键单击刚创建的目Q选择新徏-->其它-->持久?->持久性单?

clip_image022

在新建持久性单元对话框中选择持久性库为HibernateQ即选择Hibernate为JPA持久单元的实玎ͼ数据库连接选择我们刚配|好的MySQLq接?

clip_image024

单击完成。此ӞHibernate的JPA库已l被d到项目的lib目录下了。包含了基本的Hibernate jar包和Hibernate JPA支持jar包?

注:使用JPA的一个好处就是我们不需要在一个统一的配|文仉|列所有的实体c,而是可以让实体管理器自动扫描所有被@Entity注解了的实体cR要实现q种功能Q如果项目的JPA实现q移到TopLink EssentialQ需要加入下面的配置Q?

扑ֈ目中的“配置文g”节点Q打开persistence.xml文gQ调整到XML视图中,?lt;provider> </provider>节点后添加:

<exclude-unlisted-classes>false</exclude-unlisted-classes> 一行。如果希望用Hibernate实现Q请一定不要加入这一行,否则Q您必须您创徏的所有实体类逐一d到persistence.xml中?

如果要用Spring提供的JpaTemplateQ即实现JpaDaoSupport方式Q,则回到spring的applicationContext.xml文gQ在<beans>节点里面dQ?

<!-- 利用Spring的实体管理器工厂来创建JPA实体理器,传入的参Cؓpersistence.xml中指定的持久化单元名U?-->

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">

<property name="persistenceUnitName" value="DMCSv1PU"/>

</bean>

<!-- 声明一个Spring提供的JPA事务理器,传入的参数正是Spring中的实体理器工?-->

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">

<property name="entityManagerFactory" ref="entityManagerFactory"/>

</bean>

<!-- 开启Spring提供的基于注解的声明式事务管?-->

<tx:annotation-driven transaction-manager="txManager"/>

xQ持久化支持配置完毕?

创徏实体cd相应的JPA控制c?/h4>

右键单击目Q选择新徏-->其它-->持久?->通过数据库生成实体类Q选择数据库表Q?

clip_image026

点击下一步,输入合适的包名

clip_image028

下一步,映射选项如下图所C:

clip_image030

选择新徏-->其它-->持久?->Z实体cȝJPA控制器类Q下一步:

clip_image032

d要生成控制器cȝ实体c,下一步:

clip_image034

选择合适的包,然后完成?

clip_image036

后面的配|无非就是将JPA的控制器cd入Spring的配|文Ӟ然后在AOM的LiteBean中注入这些控制器c,实现数据库操作以及相应的业务逻辑?

注:解决Spring与Hibernate JPA的冲H:

clip_image038

如上图所C:选择工具--> ?--> 库位|?->选择当前~辑的项目,选中Spring Framework 2.5Q然后去掉cglib2.2那个jar包。这个包与Hibernate JPA中的cglib 2.1.3.jar有冲H?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


文章来源:http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!776.entry

X-Spirit 2010-03-17 13:33 发表评论
]]> վ֩ģ壺 24СʱѿƬ| Ʒվ | ۺһƷ| ߳׽ˮAƬ | ɫ͵͵ۺAV| һëƬѲ| һAV| һ| AVվ߹ۿ| aƬ߲| һ| һ˿www߹ۿ| һ| ѹۿƬëƬ| ŷպɫ| ٸѾƷ| aëƬþѹۿ| þù޸ۿ| þòþüӰԺ| AVɫɫWWW| avרavý | ༤רС˵ͼƬ| aһƬ| СƵ߹ۿ| 91ƷӾʢ| ؼëƬƵ | þþþavר| 999ھƷѹۿ| պ| ޺ݺݰۺӰԺ| ˾þվ| jizz| һֻ| Ļȫ| ŷ| ˾Ʒձվ| Ů18ëƬˮѹۿ| ߹ۿƬAVվ| ɫͼƬС˵| ޳AVƬ| ޳avƬһ|