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