java - Play Framework 调用 Controller 导致打开文件过多错误

标签 java spring hibernate playframework playframework-2.3

我们将 Play Framework 2.3.4 与 Java 和 Hibernate/Spring 结合使用。 它在生产中运行良好几天,然后突然发生这种情况:

java.net.SocketException: Too many open files
    at java.net.Socket.createImpl(Socket.java:460)
    at java.net.Socket.getImpl(Socket.java:520)
    at java.net.Socket.setTcpNoDelay(Socket.java:980)
    at com.mysql.jdbc.StandardSocketFactory.configureSocket(StandardSocketFactory.java:134)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:205)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:297)
    ... 75 more

然后是其中一些:

java.io.FileNotFoundException: /opt/psldata-api-1.0.0/app/controllers/StatsController.java (Too many open files)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at play.utils.PlayIO$.readFileAsString(PlayIO.scala:63)
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302)
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302)
    at scala.Option.map(Option.scala:145)
    at play.api.Application$$anon$1.input(Application.scala:302)
    at play.api.PlayException$ExceptionSource.interestingLines(PlayException.java:81)
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:157)
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:142)
    at scala.Option.map(Option.scala:145)
    at views.html.defaultpages.devError$.apply(devError.template.scala:142)
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141)
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141)
    at play.api.GlobalSettings$class.onError(GlobalSettings.scala:147)
    at play.core.j.JavaGlobalSettingsAdapter.play$core$j$JavaGlobalSettingsAdapter$$super$onError(JavaGlobalSettingsAdapter.scala:36)
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36)
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36)
    at scala.Option.getOrElse(Option.scala:120)
    at play.core.j.JavaGlobalSettingsAdapter.onError(JavaGlobalSettingsAdapter.scala:36)
    at play.api.Application$class.handleError(Application.scala:319)
    at play.api.DefaultApplication.handleError(Application.scala:402)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320)
    at scala.Option.map(Option.scala:145)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:320)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:316)
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344)
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46)
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40)
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248)
    at scala.concurrent.Promise$class.complete(Promise.scala:55)
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41)

然后是其中一些:

java.io.FileNotFoundException: /opt/psldata-api-1.0.0/app/controllers/APIController.java (Too many open files)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at play.utils.PlayIO$.readFileAsString(PlayIO.scala:63)
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302)
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302)
    at scala.Option.map(Option.scala:145)
    at play.api.Application$$anon$1.input(Application.scala:302)
    at play.api.PlayException$ExceptionSource.interestingLines(PlayException.java:81)
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:157)
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:142)
    at scala.Option.map(Option.scala:145)
    at views.html.defaultpages.devError$.apply(devError.template.scala:142)
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141)
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141)
    at play.api.GlobalSettings$class.onError(GlobalSettings.scala:147)
    at play.core.j.JavaGlobalSettingsAdapter.play$core$j$JavaGlobalSettingsAdapter$$super$onError(JavaGlobalSettingsAdapter.scala:36)
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36)
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36)
    at scala.Option.getOrElse(Option.scala:120)
    at play.core.j.JavaGlobalSettingsAdapter.onError(JavaGlobalSettingsAdapter.scala:36)
    at play.api.Application$class.handleError(Application.scala:319)
    at play.api.DefaultApplication.handleError(Application.scala:402)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320)
    at scala.Option.map(Option.scala:145)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:320)
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:316)
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344)
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46)
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40)
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248)
    at scala.concurrent.Promise$class.complete(Promise.scala:55)
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41)

所以基本上一切都会进一步给出这个错误,直到我重新启动应用程序。似乎是内存泄漏或某些内容未正确关闭,但我不知道可能是什么。以前有人遇到过这个错误吗?谢谢。

最佳答案

从你的文件路径中可以看出你使用的是Linux,它对你可以打开的文件和套接字的数量有限制,通常设置为1024。你可以使用以下命令来计算打开的文件描述符的数量lsof命令。您遇到的问题是您超出了限制。您可以运行lsof -u <playuser> | wc -l检查这个。您可以在 /etc/security/limits.conf 中查看当前为每个用户设置的限制。 (至少对于 Ubuntu 和 RedHat)。

如果您有正当理由打开大量文件处理程序或套接字,那么您可以使用 ulimit 增加限制命令( ulimit -n 将限制设置为系统支持的最大数量)。但如果你不这样做,并且确实发生了泄漏,这只会推迟不可避免的崩溃。

如果没有正当理由打开如此多的文件处理程序和套接字,我会检查以确保您关闭了您创建的任何套接字,并确保您关闭了所有这些 FileInputStreams 。确保在“finally” block 中正确关闭它们。如果没有看到您的 Controller 代码,我无法确定这是关闭 FileInputStreams 的问题,但我建议检查它们。

有一个类似的问题here有关套接字限制的更多详细信息。

关于java - Play Framework 调用 Controller 导致打开文件过多错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36420638/

相关文章:

java - JDBC : Operation not allowed after ResultSet closed

java - 保持交易状态

java - equals 是否应该承受应用程序的业务逻辑的负担?

java - 如何反序列化 RestController 上嵌套的 Kotlin 对象?

java - Hibernate 4.1.3 Multi-Tenancy 空指针异常

spring - JpaRepository 不会保存数据

java - 使用 hibernate 版本列时获取 NPE

java - 每 100 个字符分割一次请求

java - 在 Spring 中创建实体实例,无需任何 Spring 交互

java - 自定义 LineMapper 在 Spring Batch 多文件处理中抛出异常