Java在线程是GCd之后的很长一段时间内随机挂起JDBC连接

Java在线程是GCd之后的很长一段时间内随机挂起JDBC连接,java,mysql,jdbc,ubuntu-12.04,Java,Mysql,Jdbc,Ubuntu 12.04,我们有一个相当简单的JavaSE独立应用程序,可以作为调度器工作。每次它触发一个新计划时,都会创建一个新线程,在该线程中从DriverManager.getConnection获取一个新的JDBC连接 多年来一直运行良好。当时和现在,显然是随机的,这些连接挂起数百秒,很快耗尽了允许的最大MySQL连接数 在其中一次事件中,我通过jstack抓取了一个线程转储,它显示了我们的两个调度线程加上一小部分看起来像jvm内务管理的线程。因此,我们自己的线程似乎已经按照预期进行了垃圾收集 如果我还抓取了ja

我们有一个相当简单的JavaSE独立应用程序,可以作为调度器工作。每次它触发一个新计划时,都会创建一个新线程,在该线程中从DriverManager.getConnection获取一个新的JDBC连接

多年来一直运行良好。当时和现在,显然是随机的,这些连接挂起数百秒,很快耗尽了允许的最大MySQL连接数

在其中一次事件中,我通过jstack抓取了一个线程转储,它显示了我们的两个调度线程加上一小部分看起来像jvm内务管理的线程。因此,我们自己的线程似乎已经按照预期进行了垃圾收集

如果我还抓取了java进程的lsof输出,我会看到许多到MySQL的连接。我不知道该怎么解释

有人能提出建议吗


注意:我们还将一个测试服务器切换到MariaDB,并在一段时间后观察到相同的突然行为。

完成连接后,您是否明确关闭连接?例如,此答案表示在finally块中按该顺序关闭结果集、语句和连接:为什么不关闭池连接?打开新的调度程序有点麻烦…@BoristheSpider,因为调度程序应用程序可能安装在一个没有该数据库的盒子上,因此永远不会调用该调度程序,因此所有内容都是按需动态进行的。您可以始终懒洋洋地初始化池。它们非常灵活。问题是,如果你自己打开/关闭连接,你还需要管理它们的生命周期——确保它们正确关闭;处理陈旧的连接等。。。几乎没有任何企业应用程序手动处理连接。