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