- 浏览: 447153 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (162)
- easymock (3)
- 模板引擎 (3)
- JForum (4)
- web (9)
- spring (10)
- java (20)
- struts (9)
- uml (3)
- java pattern (19)
- JQuery (14)
- 多线程 (13)
- database (21)
- PS (3)
- ejb (6)
- 版本管理 svn , maven , ant (2)
- protocol (1)
- 测试 (1)
- ws (7)
- Apache (4)
- 脚本语言 (1)
- guice (1)
- 分布式 (4)
- 架构 (0)
- 经验 (1)
- 版本管理 svn (1)
- maven (1)
- ant (1)
- 书籍 (1)
- Linux (1)
最新评论
-
Master-Gao:
稍微明白了点,,有点萌萌哒
为什么匿名内部类参数必须为final类型 -
waw0931:
终于明白了,谢谢!
为什么匿名内部类参数必须为final类型 -
十三圆桌骑士:
提供了两个链接还是有用的。
安装Mondrian -
放方芳:
[flash=200,200][/flash]
Freemarker标签使用 -
放方芳:
[b][/b]
Freemarker标签使用
使用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);
还是以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);
发表评论
-
安装Mondrian
2014-04-11 10:48 4654Mondrian and OLAP Mondrian i ... -
NoSql 笔记
2014-02-18 17:39 770看了一些关于NoSql的文 ... -
mysql explain用法
2014-02-14 11:53 943补充一点: id 就是 sql 语句中 select 出现 ... -
数据库范式概念解析(第一范式,第二范式,第三范式)
2013-02-26 10:17 1126大部分数据库从业人员 ... -
ORACLE数据库基础知识
2013-02-23 11:39 883http://wenku.baidu.com/view/958 ... -
Oracle 的性能优化概述
2013-02-23 11:34 1074Oracle 的性能优化概 ... -
mysql 索引
2013-02-23 11:33 977索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一 ... -
hibernate规则
2012-12-18 14:58 1108实体类的编写规则 l 实体类必须具备无参 ... -
Hibernate 关联关系映射(Association Relationship Mapping)
2012-12-17 18:55 976一对一主键关联 数据表为:夫妻表 POJO 为 ... -
关系型数据库性能优化总结(转)
2012-06-13 14:17 860关系型数据库性能优化 ... -
spring+hibernate架构中Dao访问数据库的几种方法
2011-11-28 18:10 1426spring+hibernate架构中Dao访问数据库的几种方 ... -
mybatis 缓存(二)
2011-10-20 13:05 5360缓存不适合情况:select ... -
mybatis 缓存(一)
2011-10-20 11:27 1283缓存概述 http://www.iteye.com/topi ... -
mybatis 基本
2011-10-20 11:14 1484今天刚听说iBATIS改名为MyBatis,实际上就是iBAT ... -
hibernate 延迟加载(一)
2011-10-12 10:03 968首先是第一个误区:延迟加载只能作用于关联实体 看到这个是不 ... -
mybatis 多对多 处理
2011-09-26 18:41 42103下面的例子让新手看 ... -
MyBatis+Spring基于接口编程的原理分析
2011-09-17 15:57 3443整合Spring3及MyBatis3 对于整合Sprin ... -
解释 关闭statement 和rs
2010-09-19 13:14 2369很多朋友在Java开发中, ... -
Oracle嵌套表和数组的使用(省去了连接查询)
2010-07-27 17:18 2305Oracle嵌套表的使用 1. 创建对象类型 create ... -
延迟加载
2010-07-11 14:04 1341could not initialize proxy - no ...
相关推荐
Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...
"Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...
项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 二、 项目目的: 整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + ...
【hibernate学习资料大全】 Hibernate 是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。这个压缩包包含了丰富的Hibernate学习资源,旨在帮助开发者深入理解和熟练掌握这一强大的...
《Hibernate-Extensions全面指南》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要...
【描述】中的"hibernate的jar包"指的是Hibernate框架的运行库文件,这些JAR文件包含了Hibernate的所有核心API、实现和依赖库,如Hibernate Commons Annotations、Hibernate EntityManager、Hibernate Core等。...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了Hibernate的基础jar包,这些jar文件是开发Hibernate应用所...
HibernateTools是Java开发人员在使用Hibernate ORM框架时的有力辅助工具集,主要目的是为了提高开发效率,简化数据库操作。在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系...
Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...
Hibernate3是一个广泛使用的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与数据库之间的交互。在这个"Hibernate3的依赖包"中,包含了运行Hibernate3应用...
标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...
在Java开发环境中,与KingbaseV8数据库进行交互通常会用到Hibernate框架和JDBC驱动。 Hibernate是一个优秀的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作,通过将Java对象与数据库表进行映射,...
标题"Hibernate 中文api 等学习资料"暗示了这是一组针对Hibernate ORM框架的中文学习资源,包括API文档和其他指南,旨在帮助用户更好地理解和使用Hibernate。 描述中的"hibernate orm框架api中文文档,学习资料,...
包含hibernate所有所需jar包还有一些其他包日志包、jpa支持包等: 列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0....
Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者可以更加专注于业务逻辑而不是数据访问层的实现。本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...
Hibernate3 是一个非常重要的Java持久化框架,它允许开发者将对象模型与数据库关系模型进行映射,从而简化了数据存取的过程。这个压缩包“hibernate3必要jar包”显然是针对Hibernate3版本的,已经去除了冗余的库文件...
Hibernate 是一个著名的开源对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方式,使得在Java应用程序中操作数据库变得更加简单。这个“hibernate_3.2官方开发包”包含了所有你需要开发基于...
Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射工具,使得开发者可以使用面向对象的方式来操作数据库,极大地简化了数据库操作。在Java应用中,尤其是在企业级应用开发中,Hibernate是...
Hibernate是Java平台上的一款开源对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的...