У меня есть внутреннее развертывание, работающее на сервере 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);
}