java和数据库性能优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 数据库性能优化
⏹优先考虑查询
数据库设计时,要优先考虑查询,因为在正常用户使用中,插入(insert)只有一次,但是会经常查询。例如在我们的OA中,起草一次,然后在接收端可能多个人要多次查询。
查询一般不要关联3个以上的表,也就是说一个业务的查询最多去关联3个表,如果必须要关联多个表,那么要尽可能的考虑怎么提高查询效率。
⏹一定要考虑索引
在数据量很大的时候,一定要建立索引,索引虽说降低了插入和更新效率,但大大的提高了查询效率。在四川公文传输中通过建立索引,能
提升十几倍的效率。
⏹分区
分区可以按照地域、时间等分区。我们现在的项目中主要是使用时间分区就可以了,分区可以避免查询时遍历很多条记录。
⏹按新旧查询
这个也可以说是按照时间查询,例如:只查询半年内的数据,半年外的数据在另外一个功能模块中查询。这个主要是根据客户的使用习惯,
他们可能会经常查询半年之内的数据。这样避免每次都去遍历很多条记
录。
2 java性能优化
⏹Hibernate缓存
Sprint和hibernate的结构现在是java开发的通用基本框架,所以不可能造成内存问题的,但现在网上也有人说hibernate内存有问题或则效率不高,这其实是没有真正掌握hibernate的技术。
Hibernate的缓存分为内在缓存、session缓存和查询缓存。可能和网上有些叫法不是很一样,道理都一样的。
内在缓存是hibernate的机制,当hibernate随着容器启动后,会把hibernate的pojo对象装载进入缓存中,这些是不能修改的。随着容器的关闭而自动释放。另外我们写的hql语言,hibernate会把这些编译成最低成的sql语句,也放在缓存中。这个也是随着容易的关闭而自动释放得。
Session缓存是随着session作用域的消失而消失,但通过在web.xml 中配置
openSessionInViewFilter,可以把session的作用域延长到jsp和action中。
查询缓存主要是用在更新很少,但查询很频繁的地方,提高查询效率和减少与数据库的交互。
Java内存
Java的内存分两部分:
持久化(perm):这部分内存是装载进入jvm中是不会消失的,主要用在static中,还有例如:hibernate的hbm和pojo装载后都要把对象放在perm中。在第一次使用是装载近来,不会随着时间或并发量的变化而变化。
另一部分内存就是会随着使用的增加而增加,例如一个发文业务,并发100个人同时使用,那么就会执行100次装载,但这部分内存会随着使用的结束而释放。一般内存益处的问题都在这里,有些代码写的内存不会释放,还有代码写的过于消耗内存,造成并发很大时,内存还来不及释放已经把虚拟机内存撑暴。
Java虚拟机的内存在64位操作系统中可以无限开大,取决于硬件的内存配置。
Java虚拟机的内存在32位操作系统中只能开到1300M~1800M,取决于操作系统,一般linux操作系统可以比windows多开几百M。但可以使用垂直集群方法来解决这个问题,也就是在一台服务器上安装多个java容器。
Java1.5版本后自带有内存监控工具jconsoe,在jboss中可以这样配置:
set JAVA_OPTS=%JAVA_OPTS% =%PROGNAME%
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
这样就可以在命令行下输入jconsoel来监控java内存情况,但这个监
控只是一个曲线图,只可以看到java在什么时候内存是多少,没法监
控到详细的内存使用。
使用jprofile工具可以详细监控到具体某个方法使用多少内存,但
jprofile不能在大并发下使用。如果在大并发下,可以先试用集群来分
流,然后再使用jprofile来监控。
其他
这部分就是在编码的时候注意性能,例如不要使用过多的循环,尤其是循环嵌套等等。