简体   繁体   English

在毫秒内将数据存储到MongoDB Collection

[英]store data to MongoDB Collection in millisecond

I write application in java to store data from UDP broadcast and store them to MongoDB. 我用Java编写应用程序以存储UDP广播中的数据并将其存储到MongoDB。 UDP sent in millisecond and it contain about text file separate by coma (about 30 fields). UDP以毫秒为单位发送,它包含大约逗号分隔的文本文件(大约30个字段)。

But i meet the problem as follow (problem show only in 4-5 minutes I run the program). 但是我遇到如下问题(问题仅在运行程序的4-5分钟内显示)。

Connect success
Doc inserted
Connect success
Doc inserted
Connect success
com.mongodb.MongoTimeoutException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=127.0.0.1:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.SocketException: Too many open files}}]
    at com.mongodb.BaseCluster.getServer(BaseCluster.java:82)
    at com.mongodb.DBTCPConnector.getServer(DBTCPConnector.java:654)
    at com.mongodb.DBTCPConnector.access$300(DBTCPConnector.java:39)
    at com.mongodb.DBTCPConnector$MyPort.getConnection(DBTCPConnector.java:503)
    at com.mongodb.DBTCPConnector$MyPort.get(DBTCPConnector.java:451)
    at com.mongodb.DBTCPConnector.authenticate(DBTCPConnector.java:624)
    at com.mongodb.DBApiLayer.doAuthenticate(DBApiLayer.java:195)
    at com.mongodb.DB.authenticateCommandHelper(DB.java:765)
    at com.mongodb.DB.authenticate(DB.java:721)
    at UdpGPSListener.main(UdpGPSListener.java:108)

and below is my code in Java : 以下是我在Java中的代码:

            DatagramSocket serverSocket = new DatagramSocket(2020);
        byte[] receiveData = new byte[2048];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        serverSocket.receive(receivePacket);
        String dtCollection = new String(receivePacket.getData(), "UTF8");
        String[] arrCollection = dtCollection.split(",");
        String dtField = "UnitTime,Ab1,ab2,ab3,ab4,ab5,ab6,ab7,cc1,cc2,cc3,cc4,cc5,cc6,cc7,cc8,cc9,cc9,cc10,m01,m02,m03,m04,m05,m06,m07";
        String[] arrField = dtField.split(",");
        String gbCollection="";
        for (int m=0; m<arrCollection.length; m++) {
            gbCollection+=arrField[m] + "=" +arrCollection[m] +",";
        }
            try {
                MongoClient mClient = new MongoClient();
                //MongoClient mClient = new MongoClient("127.0.0.1", 27017);
                DB db = mClient.getDB("mms");
                        System.out.println("Connect success");
                boolean auth = db.authenticate("user1", "passw0rd".toCharArray());
                DBCollection coll = db.getCollection("tgps");
                BasicDBObject doc = new BasicDBObject(arrField[0], arrCollection[0]).
                    append(arrField[1], arrCollection[1]).
                    append(arrField[2], arrCollection[2]).
                    append(arrField[3], arrCollection[3]).
                    append(arrField[4], arrCollection[4]).
                    append(arrField[5], arrCollection[5]).
                    append(arrField[6], arrCollection[6]).
                    append(arrField[7], arrCollection[7]).
                    append(arrField[8], arrCollection[8]).
                    append(arrField[9], arrCollection[9]).
                    append(arrField[10], arrCollection[10]).
                    append(arrField[11], arrCollection[11]).
                    append(arrField[12], arrCollection[12]).
                    append(arrField[13], arrCollection[13]).
                    append(arrField[14], arrCollection[14]).
                    append(arrField[15], arrCollection[15]).
                    append(arrField[16], arrCollection[16]).
                    append(arrField[17], arrCollection[17]).
                    append(arrField[18], arrCollection[18]).
                    append(arrField[19], arrCollection[19]).
                    append(arrField[20], arrCollection[20]).
                    append(arrField[21], arrCollection[21]).
                    append(arrField[22], arrCollection[22]).
                    append(arrField[23], arrCollection[23]).
                    append(arrField[24], arrCollection[24]).
                    append(arrField[25], new Date());
                coll.insert(doc);
                System.out.println("Doc inserted");
            } catch(UnknownHostException  e) {
                    System.err.println(e.getClass().getName() + ": " + e.getMessage() );
            } catch(MongoException e) {
                    e.printStackTrace();
            }

I assume that by 我认为

UDP sent in millisecond UDP发送毫秒

you mean that an update may occur every millisecond. 您的意思是每毫秒更新一次。

Anyway you encounter this problem: 无论如何,您都会遇到此问题:

java.net.SocketException: Too many open files java.net.SocketException:打开文件过多

I also assume that you receive your events in some kind of a loop. 我还假设您以某种循环方式接收事件。

In that case, this may be your problem: 在这种情况下,这可能是您的问题:

MongoClient mClient = new MongoClient();

You should init MongoClient only once before start listening to events, otherwise a connection is opened and never closed for every event you consume. 在开始侦听事件之前,您应该只初始化一次MongoClient ,否则对于您消耗的每个事件都将打开并永远不会关闭连接。

This should also go for obtaining db, authenticating and getting collection. 这也应该用于获取数据库,进行身份验证并获得收集。 ie

 MongoClient mClient = new MongoClient();
 //MongoClient mClient = new MongoClient("127.0.0.1", 27017);
 DB db = mClient.getDB("mms");
 System.out.println("Connect success");
 boolean auth = db.authenticate("user1", "passw0rd".toCharArray());
 DBCollection coll = db.getCollection("tgps");

All these should happen only once before you start receiving events. 在开始接收事件之前,所有这些操作仅应发生一次

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM