最近有一個應用使用Amoeba從幾個庫中讀取MySQL中含有longblob字段的表,老是報Session was killed。
經查是Amoeba中可讀通道的緩存大小引起的。原來在com.meidusa.amoeba.net.io.PacketInputStream類中,有一個屬性maxPacketSize,限制了可讀通道的緩存大小,如果當前讀取的記錄的長度大於maxPacketSize,就會報錯。所以我們必須把它調大點。
Java代碼
/** 最大容量 */
protected static final int MAX_BUFFER_CAPACITY = 1024 * 1024 * 2;
private int maxPacketSize = MAX_BUFFER_CAPACITY;
public int getMaxPacketSize() {
return maxPacketSize;
}
public void setMaxPacketSize(int maxPacketSize) {
this.maxPacketSize = maxPacketSize;
}
maxPacketSize默認是2MB,但是發現setMaxPacketSize方法沒有在其它地方有調用,應該是不可配置的,因此我直接修改了MAX_BUFFER_CAPACITY,重新打包扔上去就沒問題了。
另外,當maxPacketSize大小不足時,用SQLYog連代理時的時候,發現一個有趣的現象。假如我有一表,各字段長度如下:
field1 | field2
1M | 3M
如果我先執行:SELECT field2 FROM tab
這時出錯:Lost connection to MySQL server during query
再執行:SELECT field1 FROM tab
SQLYog就沒有響應了,然後amoeba拋OOM異常,屢試不爽。查DUMP文件後,發現AuthingableConnectionManager 和 Log4j的DailyRollingFileAppender塞滿了內存。