Posted on 2011-01-06 18:38
xiaolang 閱讀(2559)
評論(0) 編輯 收藏
1. 在Jboss數據源配置文件中, <prepared-statement-cache-size>配置項的值設置過大(最初設為100),是導致內存使用過大的直接原因。眾所周知,對sql語句進行預編譯,可以提高sql語句的查詢效率,因此使用該配置項設定最多緩存多少條預編譯的sql語句(tradequery應用系統設定的值為100個)。物理分庫后,一臺服務器從20個數據庫連接增加到60個數據庫連接,每個連接都會緩存100條預編譯的sql, 總共就是60*100
= 6000個。然而實際上jdbc在解析sql語句的時候,進行緩存的并不只是sql語句本身,還緩存了查詢結果字段類型的大小。并且如果語句中包含in的查詢,由于in后面的列表是變化的,因此就可能會對一條查詢語句進行多次不同的緩存。此外,jdbc
driver里還會預先設定一個值(fetch Size),用來表示緩存sql的查詢結果條數,這也會再次成倍數的增加內存的消耗。因此,<prepared-statement-cache-size>值設置太大,將可能會耗光應用服務器的內存。
2. 使用了未設計細致的velocity引擎, new了大量的空對象。因為銷售老的流程引擎中直接使用了velocity引擎,而引擎中使用了老的log4j文件,由于框架中也未設置velocity的日志配置,輸出日志時,沒有找到appender,所以都是新new出來的。因此一旦業務發展,每次流程執行中都會新建大量的appender對象。業務量到一定程度的時候,會導致系統內存爆滿。