如何使用Java连接远程MySQL数据库?

30

我正在尝试使用Eclipse IDE创建一个JSF应用程序。我使用远程的MySQL服务器作为我的数据库。如何连接到这个远程数据库来创建表和访问它们?

我该如何在Eclipse IDE中连接到远程MySQL数据库并进行操作,包括创建表和访问表中的数据?
9个回答

45

只需在数据库连接字符串中提供远程机器的IP /主机名,而不是使用localhost。例如:

jdbc:mysql://192.168.15.25:3306/yourdatabase

确保没有防火墙阻止访问端口3306

另外,请确保您连接的用户被允许从此特定的主机名连接。对于开发环境,可以通过 'username'@'%' 来安全执行此操作。请查看用户创建手册GRANT手册


3
请确保在MySQL模式中为该主机和用户授予适当的权限。 - duffymo
3
请接受这个答案,因为它是针对所提出问题的正确答案。 - Surya Chandra
还要确保:(1)您的PC的IP地址在允许远程连接到数据库服务器的IP地址之中。(2)您数据库的名称 - 如URL中所给出的 - 将是该数据库的完全限定名称。因此,如果实际数据库名为“web_shop”,并且它保存在名为“angelazza”的托管帐户上,则您数据库的完全限定名称为“angelazza_web_shop”。 - Trunk
并且(3)将在上传到数据库服务器的.sql文件中的所有引用更改(假设您离线开发DB并将其上传/粘贴到服务器)从“web_shop”更改为“angelazza_web_shop”,以避免错误。 - Trunk

9
您需要在连接字符串中传递远程机器的IP/主机名。
import java.sql.*;
import javax.sql.*;

public class Connect
{
   public static void main (String[] args)
   {
       Connection conn = null;

       try
       {

           String url = "jdbc:mysql://localhost:3306/mydb";
           Class.forName ("com.mysql.jdbc.Driver");
           conn = DriverManager.getConnection (url,"root"," ");
           System.out.println ("Database connection established");
       }
       catch (Exception e)
       {
           e.printStackTrace();

       }
       finally
       {
           if (conn != null)
           {
               try
               {
                   conn.close ();
                   System.out.println ("Database connection terminated");
               }
               catch (Exception e) { /* ignore close errors */ }
           }
       }
   }
}

我用远程机器地址替换了本地主机,代码如下:String url = "jdbc:mysql://172.18.227.237/struts2"; conn = DriverManager.getConnection(url,"root","admin");。但现在我遇到了错误,com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Access denied for user 'root'@'172.20.169.174' to database 'struts2'。我已经获得了对MySQL服务器的远程访问权限。 - Angeline
有点晚了,但是:将“jdbc:mysql://172.18.227.237/struts2”替换为“jdbc:mysql://172.18.227.237:3306/struts2”(注意端口号)。以防后面的人犯同样的错误。 - Kingsolmn
你永远都无法使用localhost或127.0.0.1连接到远程计算机,无论出于任何目的或原因。 - Rodney P. Barbati

4

如果要从远程计算机访问数据库,您需要授予数据库的所有权限。

请运行以下脚本以授予权限: GRANT ALL PRIVILEGES ON . TO user@'%' IDENTIFIED BY 'password';


2
此外,您应确保MySQL服务器的配置文件(/etc/mysql/my.cnf,在Debian上是/etc/default/mysql)未启用“skip-networking”,并且未仅绑定到环回接口(127.0.0.1),而是绑定到您想要连接的接口/IP地址。

在进行此更改后,请记得通过 sudo /etc/init.d/mysql restart 重新启动远程机器上的mysql。 - cindyxiaoxiaoli

1

在数据库连接字符串中更改VPS的IP /主机名,而不是localhost。例如,如果我的IP地址是193.23.127.130:

jdbc:mysql://193.23.127.130:3306/yourdatabase

然后确保您的VPS防火墙允许MySQL的3306端口。

接下来打开MySQL Workbench,进入Server-Users and Privileges,创建一个账户(在这个例子中账户为remoteUser,密码为password),确保Limit to Hosts Matching是%(表示可以从任何其他IP访问) create user

然后设置密码和授权,最后应用 grant rights

然后您就可以在Java中添加以下代码以进行远程访问

Connection connection = DriverManager.getConnection("jdbc:mysql://193.23.127.130:3306/swing_demo", "remoteUser", "password");

1
  1. 在'schema'中创建一个新用户(mysql.user)。 在你的mysql工作空间中运行以下代码 “GRANT ALL ON . to user@'%'IDENTIFIED BY '';

  2. 打开拥有数据库的机器上的'3306'端口。 控制面板 -> Windows防火墙 -> 高级设置 -> 入站规则 -> 新建规则 -> 端口 -> 下一步 -> TCP & 将端口设置为3306 -> 下一步 -> 下一步 -> 下一步 -> 填写名称和描述 -> 完成 ->

  3. 尝试通过cmd上包含DB服务器IP的telnet消息进行检查


当你在NAT后面时,需要进行端口转发! - zerocool
我在这里更好地理解了第二个答案:http://stackoverflow.com/questions/1700518/remote-mysql-database-access - Gurvan

1
关闭所有连接到服务器监听端口的已打开且已连接的连接,无论是来自应用程序还是客户端工具(如navicat),或者在运行中的服务器(如apache或weblogic)。 首先关闭所有连接,然后重新启动所有工具,例如MySQL,apache等。

0
在Ubuntu上,创建了本地主机和“%”版本的用户,并为两者授予了适当的数据库表访问权限后,我不得不在/etc/mysql/mysql.conf.d/mysql.cnf中注释掉“bind-address”,然后以sudo身份重新启动mysql。

bind-address = 127.0.0.1


0
请在my.cnf文件中更改以下内容:
## 不要使用skip-networking,现在默认只监听本地主机 ## localhost更兼容且不会降低安全性。 ## bind-address = 127.0.0.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接