Вие създавате екземпляр на класа Mongo за всяка отделна операция. Това няма да работи, тъй като всяко копие ще създаде и задържи поне една връзка (но по подразбиране 10) и тези връзки ще бъдат премахнати само ако Java GC изчисти вашия екземпляр на Mongo или когато извикате close().
Проблемът е, че и в двата случая ги създавате по-бързо, отколкото се затварят дори с помощта на една нишка. Това ще изчерпи максималния брой връзки набързо. Правилното решение е да запазите един екземпляр на Mongo, като използвате модела singleton (Mongo.Holder предоставя функционалност за това, опитайте Mongo.Holder.connect(..)). Бързо „поправяне“ е да увеличите ограничението на файловия дескриптор на вашата машина, така че максималният брой връзки да е значително по-висок, но очевидно в крайна сметка може да достигнете същото ограничение. Можете да проверите текущия си максимум, като използвате (в shell) :
db.serverStatus().connections
TL;DR :Отнасяйте се към екземпляр на Mongo като към сингълтън и ги направете възможно най-дълготрайни и сте златен. Внедряването на MongoFactory със статичен метод getInstance(), който връща лениво създаден екземпляр, ще свърши работа добре. Успех.