關於Amoeba讀取longblob字段的問題

最近有一個應用使用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塞滿瞭內存。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *