打造高并发安全系統(SSH)应该注意的几个问题

最近验收会终于开完了,也算是稍微松了一口气,之前系统定位是分布式部署,但是到了最后上线阶段又改为集中部署,这样性能问题就成了当前比较棘手的一件事,项目上线后频繁出线内存溢出、数据库锁表问题,加上后来压力测试时出现的系统并发慢的问题,经过这N久的折磨后,现在终于有了一些成果,下面简单记录一下,记录下来供大家参考交流,其中难免瑕疵之处欢迎大家指正 

1、  应该尽量减小service事务代码块的大小,在事务中对记录进行修改时,会对相应表加锁,如:A事务对table1 和table2表的记录进行修改,那么B事务再对table1 和table2表的记录进行修改时会等A事务commit以后才能获得table1和table2的锁,这样事务太长并发量大的时候系统就会变慢

2、  事务里对表的更新操作应该按一定顺序,如果顺序不同则可能会出现数据库表死锁的情况,如:A事务先对两张表的修改顺序是table1、table2,而B事务对两张表的修改顺序是table2、table1,这样并发执行的时候就会出现死锁情况

打造高并发安全系統(SSH)应该注意的几个问题

3、 程序里指定事务隔离级别,默认是数据库的隔离级别,mysql是行级锁,sql server是表级锁,如果是sql server则需要开启快照模式

<tx:advice>
  <tx:attributes>
   <tx:method read-only="true" />
   <tx:method read-only="true" />
   <tx:method read-only="true" />
   <tx:method read-only="true" />
   <tx:method read-only="true" />
   <tx:method read-only="true" />
   <tx:method 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建议使用双机热备来增强安全性

最终架构:

打造高并发安全系統(SSH)应该注意的几个问题

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pppjz.html