SSH高性能并发的注意事项(个人总结)
2015-12-13 17:41
197 查看
1、 应该尽量减小service事务代码块的大小,在事务中对记录进行修改时,会对相应表加锁,如:A事务对table1 和table2表的记录进行修改,那么B事务再对table1 和table2表的记录进行修改时会等A事务commit以后才能获得table1和table2的锁,这样事务太长并发量大的时候系统就会变慢
2、 事务里对表的更新操作应该按一定顺序,如果顺序不同则可能会出现数据库表死锁的情况,如:A事务先对两张表的修改顺序是table1、table2,而B事务对两张表的修改顺序是table2、table1,这样并发执行的时候就会出现死锁情况
![](http://www.linuxidc.com/upload/2011_10/111018102075201.gif)
3、 程序里指定事务隔离级别,默认是数据库的隔离级别,mysql是行级锁,sql server是表级锁,如果是sql server则需要开启快照模式
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="sum*" read-only="true" />
<tx:method name="count*" read-only="true" />
<tx:method name="auto*" read-only="true" />
<tx:method name="*" isolation="READ_COMMITTED" timeout="60000"/>
</tx:attributes>
</tx:advice>
4、 开启hibernate二级缓存(建议使用EHcache),这样大大提高效率
<prop key="hibernate.cache.use_query_cache">
${hibernate.cache.use_query_cache}
</prop>
<prop key="hibernate.cache.provider_class">
${hibernate.cache.provider_class}
</prop>
hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
dao中查询前使用getHibernateTemplate().setCacheQueries(true);
5、 如果有系统出现内存溢出没有规律的现象,则应该考虑常用模块是否有程序中有遍历集合循环查询数据库的问题,排除这种情况后就只能在配置上下手了,以jboss4.2.3为例说明
set JAVA_OPTS=-server –Xms512m -Xmx512m-XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseParallelGC-XX:+UseParallelOldGC
详细参数说明大家可以在网上自己查找,这里需要指出的是JVM有一个最大内存限制,网上说这个限制一般是 2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),有说64位操作系统没这个限制的,但本人在64位的widows2008上验证,同样有这个限制
程序问题往往是造成内存溢出的主要原因,大家一定要注意自己代码的质量
6、 使用集群,web应用服务器集群(可以使用apahce+modjk+tomcat/jboss或者linux下使用LVS+Keepalived),数据库如果使用sql server可以使用2008版本自带的集群,如果是mysql建议使用双机热备来增强安全性
最终架构:
![](http://www.linuxidc.com/upload/2011_10/111018102075202.gif)
2、 事务里对表的更新操作应该按一定顺序,如果顺序不同则可能会出现数据库表死锁的情况,如:A事务先对两张表的修改顺序是table1、table2,而B事务对两张表的修改顺序是table2、table1,这样并发执行的时候就会出现死锁情况
![](http://www.linuxidc.com/upload/2011_10/111018102075201.gif)
3、 程序里指定事务隔离级别,默认是数据库的隔离级别,mysql是行级锁,sql server是表级锁,如果是sql server则需要开启快照模式
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="sum*" read-only="true" />
<tx:method name="count*" read-only="true" />
<tx:method name="auto*" read-only="true" />
<tx:method name="*" isolation="READ_COMMITTED" timeout="60000"/>
</tx:attributes>
</tx:advice>
4、 开启hibernate二级缓存(建议使用EHcache),这样大大提高效率
<prop key="hibernate.cache.use_query_cache">
${hibernate.cache.use_query_cache}
</prop>
<prop key="hibernate.cache.provider_class">
${hibernate.cache.provider_class}
</prop>
hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
dao中查询前使用getHibernateTemplate().setCacheQueries(true);
5、 如果有系统出现内存溢出没有规律的现象,则应该考虑常用模块是否有程序中有遍历集合循环查询数据库的问题,排除这种情况后就只能在配置上下手了,以jboss4.2.3为例说明
set JAVA_OPTS=-server –Xms512m -Xmx512m-XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseParallelGC-XX:+UseParallelOldGC
详细参数说明大家可以在网上自己查找,这里需要指出的是JVM有一个最大内存限制,网上说这个限制一般是 2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),有说64位操作系统没这个限制的,但本人在64位的widows2008上验证,同样有这个限制
程序问题往往是造成内存溢出的主要原因,大家一定要注意自己代码的质量
6、 使用集群,web应用服务器集群(可以使用apahce+modjk+tomcat/jboss或者linux下使用LVS+Keepalived),数据库如果使用sql server可以使用2008版本自带的集群,如果是mysql建议使用双机热备来增强安全性
最终架构:
![](http://www.linuxidc.com/upload/2011_10/111018102075202.gif)
相关文章推荐
- poj1961 Period
- (四)避免对象的内存泄露
- GetWindowText、GetDlgItemText、UpdateData
- (三)如何避免OOM总结
- (二)OOM(Out Of Memory)
- poj3069 Saruman's Army (贪心)
- (一)Android的内存管理机制
- java webservice 用户验证 (服务端 + 客户端)
- MySql+Memcached架构的问题
- TextView和Editext里面的ImageSpan居中对齐
- distribute-list分发列表 和 不进行重分发LAS过滤方法area filter-list prefix、database-filter
- java web开发 高并发处理
- assert断言的陷阱
- java学习感悟
- spring beans源码解读
- MongoDB知识整理
- Nginx常用功能详解
- 搭建Nginx+Java环境
- Nginx反向代理和负载均衡部署指南
- Nginx负载均衡配置