Назад | Перейти на главную страницу

Glassfish вылетает из-за слишком большого количества открытых файлов

У меня есть внутреннее развертывание, работающее на сервере Glassfish, интерфейс моего приложения отправляет запрос REST, когда ему нужны некоторые данные. Также бэкэнд подключен к базе данных mongo:

ПЕРЕДНЯЯ ЧАСТЬ <----rest----> НАЗАД <----> БД.

Мой бэкэнд развернут на виртуальной машине ubuntu через glassfish 5, интерфейс работает на веб-сервере apache.

После некоторого использования, можно сказать, через 5 минут, особенно когда приложение используют несколько пользователей, сервер Glassfish большую часть времени дает сбой при попытке доступа к базе данных с ошибкой: java.net.SocketException: Too many open files .

Конечно, я уже искал эту проблему в Google, и есть много предложений, в которых говорится, что нужно просто увеличить количество открытых файлов, которые сейчас находятся на 1024.

Теперь мой вопрос: что это за открытые файлы, и даже если я увеличу их, не будет ли предел также достигнут через некоторое время. Увеличивается только шлюз или может быть ошибка в кодировках? Заранее спасибо.

Вот фрагмент вывода netstat моей машины ubuntu:

tcp        0      0 localhost:27017         localhost:44856         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44980         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44794         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45132         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44764         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44814         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44756         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44374         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44926         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45040         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45276         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44858         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45052         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45310         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44806         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44840         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45046         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45222         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45160         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44990         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44914         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:45274         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44998         ESTABLISHED -               
tcp        0      0 localhost:27017         localhost:44788         ESTABLISHED -               
tcp6       0      0 localhost:45176         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45136         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45058         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44926         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44968         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45190         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45050         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44886         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45308         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44978         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45086         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45198         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44922         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44938         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:45020         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44896         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44830         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44960         localhost:27017         ESTABLISHED 5204/java       
tcp6       0      0 localhost:44776         localhost:27017         ESTABLISHED 5204/java

Как видите, существует множество установленных соединений с localhost: 27017, который является базой данных mongo.

РЕДАКТИРОВАТЬ В моем бэкэнд-коде Java у меня есть класс UtilityService с методом получить базу данных. Он возвращает базу данных mongo по запросу, когда часть кода требует записи из базы данных или в нее.

public static MongoDatabase getDatabase(){
    String connectionStringProperty = getConfigProperty("MONGO_DB_CONNECTION_STRING");
    if(IsNullOrEmpty(connectionStringProperty)){
        return null;
    }

    MongoClientURI connectionString = new MongoClientURI(connectionStringProperty);
    MongoClient mongoClient = new MongoClient(connectionString);

    String databaseName = getConfigProperty("MONGO_DB_DATABASE_NAME");
    if(IsNullOrEmpty(databaseName)){
        return null;
    }

    return mongoClient.getDatabase(databaseName);
}