Java 两个应用程序使用JDBC连接到mysql数据库:一个工作,另一个提供;网络适配器无法建立连接";

Java 两个应用程序使用JDBC连接到mysql数据库:一个工作,另一个提供;网络适配器无法建立连接";,java,mysql,jdbc,Java,Mysql,Jdbc,我在EclipseNeon中打开了两个使用JDBC和MySQL的应用程序 一项申请包括: Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","root","password"); 另一个应用程序具有: Class.forName("com.mysql.jdbc.Driver"); Connection

我在EclipseNeon中打开了两个使用JDBC和MySQL的应用程序

一项申请包括:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","root","password");
另一个应用程序具有:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase","root","password");
我已经在eclipse中多次一个接一个地运行了这两个应用程序。第一个应用程序可以运行以连接并读写数据库。 第二个应用程序在调用
DriverManager.getConnection()
方法时总是出现异常

java.sql.SQLException: Io exception: The Network Adapter could not establish the connection

我在谷歌上搜索了这个错误,似乎说这是我的网络适配器问题。但是,如果是,为什么它只适用于一个应用程序而不适用于另一个应用程序,但是我以任何顺序运行它们?

我认为您的第二个应用程序正在连接到Oracle数据库和MySQL数据库,失败的是与Oracle的连接,而不是与MySQL的连接

以以下代码为例(无可否认是相当愚蠢的):

这段代码试图建立两个数据库连接,一个连接到Oracle,一个连接到MySQL,这两个连接都会失败。(服务器
8.8.8.8
不会运行这两个数据库。)运行此代码时,我得到以下输出:

连接到MySQL。。。
MySQL连接失败:通信链路失败
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
正在连接到Oracle。。。
Oracle连接失败:IO错误:网络适配器无法建立连接

请注意,MySQL连接失败错误与您得到的错误不同,而Oracle连接失败错误与之匹配。

这一切都与关闭有关。JDBC最好与try-with-resources一起使用

try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase",
            "root", "password")) {
    try (PreparedStatement stmt = conn.prepareStatement(...)) {
         ...
         try (ResultSet rs = stmt.executeQuery()) {
             ... return / throw ... no problem
         }
    }
}
对于连接,连接池是一个选项,它可以加快应用程序的速度,因为建立连接需要付出代价。
(几年后就不需要Class.forName了。)

也许您已经达到了可用的最大连接数。mySQL允许多少个连接?应用程序是否正确关闭了连接?@AndrewS,谢谢。我一次又一次地调试应用程序,大多数时候我没有达到close方法,然后重新启动调试。这能创建越来越多到mysql服务器的连接吗?或者每次我退出调试时,连接都会自动关闭?我如何检查我的mysql服务器有多少连接?@Vlad谢谢。假设原因是我达到了最大连接限制。我一个接一个地重复运行这两个应用程序,即以交错顺序运行,它始终是第一个可以运行的应用程序,而第二个应用程序给出了例外。这是否意味着同一应用程序的多次运行将重用同一连接?连接到MySQL数据库时,如何获得Oracle异常?请张贴完整的异常stacktrace,并包括一个我认为这是一个伟大的猜测的原因。当然,通过查看stacktrace并查看错误发生的位置,很容易(通过OP)进行验证。嗨,Luke,我正在运行Ubuntu,Oracle数据库不支持Ubuntu。我的帖子中显示了这两个应用程序的数据库连接部分,它们都是针对MySQL的。@Mary:什么在运行Ubuntu,你的开发机器还是数据库服务器?如果您运行的是Ubuntu,那么数据库很可能位于另一台机器上。或者,可能在任何地方都没有Oracle数据库,但您的应用程序中仍然有代码试图使用Oracle JDBC驱动程序连接到(不存在的)Oracle数据库。“网络适配器无法建立连接”这条消息是Oracle工具的一个非常典型的特征,这就是我写这个答案的原因。嗨,Luke,在我重新启动Eclipse并在其中重新打开应用程序后,问题消失了。请注意,该应用程序最初是为Oracle DB编写的,但我已将其更改为使用MySQL并保存了文件,在您提到该异常特定于Oracle DB之后,我感到很奇怪。谢谢,Joop!我注意到第二个应用程序没有对连接和准备好的语句进行关闭操作。而第一个是。我想知道这是否会导致第二个应用程序出现“java.sql.SQLException:Io exception:networkadapter无法建立连接”,在谷歌搜索之后,我还没有找到其他类似的报告。这是操作系统组件的严重资源泄漏。我自己多年没有遇到过,所以不能多说。幸运的是,对于首先要做什么没有问题。否决,因为这并不能回答为什么相同的代码在一种情况下显然有效,而在另一种情况下却不起作用。@LittleSanti你的否决是有道理的,因为我确实应该提到,不关闭东西很快就会占用免费连接等等。令人尴尬的是,对于影响系统行为的各种各样的超时和设置(如会话超时),我说不出多少。
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase",
            "root", "password")) {
    try (PreparedStatement stmt = conn.prepareStatement(...)) {
         ...
         try (ResultSet rs = stmt.executeQuery()) {
             ... return / throw ... no problem
         }
    }
}