J2EE的SSH框架的搭建和性能优化毕业论文_第1页
J2EE的SSH框架的搭建和性能优化毕业论文_第2页
J2EE的SSH框架的搭建和性能优化毕业论文_第3页
J2EE的SSH框架的搭建和性能优化毕业论文_第4页
J2EE的SSH框架的搭建和性能优化毕业论文_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

保定电力职业技术学院顶岗实习技术应用论文题目J2EE的SSH框架的搭建和性能优化系部信息工程与管理系专业班级软件1101班学生姓名李朝云指导教师指导教师姓名二一四年三月三日保定电力职业技术学院顶岗实习技术应用(论文)2目录J2EE的SSH框架的搭建和性能优化4摘要41引言42SPRINGSTRUTSHIBERNATE简介421STRUTS框架结构4211MODEL部分5212VIEW部分5213CONTROLLER组件522SPRING5221轻量5222控制反转6223面向切面6224容器6225框架623HIBERNATE6231SESSION接口7232SESSIONFACTORY接口7233CONFIGURATION接口7234TRANSACTION接口7235QUERY和CRITERIA接口73阐述SSH整合框架731集成SSH框架74基于SSH框架的WEB应用系统的实现841数据持久层842业务逻辑层943表示层105SSH性能的优化1151STRUTS优化11511LOGGING和开发模式11512拦截器11513缓存和过期时间11514AJAXTHEMEDOJO或者CALENDAR标签11515FREEMARK载入模板11516FREEMARK模板缓存12517模板路径12518SESSION12保定电力职业技术学院顶岗实习技术应用(论文)3519标签的使用1252SPRING优化1353HIBERNATE优化14531、数据库设计14533、主配置14534、缓存14535、延迟加载15536、方法选用15537、集合的选用15538、事务控制16539、批量操作165310、HIBERNATE的缓存165311HIBERNATE性能调优186结语21致谢22参考文献23保定电力职业技术学院顶岗实习技术应用(论文)4J2EE的SSH框架的搭建和性能优化姓名李朝云班级软件1101班学号180111121摘要针对当前WEB应用程序开发面临的问题,结合目前比较流行的开源框架SPRING、STRUTS和HIBERNATE,提出了一种开发J2EEWEB应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的WEB应用程序。并且,通过案例具体说明了如何将这一方案应用到实际项目中。关键词J2EEMVCSTRUTSSPRINGHIBERNATE1引言大型企业级WEB应用系统的开发通常要求有一个良好的软件架构、便于协作开发和扩展升级,而传统的开发模式不能很好地满足这些要求。本文针对当前WEB应用程序开发面临的问题,结合目前比较流行的开源框架SSH(SPRING、STRUTS、HIBERNATE,提出一种开发J2EE企业级WEB应用的轻量级解决方案,并通过案例具体说明如何将这一方案应用到实际项目中。2SPRINGSTRUTSHIBERNATE简介SSH在J2EE项目中表示了3种框架,即SPRINGSTRUTSHIBERNATE。STRUTS对MODEL,VIEW和CONTROLLER都提供了对应的组件。SPRING是一个轻量级的控制反转IOC和面向切面AOP的容器框架,它由RODJOHNSON创建。它是为了解决企业应用开发的复杂性而创建的。SPRING使用基本的JAVABEAN来完成以前只可能由EJB完成的事情。HIBERNATE是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,可以应用在任何使用JDBC的场合,可以在SERVLET/JSP的WEB应用中使用,也可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。21STRUTS框架结构如图保定电力职业技术学院顶岗实习技术应用(论文)5STRUTS对MODEL,VIEW和CONTROLLER都提供了对应的组件。在右图中,ACTIONSERVLET,这个类是STRUTS的核心控制器,负责拦截来自用户的请求。ACTION,这个类通常由用户提供,该控制器负责接收来自ACTIONSERVLET的请求,并根据该请求调用模型的业务逻辑方法处理请求,并将处理结果返回给JSP页面显示。211MODEL部分由ACTIONFORM和JAVABEAN组成,其中ACTIONFORM用于封装用户的请求参数,封装成ACTIONFORM对象,该对象被ACTIONSERVLET转发给ACTION,ACTION根据ACTIONFORM里面的请求参数处理用户的请求。JAVABEAN则封装了底层的业务逻辑,包括数据库访问等。212VIEW部分该部分采用JSP实现。STRUTS提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与MODEL的有效交互,并增加了现实功能。对应上图的JSP部分。213CONTROLLER组件CONTROLLER组件有两个部分组成系统核心控制器,业务逻辑控制器。系统核心控制器,对应上图的ACTIONSERVLET。该控制器由STRUTS框架提供,继承HTTPSERVLET类,因此可以配置成标注的SERVLET。该控制器负责拦截所有的HTTP请求,然后根据用户请求决定是否要转给业务逻辑控制器。业务逻辑控制器,负责处理用户请求,本身不具备处理能力,而是调用MODEL来完成处理。对应ACTION部分。22SPRING简介目的解决企业应用开发的复杂性功能使用基本的JAVABEAN代替EJB,并提供了更多的企业应用功能范围任何JAVA应用简单来说,SPRING是一个轻量级的控制反转IOC和面向切面AOP的容器框架。221轻量从大小与开销两方面而言SPRING都是轻量的。完整的SPRING框架可以在一个大小只有1MB多的JAR文件里发布。并且SPRING所需的处理开销也是微不足道的。此外,保定电力职业技术学院顶岗实习技术应用(论文)6SPRING是非侵入式的典型地,SPRING应用中的对象不依赖于SPRING的特定类。222控制反转SPRING通过一种称作控制反转(IOC)的技术促进了松耦合。当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IOC与JNDI相反不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。223面向切面SPRING提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(AUDITING)和事务(TRANSACTION)管理)进行内聚性的开发。应用对象只实现它们应该做的完成业务逻辑仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。224容器SPRING包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个BEAN如何被创建基于一个可配置原型(PROTOTYPE),你的BEAN可以创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。然而,SPRING不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。225框架SPRING可以将简单的组件配置、组合成为复杂的应用。在SPRING中,应用对象被声明式地组合,典型地是在一个XML文件里。SPRING也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。所有SPRING的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为SPRING中的各种模块提供了基础支持。23HIBERNATE简介HIBERNATE是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得JAVA程序员可以随心所欲的使用对象编程思维来操纵数据库。HIBERNATE可以应用在任何使用JDBC的场合,既可以在JAVA的客户端程序使用,也可以在SERVLET/JSP的WEB应用中使用,最具革命意义的是,HIBERNATE可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。HIBERNATE的核心接口一共有5个,分别为SESSION、SESSIONFACTORY、TRANSACTION、QUERY和CONFIGURATION。这5个核心接口在任何开发中都会用到。通过这些接口,保定电力职业技术学院顶岗实习技术应用(论文)7不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。231SESSION接口SESSION接口负责执行被持久化对象的CRUD操作CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。但需要注意的是SESSION对象是非线程安全的。同时,HIBERNATE的SESSION不同于JSP应用中的HTTPSESSION。这里当使用SESSION这个术语时,其实指的是HIBERNATE中的SESSION,而以后会将HTTPSESION对象称为用户SESSION。232SESSIONFACTORY接口SESSIONFACTORY接口负责初始化HIBERNATE。它充当数据存储源的代理,并负责创建SESSION对象。这里用到了工厂模式。需要注意的是SESSIONFACTORY并不是轻量级的,因为一般情况下,一个项目通常只需要一个SESSIONFACTORY就够,当需要操作多个数据库时,可以为每个数据库指定一个SESSIONFACTORY。233CONFIGURATION接口CONFIGURATION接口负责配置并启动HIBERNATE,创建SESSIONFACTORY对象。在HIBERNATE的启动的过程中,CONFIGURATION类的实例首先定位映射文档位置、读取配置,然后创建SESSIONFACTORY对象。234TRANSACTION接口TRANSACTION接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。235QUERY和CRITERIA接口QUERY和CRITERIA接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。3阐述SSH整合框架SSH在J2EE项目中表示了3种框架。那么怎样将三者结合起来形成一个框架呢31集成SSH框架集成SSH框架的系统从职责上分为四层表示层、业务逻辑层、数据持久层和域模块层。其中使用STRUTS作为系统的整体基础架构,负责MVC的分离,在STRUTS框架的模型部分,利用HIBERNATE框架对持久层提供支持,业务层用SPRING支持。具体做法是用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的JAVA保定电力职业技术学院顶岗实习技术应用(论文)8对象,然后编写基本的DAO接口,并给出HIBERNATE的DAO实现,采用HIBERNATE架构实现的DAO类来实现JAVA类与数据库之间的转换和访问,最后由SPRING完成业务逻辑。系统的基本业务流程是在表示层中,首先通过JSP页面实现交互界面,负责传送请求REQUEST和接收响应RESPONSE,然后STRUTS根据配置文件STRUTSCONFIGXML将ACTIONSERVLET接收到的REQUEST委派给相应的ACTION处理。在业务层中,管理服务组件的SPRINGIOC容器负责向ACTION提供业务模型MODEL组件和该组件的协作对象数据处理DAO组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于HIBERNATE的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率。4基于SSH框架的WEB应用系统的实现下面将通过一个实际的系统来展示如何进行基于SSH框架的WEB应用开发。该系统是为某通信公司运营部开发的一个问答式系统,功能类似于百度知道和新浪爱问。由于系统的模块较多,下面就以一个用户管理模块为例来说明系统的开发实现过程,并将按照数据持久层、业务逻辑层、表示层的顺序说明系统构建过程。41数据持久层数据持久层由JAVA对象持久化类和数据访问对象DAO组成。每个数据库表都对应着一个持久化对象,这样就给予了开发者使用OO思想设计和开发的便利,同时也屏蔽了具体的数据库和具体的数据表、字段,消除了对数据库操作的硬编码在重用性上的弊端。用户信息表的部分结构如表1所HIBERNATE通过映射MAPPING文件将对象OBJECT与关系型数据RELATIONAL相关联,因此需要编写和数据库表相对应的JAVA持久化类以及对应的映射文件。有了JAVA持久化类后就可以在此基础上实现数据访问类。在SPRING框架中,数据访问类可以从辅助类HIBERNATEDAOSUPPORT继承,这极大地方便了HIBERNATE框架在SPRING中的使用,相应的部分代码如下PUBLICCLASSUSERDAOEXTENDSHIBERNATEDAOSUPPORTPUBLICINTADDUSERUSERRETURNINTEGERPARSEINTTHISGETHIBERNATETEMPLATESAVEUSERTOSTRINGPUBLICLISTFINDALL保定电力职业技术学院顶岗实习技术应用(论文)9RETURNTHISGETHIBERNATETEMPLATELOADALLUSERCLASS具体的HIBERNATE数据源、SESSION工厂、事务管理、缓冲连接池等功能都由业务层的SPRING容器提供。42业务逻辑层业务逻辑层由SPRING框架支持,提供了处理业务逻辑的服务组件。开发者需要对业务对象建模,抽象出业务模型并封装在MODEL组件中。由于数据持久层实现了JAVA持久化类并且封装了数据访问对象DAO,因此可以在MODEL组件中方便地调用DAO组件来存取数据。SPRING的IOC容器负责统一管理MODEL组件和DAO组件以及SPRING所提供的事务处理、缓冲连接池等服务组件。在用户管理模块中,通过业务建模创建了用户模型USERSERVICE类,封装了对用户的权限管理以及积分管理等功能。USERSERVICE类通过调用数据访问类USERDAO实现对用户数据的操作。这些组件的关系将通过配置SPRING框架的APPLICATIONCONTEXTXML联系起来,配置文件的主要内容如下COMUNIWINZWDCBASEMODELREGIONCOM/UNIWIN/MODEL/CLASSHIBERNATEDIALECTORGHIBERNATECACHEEHCACHEPROVIDERTRUEHIBERNATESHOW_SQLHIBERNATEAUTO43表示层表示层结合JSP和STRUTS的TAGLIB库处理显示功能,利用ACTIONSERVLET将请求DO映射到相应的ACTION,并由ACTION调用业务逻辑的服务组件,然后根据处理结果跳转到FORWORD对象指定的响应页面。业务流程的部署由STRUTSCONFIGXML完成。下面以一个显示所有用户信息的请求LISTUSERDO为例来说明配置文件的使用。基于J2EE的WEB应用以其层次性、平台无关性的优势已经逐渐成为了电子商务、电子政务主要的解决方案。本文针对传统的J2EEWEB应用开发的弊端,介绍了一种利用轻量级框架来快速搭建WEB应用的解决方案,并且通过其在实际项目中的应用,保定电力职业技术学院顶岗实习技术应用(论文)11证明了采用此方案可以帮助开发人员在短时间内建立结构清晰、可重用性好、维护扩展方便的WEB应用程序。5SSH性能的优化51STRUTS优化511LOGGING和开发模式关闭LOGGING和开发模式DEVMODE,DEVMODE是在STRUTSPROPERTIES中设置的,关闭LOGGING需要修改WEBXML文件,加入以下参数DEBUG0DETAIL0512拦截器除非需要,否则不要使用拦截器INTERCEPTOR如果一个ACTION不需要全栈的拦截器的话,就使用BASICSTACK拦截器或移除不需要的拦截器。513缓存和过期时间正确设置页面的CACHECONTROL和EXPIRES使用正确的HTTP头(缓存控制和过期时间)当返回一个HTML页面的时候,要保证HTML页面包含正确的HEADER,使得浏览器可以知道怎样缓存该HTML页面。514AJAXTHEMEDOJO或者CALENDAR标签STRUTS2提供的AJAXTHEMEDOJO或者CALENDAR标签默认情况下保存在STRUTSJAR包里面,把这些JS文件或者CSS文件拷出来放到另外一个服务器上可以提高性能。当使用AJAXTHEME(DOJO)或日历TAG时,从STRUTS2的JAR包复制静态内容到HTTP服务器。因为HTTP服务器会对这些静态文件的请求进行优化515FREEMARK载入模板如果使用FREEMARKER的话,在WEBINF下的CLASSES文件夹下创建一个FREEMARKERPROPERTIES并且加入TEMPLATE_UPDATE_DELAY60000,这个值是FREEMARKER多久从硬盘重新载入模板,保定电力职业技术学院顶岗实习技术应用(论文)12默认情况下是500MS,因为没有必要检查是不是需要重新载入模板文件,所以最好把它设置为一个很大的数字。516FREEMARK模板缓存启用FREEMARKER模板缓存,这是STRUTSFREEMARKERTEMPLATESCACHE为TRUE,默认情况下这个是FALSE的。517模板路径当覆盖一个THEME时,COPY所有重要的模板到THEME目录当TEMPLATE在当前目录不能发现时,会有性能开销。因为在返回父模板前,STRUTS2必须在当前目录进行THEME检查晚先时候,这个缺陷将要通过一个TEMPLATE缓存解决。518SESSION在你需要的时候才创建SESSION除非需要,STRUTS2不会创建SESSIONS比如,在你的拦截器STACK中有CREATESESSION拦截器。注意当使用SITEMESH时,一个SESSION将总是被创建看看HTTP/FORUMSOPENSYMPHONYCOM/THREADJSPAMESSAGEID5688的描述519标签的使用当使用FREEMARKER时,尽量使用等价的FREEMARKER元素,代替JSP的标签。FREEMARKER支持LIST迭代,显示属性,包含其他模版,MACROS等等使用等价的FREEMARKER元素代替STRUTS2的TAGS会有小的性能提升。例如将要被FOO代替1STRUTS2341JAR,XWORKCORE234JAR,FREEMARKER升级为23192OGNL升级为305(JAVASSIST3110JAR)3根包下增加FREEMARKERPROPERTIES文件,内容为TEMPLATE_UPDATE_DELAY600004STRUTSXML增加和5把STRUTSXML中的默认拦截器定义为BASICSTACK执行了这几步之后,网站性能从5REQ/S提升至70REQ/S,请求处理时间从22S/REQ缩减至2S/REQ保定电力职业技术学院顶岗实习技术应用(论文)1352SPRING优化DEFAULTAUTOWIRE“NO“/自动装配设为否,当我们依赖注入的时候,用SET,GET方法,然后在SPRING配置文件中手动装配以上这是手动装配,还可以自动装配,这样就不用写属性了,直接就可以,自动装配有几个配置BYNAME试图在容器中寻找和需要自动装配的属性名相同的BEAN或ID,如果没有找到相应的BEAN,则这个属性未被装配上。BYTYPE试图在容器中寻找一个与需要自动装配的属性类型相同的BEAN或ID,如果没有找到,则该属性未被装配上。CONSTRUCTOR试图在容器中寻找与需要自动装配的BEAN的构造函数参数一致的一个或多个BEAN,如果没找到则抛出异常。AUTODETECT首先尝试使用CONSTRUCTOR来自动装配,然后再使用BYTYPE方式。最常用的就是DEFAULTAUTOWIRE“BYNAME“,这样只写就可以,系统会自动查找和名字相关的来装配依赖注入的。DEFAULTLAZYINIT“TRUE“延迟加载设为TRUE,这样当SPRING启动时就不会一次加载所有的BEAN了,当GETBEAN的时候才会被加载保定电力职业技术学院顶岗实习技术应用(论文)1453HIBERNATE优化初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。531、数据库设计A降低关联的复杂性B尽量不使用联合主键CID的生成机制,不同的数据库所提供的机制并不完全一样D适当的冗余数据,不过分追求高范式532、HQL优化HQL如果抛开它同HIBERNATE本身一些缓存机制的关联,HQL的优化技巧同普通的SQL优化技巧一样,可以很容易在网上找到一些经验之谈。533、主配置A查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据。但是,查询缓存在一个交易系统数据变更频繁,查询条件相同的机率并不大中可能会起反作用它会白白耗费大量的系统资源但却难以派上用场。BFETCH_SIZE,同JDBC的相关参数作用类似,参数并不是越大越好,而应根据业务特征去设置CBATCH_SIZE同上。D生产系统中,切记要关掉SQL语句打印。534、缓存A数据库级缓存这级缓存是最高效和安全的,但不同的数据库可管理的层次并不一样,比如,在ORACLE中,可以在建表时指定将整个表置于缓存当中。BSESSION缓存在一个HIBERNATESESSION有效,这级缓存的可干预性不强,大多于HIBERNATE自动管理,但它提供清除缓存的方法,这在大批量增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OUTOFMEMEROY的异常,这时可能需要手动清除这一级缓存SESSIONEVICT以及SESSIONCLEARC应用缓存在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此,各类策略也考虑的较多,在将数据放入这一级缓存之前,需要考虑一些前提条件I数据不会被第三方修改比如,是否有另一个应用也在修改这些数据II数据不会太大III数据不会频繁更新否则使用CACHE可能适得其反IV数据会被频繁查询V数据不是关键数据如涉及钱,安全等方面的问题。缓存有几种形式,可以在映射文件中配置READONLY只读,适用于很少变更的保定电力职业技术学院顶岗实习技术应用(论文)15静态数据/历史数据,NONSTRICTREADWRITE,READWRITE比较普遍的形式,效率一般,TRANSACTIONALJTA中,且支持的缓存产品较少D分布式缓存同C的配置一样,只是缓存产品的选用不同,在目前的HIBERNATE中可供选择的不多,OSCACHE,JBOSSCACHE,目前的大多数项目,对它们的用于集群的使用特别是关键交易系统都持保守态度。在集群环境中,只利用数据库级的缓存是最安全的。535、延迟加载A实体延迟加载通过使用动态代理实现B集合延迟加载通过实现自有的SET/LIST,HIBERNATE提供了这方面的支持C属性延迟加载536、方法选用A完成同样一件事,HIBERNATE提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会有影响。显示,一次返回十万条记录LIST/SET/BAG/MAP等进行处理,很可能导致内存不够的问题,而如果用基于游标SCROLLABLERESULTS或ITERATOR的结果集,则不存在这样的问题。BSESSION的LOAD/GET方法,前者会使用二级缓存,而后者则不使用。CQUERY和LIST/ITERATOR,如果去仔细研究一下它们,你可能会发现很多有意思的情况,二者主要区别如果使用了SPRING,在HIBERNATETEMPLATE中对应FIND,ITERATOR方法ILIST只能利用查询缓存但在交易系统中查询缓存作用不大,无法利用二级缓存中的单个实体,但LIST查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条无关联。IIITERATOR则可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用ITERATOR会产生N1条SQL语句N为符合条件的记录数III通过ITERATOR,配合缓存管理API,在海量数据查询中可以很好的解决内存问题,如WHILEITHASNEXTYOUOBJECTOBJECTYOUOBJECTITNEXTSESSIONEVICTYOUOBJECTSESSIONFACTORYEVICEYOUOBJECTCLASS,YOUOBJECTGETID如果用LIST方法,很可能就出OUTOFMEMORY错误了。IV通过上面的说明,我想你应该知道如何去使用这两个方法了。537、集合的选用在HIBERNATE31文档的“195UNDERSTANDINGCOLLECTIONPERFORMANCE”保定电力职业技术学院顶岗实习技术应用(论文)16中有详细的说明。538、事务控制事务方面对性能有影响的主要包括事务方式的选用,事务隔离级别以及锁的选用A事务方式选用如果不涉及多个事务管理器事务的话,不需要使用JTA,只有JDBC的事务控制就可以。B事务隔离级别参见标准的SQL事务隔离级别C锁的选用悲观锁一般由具体的事务管理器实现,对于长事务效率低,但安全。乐观锁一般在应用级别实现,如在HIBERNATE中可以定义VERSION字段,显然,如果有多个应用操作数据,且这些应用不是用同一种乐观锁机制,则乐观锁会失效。因此,针对不同的数据应有不同的策略,同前面许多情况一样,很多时候我们是在效率与安全/准确性上找一个平衡点,无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解。539、批量操作即使是使用JDBC,在进行大批数据更新时,BATCH与不使用BATCH有效率上也有很大的差别。我们可以通过设置BATCH_SIZE来让其支持批量操作。举个例子,要批量删除某表中的对象,如“DELETEACCOUNT”,打出来的语句,会发现HIBERNATE找出了所有ACCOUNT的ID,再进行删除,这主要是为了维护二级缓存,这样效率肯定高不了,在后续的版本中增加了BULKDELETE/UPDATE,但这也无法解决缓存的维护问题。也就是说,由于有了二级缓存的维护问题,HIBERNATE的批量操作效率并不尽如人意从前面许多要点可以看出,很多时候我们是在效率与安全/准确性上找一个平衡点,无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解,一般的,优化方案应在架构设计期就基本确定,否则可能导致没必要的返工,致使项目延期,而作为架构师和项目经理,还要面对开发人员可能的抱怨,必竟,我们对用户需求更改的控制力不大,但技术/架构风险是应该在初期意识到并制定好相关的对策。还有一点要注意,应用层的缓存只是锦上添花,永远不要把它当救命稻草,应用的根基数据库设计,算法,高效的操作语句,恰当API的选择等才是最重要的。5310、HIBERNATE的缓存1、首先设置EHCACHE,建立配置文件EHCACHEXML,默认的位置在CLASSPATH,可以放到你的SRC目录下保定电力职业技术学院顶岗实习技术应用(论文)17XMLVERSION“10“ENCODING“UTF8“EHCACHEDISKSTOREPATH“JAVAIOTMPDIR“/DEFAULTCACHEMAXELEMENTSINMEMORY“10000“缓存最大数目ETERNAL“FALSE“缓存是否持久OVERFLOWTODISK“TRUE“是否保存到磁盘,当系统当机时TIMETOIDLESECONDS“300“当缓存闲置N秒后销毁TIMETOLIVESECONDS“180“当缓存存活N秒后销毁DISKPERSISTENT“FALSE“DISKEXPIRYTHREADINTERVALSECONDS“120“/EHCACHE2、在HIBERNATE配置文件中设置设置HIBERNATE的缓存接口类,这个类在HIBERNATE包中PROPERTYNAME“CACHEPROVIDER_CLASS“ORGHIBERNATECACHEEHCACHEPROVIDER/PROPERTY是否使用查询缓存PROPERTYNAME“HIBERNATECACHEUSE_QUERY_CACHE“TRUE/PROPERTY如果使用SPRING调用HIBERNATE的SESSIONFACTORY的话,这样设置HIBERNATESESSION工厂管理BEANID“SESSIONFACTORY“CLASS“ORGSPRINGFRAMEWORKORMHIBERNATE3LOCALSESSIONFACTORYBEAN“PROPERTYNAME“DATASOURCE“REFBEAN“DATASOURCE“/PROPERTYPROPERTYNAME“HIBERNATEPROPERTIES“PROPSPROPKEY“HIBERNATEDIALECT“ORGHIBERNATEDIALECTORACLE9DIALECT/PROPPROPKEY“CONNECTIONPROVIDER_CLASS“ORGHIBERNATECONNECTIONC3P0CONNECTIONPROVIDER/PROPPROPKEY“HIBERNATESHOW_SQL“TRUE/PROPPROPKEY“HIBERNATECACHEUSE_QUERY_CACHE“TRUE/PROPPROPKEY“HIBERNATECACHEPROVIDER_CLASS“ORGHIBERNATECACHEEHCACHEPROVIDER/PROP/PROPS/PROPERTYPROPERTYNAME“MAPPINGDIRECTORYLOCATIONS“LISTVALUE/WEBINF/CLASSES/CN/RMIC/MANAGER/HIBERNATE/VALUE/LIST保定电力职业技术学院顶岗实习技术应用(论文)18/PROPERTY/BEAN说明一下如果不设置“查询缓存”,那么HIBERNATE只会缓存使用LOAD方法获得的单个持久化对象,如果想缓存使用FINDALL、LIST、ITERATOR、CREATECRITERIA、CREATEQUERY等方法获得的数据结果集的话,就需要设置HIBERNATECACHEUSE_QUERY_CACHETRUE才行3、在HBM文件中添加CACHEUSAGE“READONLY“/4、如果需要“查询缓存”,还需要在使用QUERY或CRITERIA时设置其SETCACHEABLETRUE属性5311HIBERNATE性能调优一。INVERSEINVERSEFALSEDEFAULT用于单向ONETOMANY关联PARENTGETCHILDRENADDCHILD/INSERTCHILDPARENTGETCHILDRENDELETECHILD/DELETECHILDINVERSETRUE用于双向ONETOMANY关联CHILDSETPARENTPARENTSESSIONSAVECHILD/INSERTCHILDSESSIONDELETECHILD在分层结构的体系中PARENTDAO,CHILDDAO对于CRUD的封装导致往往直接通过SESSION接口持久化对象,而很少通过关联对象可达性二。ONETOMANY关系单向关系还是双向关系PARENTGETCHILDRENADDCHILD对集合的触及操作会导致LAZY的集合初始化,在没有对集合配置二级缓存的情况下,应避免此类操作SELECTFROMCHILDWHEREPARENT_IDXXX性能口诀1一般情况下避免使用单向关联,尽量使用双向关联2使用双向关联,INVERSE“TRUE”3在分层结构中通过DAO接口用SESSION直接持久化对象,避免通过关联关系进行可达性持久化三。MANYTOONE关系单向MANYTOONE表达了外键存储方灵活运用MANYTOONE可以避免一些不必要的性能问题保定电力职业技术学院顶岗实习技术应用(论文)19MANYTOONE表达的含义是0N1,MANY可以是0,可以是1,也可以是N,也就是说MANYTOONE可以表达一对多,一对一,多对一关系因此可以配置双向MANYTOONE关系,例如1一桌四人打麻将,麻将席位和打麻将的人是什么关系是双向MANYTOONE的关系四。ONETOONE通过主键进行关联相当于把大表拆分为多个小表例如把大字段单独拆分出来,以提高数据库操作的性能HIBERNATE的ONETOONE似乎无法LAZY,必须通过BYTECODEENHANCEMENT五。集合LIST/BAG/SETONETOMANY1LIST需要维护INDEXCOLUMN,不能被用于双向关联,必须INVERSE“FALSE”,被谨慎的使用在某些稀有的场合2BAG/SET语义上没有区别3我个人比较喜欢使用BAGMANYTOMANY1BAG和SET语义有区别2。建议使用SET六。集合的过滤1CHILDRENSESSIONCREATEFILTERPARENTGETCHILDREN,“WHERETHISAGE5ANDTHISAGE10”LIST针对一对多关联当中的集合元素非常庞大的情况,特别适合于庞大集合的分页SESSIONCREATEFILTERPARENTGETCHILDREN,“”SETFIRSTRESULT0SETMAXRESULTS10LIST在HIBERNATE中用SUPERGETSESSIONCREATEFILTER,七。继承关系当中的隐式多态HQLFROMOBJECT1把所有数据库表全部查询出来2POLYMORPHISM“IMPLICIT”DEFAULT将当前对象,和对象所有继承子类全部一次性取出3POLYMORPHISM“EXPLICIT”,只取出当前查询对象八。HIBERNATE二级缓存著名的N1问题FROMCHILD,然后在页面上面显示每个子类的父类信息,就会导致N条对PARENT表的查询SELECTFROMPARENTWHEREIDSELECTFROMPARENTWHEREID解决方案保定电力职业技术学院顶岗实习技术应用(论文)201EAGERFETCH2二级缓存九。INVERSE和二级缓存的关系当使用集合缓存的情况下1INVERSE“FALSE”,通过PARENTGETCHILDREN来操作,HIBERNATE维护集合缓存2INVERSE“TRUE”,直接对CHILD进行操作,未能维护集合缓存导致缓存脏数据3双向关联,INVERSE“TRUE”的情况下应避免使用集合缓存十。HIBERNATE二级缓存是提升WEB应用性能的法宝OLTP类型的WEB应用,由于应用服务器端可以进行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论