Tworzysz instancję klasy Mongo dla każdej pojedynczej operacji. To nie zadziała, ponieważ każda instancja utworzy i utrzyma co najmniej jedno połączenie (ale domyślnie 10), a te połączenia zostaną usunięte tylko wtedy, gdy Java GC wyczyści twoją instancję Mongo lub gdy wywołasz close().
Problem polega na tym, że w obu przypadkach tworzysz je szybciej niż są zamykane nawet przy użyciu jednego wątku. To wyczerpie maksymalną liczbę połączeń w pośpiechu. Właściwym rozwiązaniem jest zachowanie jednej instancji Mongo przy użyciu wzorca singleton (Mongo.Holder zapewnia w tym celu funkcjonalność, wypróbuj Mongo.Holder.connect(..)). Szybkim "rozwiązaniem" jest zwiększenie limitu deskryptorów plików na twoim komputerze, tak aby maksymalna liczba połączeń była znacznie wyższa, ale oczywiście w końcu możesz osiągnąć ten sam limit. Możesz sprawdzić swoje aktualne maksimum za pomocą (w powłoce):
db.serverStatus().connections
TL;DR :Traktuj instancję Mongo jako singletona i spraw, by żył jak najdłużej, a będziesz złoty. Implementacja MongoFactory za pomocą statycznej metody getInstance(), która zwraca leniwie utworzoną instancję, załatwi sprawę. Powodzenia.