2012-07-04 77 views
2

我正在使用mongoDb與java。插入數據時出現以下錯誤。任何幫助,將不勝感激。 ThanxMongoDB池連接錯誤

Jul 4, 2012 1:45:32 PM org.xsocket.connection.HandlerAdapter performOnData 
WARNING: [6f829b013850ff7914137a5cceC291] closing connection. Error occured by performing onData of com.avaya.onex.hss.requesthandlers.ResponseHandler#18746603 java.lang.OutOfMemoryError: Java heap space 
Jul 4, 2012 1:45:25 PM com.mongodb.DBPortPool gotError 
WARNING: emptying DBPortPool to localhost:27017 b/c of error 
java.net.SocketException: Connection reset by peer: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136) 
    at org.bson.io.PoolOutputBuffer.pipe(PoolOutputBuffer.java:129) 
    at com.mongodb.OutMessage.pipe(OutMessage.java:111) 
    at com.mongodb.DBPort.go(DBPort.java:119) 
    at com.mongodb.DBPort.go(DBPort.java:89) 
    at com.mongodb.DBPort.say(DBPort.java:84) 
    at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:153) 
    at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:138) 
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:261) 
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:211) 
    at com.mongodb.DBCollection.insert(DBCollection.java:57) 
    at com.mongodb.DBCollection.insert(DBCollection.java:102) 
    at com.avaya.onex.hss.requesthandlers.DatabaseConnection.dbWrite(DatabaseConnection.java:50) 
    at com.avaya.onex.hss.requesthandlers.ResponseHandler.handleResponse(ResponseHandler.java:232) 
    at com.avaya.onex.hss.requesthandlers.ResponseHandler.onData(ResponseHandler.java:104) 
    at org.xsocket.connection.HandlerAdapter.performOnData(HandlerAdapter.java:242) 
    at org.xsocket.connection.HandlerAdapter.access$200(HandlerAdapter.java:42) 
    at org.xsocket.connection.HandlerAdapter$PerformOnDataTask.run(HandlerAdapter.java:210) 
    at org.xsocket.SerializedTaskQueue.performPendingTasks(SerializedTaskQueue.java:161) 
    at org.xsocket.SerializedTaskQueue.access$100(SerializedTaskQueue.java:40) 
    at org.xsocket.SerializedTaskQueue$MultithreadedTaskProcessor.run(SerializedTaskQueue.java:189) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

這是我有dbWrite函數的類,我從其他類調用它在mongodb中插入數據。

package com.avaya.onex.hss.requesthandlers; 

import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.Mongo; 
import com.mongodb.MongoOptions; 
import com.mongodb.WriteConcern; 

public class DatabaseConnection { 
    private static DatabaseConnection con = null; 
    static DB db=null; 
    static Mongo m; 
    //private static int count=0; 

    private DatabaseConnection(){ 
    } 

    public void dbConnect() { 

     try{ 
     // connect to the local database server 
     MongoOptions options = new MongoOptions(); 
     options.connectionsPerHost = 9000000; 
     options.maxWaitTime = 1000000; 
     options.socketKeepAlive = true; 
     options.threadsAllowedToBlockForConnectionMultiplier = 1000; 

     m = new Mongo("localhost", options); 

     //m.dropDatabase("ClientSimulator"); 
     db = m.getDB("ClientSimulator"); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public static synchronized DatabaseConnection getInstanceClass(){ 
     if(con==null) 
      con=new DatabaseConnection(); 
     return con; 
    } 

    public DB getDatabaseObject(){ 
     return db; 
    } 

    public synchronized void dbWrite(DBCollection coll, BasicDBObject obj){ 
     coll.insert(obj); 
     try { 
      Thread.currentThread().sleep(100); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public synchronized void dbRead(DBCollection coll){ 
    } 

    public synchronized void dbUpdate(DBCollection coll) { 
    } 

    public synchronized void dbCollDrop(DBCollection coll){ 
     coll.drop(); 
    } 
} 
+1

看來你的連接已經下降。 mongo在跑嗎? –

+0

是的..它正在運行 – shalki

+0

發生這種情況時服務器日誌中的內容是什麼? –

回答

4

試試這個。

options.connectionsPerHost = 100; 
    options.maxWaitTime = 2000; 
    options.socketKeepAlive = true; 
    options.threadsAllowedToBlockForConnectionMultiplier = 50; 

connectionsPerHost是connectionPool。如果你輸入9000000,它會嘗試創建90000000個線程和連接對象來處理你的請求。我相信這遠遠不是必要的。你必須減少這個數字,你也可以刪除插入功能中的睡眠(100)。

如果java試圖創建這麼多的連接。 Mongodb服務器可能無法處理那麼多的連接,或者您必須更改配置以允許多少連接。

請記住,connectionsPerHost不是線程的最大數量。你可以有1000000個線程插入,但只有100個連接將被使用,並且在所有線程空閒時將被共享。 2秒的maxWaitTime應該足夠了。如果插入需要2秒以上,則可以考慮升級服務器。

+0

我必須連接許多主機...我需要大約15000個連接... – shalki

+0

我需要等待大約2小時.. – shalki

+1

爲什麼你需要等待2小時?你有很慢的請求? –

1

驅動程序無法從連接池中刪除掉落的套接字,您需要使用try catch讓驅動程序知道套接字已丟棄。