У меня проблема с моей программой. моя java-программа, которая работает как веб-сервис (построенный на платформе spark), генерирует исключение IOException под названием «Слишком много открытых файлов», хотя я использую только один файл в моем приложении и использую try-with-resource, который в конечном итоге закроет файл .. это немного кода, где я получаю доступ к файлу:
public synchronized JSONObject read() {
if (jsonObject == null) {
LOGGER.info("Reading a json file");
String line = "";
final StringBuilder sb = new StringBuilder();
try (FileReader fr = new FileReader("..path../sample.json");
BufferedReader br = new BufferedReader(fr)) {
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
LOGGER.info(e.getMessage());
}
jsonObject = new JSONObject(sb.toString());
}
return jsonObject;
}
здесь, jsonObject, конечно, переменная экземпляра. когда я запускаю это приложение и нажимаю что-то через почтальона, он вызывает блок if только один раз, даже если каждый запрос требует данных из файла sample.json (так что это действительно то, что я ожидал, то есть должен читать только файл) один раз) .. но через некоторое время мой сервер, на котором было развернуто это приложение, выходит из строя с вышеупомянутым IOException. Я много занимался серфингом, но все равно не нашел решения.
РЕДАКТИРОВАНИЕ:
Это трассировка стека:
[qtp1477164349-12-acceptor-0@5ef8508f-ServerConnector@503fa520{HTTP/1.1,[http/1.1]}{0.0.0.0:4567}] WARN org.eclipse.jetty.server.AbstractConnector -
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
at org.eclipse.jetty.server.ServerConnector.accept(ServerConnector.java:379)
at org.eclipse.jetty.server.AbstractConnector$Acceptor.run(AbstractConnector.java:638)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
at java.lang.Thread.run(Thread.java:748)