最近驗收會終於開完了,也算是稍微鬆了一口氣,之前系統定位是分散式部署,但是到了最後上線階段又改為集中部署,這樣性能問題就成了當前比較棘手的一件事,項目上線后頻繁出線內存溢出、資料庫鎖表問題,加上後來壓力測試時出現的系統併發慢的問題,經過這N久的折磨后,現在終於有了一些成果,下面簡單記錄一下,記錄下來供大家參考交流,其中難免瑕疵之處歡迎大家指正
1、 應該盡量減小service事務代碼塊的大小,在事務中對記錄進行修改時,會對相應表加鎖,如:A事務對table1 和table2表的記錄進行修改,那麼B事務再對table1 和table2表的記錄進行修改時會等A事務commit以後才能獲得table1和table2的鎖,這樣事務太長併發量大的時候系統就會變慢
2、 事務里對錶的更新操作應該按一定順序,如果順序不同則可能會出現資料庫表死鎖的情況,如:A事務先對兩張表的修改順序是table1、table2,而B事務對兩張表的修改順序是table2、table1,這樣併發執行的時候就會出現死鎖情況
3、 程序里指定事務隔離級別,默認是資料庫的隔離級別,mysql是行級鎖,sql server是表級鎖,如果是sql server則需要開啟快照模式
4、 開啟hibernate二級緩存(建議使用EHcache),這樣大大提高效率
${hibernate.cache.use_query_cache}
${hibernate.cache.provider_class}
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)應該注意的幾個問題已經有599次圍觀