使用java进行项目开发也有不少年头了,应用从网站到金融产品到自动页面检索,使用的开发框架从最初的jsp+javabean到ejb再到ssh,数据库从mysql、sql server到oracle、informix、db2,查询语言从sql到xquery...经历的风风雨雨,其间无数次的问题,无数次的功课,现在看来也颇令人感慨,想想觉得应该还是留下些什么,和大家分享一下自己的心得,也欢迎多交流,多指教。
还是以hibernate开篇吧,毕竟它很热,而且自己对它也还是比较有感情的。说实话heibernate这个东西,在编码的时候确实让人很贴心,尤其在ssh框架中,它的出现使得面向对象的技术和数据库结合的是那么的自然,而且节省了大量的重复编码,但是且慢,如果你不能避开它给我们留下的那些陷阱,则后果也是很严重的。
经验一:合理使用lazy load
延迟加载这个东西确实很方便,尤其配合opensessioninview的技术,往往一个对象即表数据以及所有关联表的数据都直接在页面上通过 pojo关联
的形式带出来。不过随之带来的是数据库查询压力增大的风险。设想以下场景:主表a,子表b,在hibernate中A(a表)对象与B(b表)对象一对多关联
并且设置了延迟加载,即A对象包含了一个B对象的列表(List),假设在一个方法中需要针对A对象中的所有B对象进行业务条件判断,如下列代码
示例:
function void someFunc(A a){
Iterator it = a.getBList().iterator();
while(it.hasNext()){
B b = (B)it.next();
if(b.getType()==1){
//some code
}
}
}
当循环判断b的type属性时,每个循环都会产生一个新的sql查询,如果有1万个子表记录则需要查1万次,表面上看只是一个属性判断,其实里边的
陷阱还挺深
解决方案:
首先如果你确定延迟加载的表对象不会产生类似上述的风险,比如在任何业务场景中都不会进行循环判断或对应的子表关联记录数只有很少,那么并
不需要做改变。
其次如果确实有可能由以上的场景风险存在,那么就可以对那些场景使用的对象使用非延迟加载,比如上边的示例中的参数A对象我们就不是直接使用
load而是使用find方法,并在方法中使用hql的时候进行left join fetch关联,如:getHibernateTemplate().find("from A a left join fetch a.bList b");
取得了这样的A对象再进行循环判断的时候当然就不用再到数据库查询了
经验二:合理使用opensessioninview
opensessioninview当然并不是hibernate的而是spring的一个技术,之所以列在这里因为基本上他就是为了 hibernate服务的。
opensessioninview使得web应用中hibernate的session可以一直保持到页面显示,从而在jsp中可以方便的使用 pojo的模式显示对象属性信息。
如在servlet或action中把a对象放入request,而在jsp中可以通过:<c:out value="${a.b.type}"/>就可以显示与a对象关联的b对象的type属性。
但正是由于session一直保留,因此在一些并发量比较大并且数据量又很多的情况下,很容易造成数据库链接无法释放的问题。并且在需要长时间
运算的web页面,这个问题会更加突出,试想以下场景:你有一个根据数据库相关记录信息生成数据包(多个xml文件组成)的业务,你点击页面上的
一个按钮、然后点一根烟,当烟抽完的时候数据包就会生成了,如果这个页面你使用了opensessioninview,你会发现一包烟都抽完了数据包仍然
不见踪影,然后发现数据库当前链接有n多都没有释放,原因?opensessioninview使得页面在运行过程中一直保持数据库链接不释放造成的。
解决方案:
对那些数据压力大的或需要长时间加载的页面不使用opensessioninview,可以通过扩展名进行区分筛选,如:特殊页面的链接url使用xxx.do这个
形式,而*.do的扩展名在web.xml不使用opensessioninview进行过滤
经验三:自增主键生成模式
hibernate默认的自增主键生成方式是increment,即由hibernate来管理进行自增,不过一定不要在项目中使用默认方式,除非你确认不会使用
其他如jdbc方式进行数据相关库表的数据操作,以及确认不会有集群或多个应用添加同一个数据库表。。。显然在一个正式的项目中 increment
模式不可行,推荐使用assigned即自定义模式,对主键的生成进行统一调配,这样才可以在不同数据库间兼容,当然项目对应的数据库类型
已经确定了,使用identity模式(DB2、SQL Server、MySQL)或sequence模式(oracle)也是很方便的
经验四:反转控制
有一对多关联,最好忘记设置反转控制,否则如果子记录成千上万,主对象一旦被load又没有设置延迟加载,数据库的压力可就。。。
经验五:hibernate实体对象传递
很多情况下需要把hibernate实体对象拷贝成另一个继承实体对象的子对象,传递对象数据很麻烦,一个方式是用n个set方法干体力活,当然
还有BeanUtils这样贴心的工具类,但别忘了加上忽略的属性才能拷贝成功哦:
String[] IGNORE_HIBERNATE_PROPERTIES = new String[]{"callback","callbacks", "hibernateLazyInitializer"};
BeanUtils.copyProperties(hbo,target,IGNORE_HIBERNATE_PROPERTIES);
分享到:
相关推荐
总结来说,"maven项目hibernate demo"涵盖了以下几个关键知识点: 1. Maven项目管理,包括POM配置、依赖管理和构建过程。 2. Hibernate ORM框架,包括实体类、映射配置、Session接口和查询API。 3. Java 1.7语言特性...
### 敏捷Java开发:Spring、Hibernate与Eclipse的应用 #### 一、敏捷Java开发简介 在《敏捷Java开发:Spring、Hibernate与Eclipse》这一主题中,作者Anil ...它不仅是一本技术书籍,更是一份宝贵的实践经验总结。
### 关于《Beginning Hibernate 第二版》的知识点总结 #### 一、书籍基本信息与版权信息 - **书名**:《Beginning Hibernate 第二版》 - **作者**:Jeff Linwood 和 Dave Minter - **出版年份**:2010年 - **出版...
总结,Hibernate为Java开发者提供了强大的数据库操作工具,通过熟练掌握其核心概念和实践技巧,可以提高开发效率,降低维护成本。在实际应用中,合理利用缓存和事务管理,以及进行性能调优,能进一步提升系统的稳定...
Java软件开发岗位职责是指Java开发工程师在软件开发项目中承担的职责和任务,包括参与软件项目的需求分析、设计、开发、测试等几个阶段,具备一定的技术能力和任职要求,并且需要不断学习和实践,提高自己的职业发展...
【Java工程师简历模版】揭示了Java...总结来说,这个Java工程师简历突显了求职者的全面技术能力和实践经验,包括Java Web开发、数据库管理、框架使用、项目实施以及团队合作,这些都是成功Java工程师不可或缺的素质。
根据提供的个人简历信息,我们可以提炼出以下几个方面的知识点: ...通过以上分析,可以看出这位求职者在Java软件开发方面有着扎实的专业基础和丰富的实践经验,同时也具备良好的个人素质和职业态度。
根据给定文件的信息,我们可以总结出以下关于Java的基本要求及相关知识点: ### 1. 熟悉 J2EE Java J2EE(Java 2 Platform, Enterprise Edition)是Sun Microsystems为简化企业级应用开发而设计的一套标准和技术...
【Java开发个人简历模板】展示了求职者在Java开发领域的专业知识和实践经验。简历中提到了以下几个重要的知识点: 1. **核心Java编程**:求职者掌握了Core Java编程基础,这包括对象导向编程、数据结构、异常处理、...
这些内容构成了Java开发的核心部分,掌握它们可以解决复杂的编程问题。 4. **Java 分布式计算技术**: 对于Web开发,需要理解Servlet、JSP、JDBC等技术,以及MVC设计模式。此外,Spring框架、Hibernate ORM工具和...
7. **项目总结**:在项目总结中,求职者详细阐述了如何应用Spring的Template技术和AOP进行事务控制,使用Spring注解和IOC容器实现解耦合,这显示了其深入理解和实践能力。 以上内容构成了一个全面展示Java工程师...
- **Spring**:一个轻量级的控制反转(IoC)容器和依赖注入框架,也是企业级Java开发的主流框架之一。 - **iBATIS**:类似于Hibernate,但提供了SQL查询的更大灵活性。 - **jQuery**:一个快速、简洁的JavaScript...
### Java自学之路:选择与路线图详解 #### 一、选择的重要性 在开始Java学习之旅之前,最重要的是明确自己的目标并做出明智的选择。...记住,持续学习和实践经验是成为一名优秀Java开发者的必经之路。
- **框架与工具**: 常见的Java开发框架如Spring Boot、Hibernate等的使用技巧;以及IDEA、Maven等工具的高效利用。 - **性能优化**: 如何进行代码优化、提高程序运行效率;内存管理及垃圾回收机制等。 - **微服务...
4. **总结反思**:定期总结自己的学习成果和经验教训,形成自己的知识体系。 5. **积极参与社区**:加入开发者社区,与其他开发者交流学习心得。 通过上述步骤的学习和实践,你可以逐步建立起坚实的Java开发基础,...
### Java Web开发应掌握的关键知识点 #### 一、概述 随着信息技术的发展,Web应用已成为现代信息化建设的核心之一。Java作为一种广泛应用于网络开发的语言,在Web应用领域具有不可替代的地位。为了有效地构建高质量...
- **目标读者**:适合希望掌握Hibernate并应用于实际项目的开发人员,无论是初学者还是有一定经验的开发者都能从中受益。 #### 描述:学习Hibernate的经典书籍 - **主要内容**: - 深入介绍Hibernate框架的核心...