【问题标题】:Connecting Java in Windows/Eclipse to a ScotchBox Vagrant Box MySQL Database将 Windows/Eclipse 中的 Java 连接到 ScotchBox Vagrant Box MySQL 数据库
【发布时间】:2015-12-17 04:47:52
【问题描述】:

问题:如何将我在 Windows 7 计算机上编写的 Java 应用程序连接到同一台计算机上的 ScotchBox Vagrant 盒子?

我是 Java 的超级新手。我已经用 PHP 编码两年了,我的团队将在接下来的几个月内切换到 Java。为了更好地理解 Java,我想我会尝试连接到数据库、运行查询并在 Eclipse 中遍历结果。 (特别是 Spring,但我还没有使用它。现在只是简单的 Java。)在部署到生产之前,我有一个用于本地开发的 Vagrant ScotchBox(LAMP 堆栈)。我在使用这个 Vagrant Box 方面处于中等水平。

下载 Java 的 MySQL 驱动程序后,将它们放在 Eclipse 项目中的 lib 文件夹中,并将它们添加到类路径中,我运行以下代码,它可以很好地连接到我的生产数据库:

//import java SQL library
import java.sql.*;

//main class
public class App {
  //main method
  public static void main(String[] args) {
    //You have to put this whole thing in a try { } catch { }
    try {
        //Connection strings (Changed for this post)
        String db   = "jdbc:mysql://123.456.78.90:3306/db_name";
        String user = "username";
        String pwd  = "password";

        //1. Get connection to database
        Connection myConn = DriverManager.getConnection(db, user, pwd);

        //2. Create statement
        Statement myStmt = myConn.createStatement();

        //3. Execute SQL query
        ResultSet myRs = myStmt.executeQuery("SELECT * FROM people");

        //4. Process result set
        while (myRs.next()) {
            System.out.println(myRs.getString("firstName") + ", " + myRs.getString("lastName"));
        }
    }
    //Exception handling
    catch (Exception exc) {
        exc.printStackTrace();
    }
  }
}

当我将 IP 地址更改为用于 ScotchBox 的默认 IP 地址时...

String db   = "jdbc:mysql://192.168.33.10:3306/db_name";

...我收到以下错误;

[REMOVED - SEE UPDATE BELOW PLEASE]

请记住,我本地 ScotchBox Vagrant Box 上的数据库在名称、表和列上与我的生产数据库相同。用户名和密码也一样。

我已经尝试了一些方法来解决这个问题。


当我使用 HeidiSQL(安装在我的 Windows 计算机上)连接到我的 ScotchBox 数据库时,我使用 127.0.0.1。所以我尝试在我的 Java 代码中使用 127.0.0.1 而不是 192.168.33.10,即String db = "jdbc:mysql://127.0.0.1:3306/db_name";。那没用。

我尝试在我的 ScotchBox 上的 /etc/mysql/my.cnf 中打开权限。在写着bind-address = 127.0.0.1的那一行,我把IP地址改成了0.0.0.0,然后重启了mysql和apache,还是不行。所以我用#号注释掉了整行,然后重新启动了mysql和apache。那也没用。

我完成了上述操作,同时还进入了 HeidiSQL 中的用户权限并添加 user 主机为%,然后重新启动所有内容。那没有用。所以我随后添加了 user 和主机作为我的 Window 计算机的 IP 地址(从运行 Powershell 然后 ipconfig 获得)。然后重新启动一切。那没用。


我假设值得注意的是,当您使用 ScotchBox 的 MySQL 数据库时,您必须使用网络类型 SSH 隧道登录。它需要 MySQL 用户名和密码,然后是 SSH 主机的 SSH 用户名和密码,以及一个叫做 plink 文件的东西。我不确定这是否与它有关。

我没有想法和 Google 搜索。我相当有信心这与 Java 的关系不大,而与 MySQL 中某处的权限有关,但在用尽所有其他已知选项后,我只是不知道或没有足够的知识来弄清楚。

请帮忙!


更新

我已将JSch / jcraft 添加到我的项目中,我认为这是我需要进入的方向。但是,我仍然遇到连接问题。

我正在使用 Vagrant ScotchBox 页面中的所有 MySQL 信息,页面底部是 HERE

以下是我更新的代码,以及我遇到的新错误。

//import java SQL library
import java.sql.*;
import com.jcraft.jsch.*;

//main class
public class App {
  //main method
  public static void main(String[] args) {
    //You have to put this whole thing in a try { } catch { }
    try {
        int lport;
        String rhost;
        int rport;

        JSch jsch = new JSch();
        Session session = jsch.getSession("vagrant", "192.168.33.10", 0);
        lport = 3307;
        rhost = "localhost";
        rport = 3306;
        session.setPassword("vagrant");
        session.setConfig("StrictHostKeyChecking", "no");
        System.out.println("Establishing Connection...");
        session.connect();
        int assinged_port=session.setPortForwardingL(lport, rhost, rport);
        System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);

        //Connection strings
        String db   = "jdbc:mysql://192.168.33.10:3306/ug_warehouse";
        String user = "root";
        String pwd  = "root";

        Connection myConn = null;

        //1. Get connection to database
        myConn = DriverManager.getConnection(db, user, pwd);

        //2. Create statement
        Statement myStmt = myConn.createStatement();

        //3. Execute SQL query
        ResultSet myRs = myStmt.executeQuery("SELECT * FROM user");

        //4. Process result set
        while (myRs.next()) {
            System.out.println(myRs.getString("firstname") + ", " + myRs.getString("lastname"));
        }
    }
    //Exception handling
    catch (Exception exc) {
        exc.printStackTrace();
    }
  }
}

-

Establishing Connection...
com.jcraft.jsch.JSchException: java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine
at com.jcraft.jsch.Util.createSocket(Util.java:349)
at com.jcraft.jsch.Session.connect(Session.java:215)
at com.jcraft.jsch.Session.connect(Session.java:183)
at App.main(App.java:23)
Caused by: java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at com.jcraft.jsch.Util.createSocket(Util.java:343)
... 3 more

我觉得这是我要走的正确道路。知道我在做什么/输入错误吗?我觉得我只是不了解端口的去向。

【问题讨论】:

  • 你为什么有Session session = jsch.getSession("vagrant", "192.168.33.10", 0);?第三个参数是ssh的端口号,应该设置为22

标签: java mysql eclipse ssh vagrant


【解决方案1】:

当您使用 HeidiSQL 连接时,您通过 SSH 隧道连接到 mysql 服务器,并使用您拥有的用于 VM 框的密钥。这对您来说(或多或少)是透明的,您只需连接到您的 mysql 服务器即可。

当您编写 Java 程序时,实际上您也想做同样的事情,但这不是您正在做的事情,因为使用 "jdbc:mysql://123.456.78.90:3306/db_name" 您正在直接连接到服务器。

话虽如此,您可能需要进行更多的 Java 编码(这对您有好处,但不确定您是否会长期使用它)。在 Java 中管理 SSH 连接的最著名的库是 http://www.jcraft.com/jsch/。还有一个很好的 blog post 可以让它工作。

【讨论】:

  • 谢谢。这让我走得很远。我将用我现在拥有的内容更新我的帖子,并提供一个链接,可以帮助您或其他人帮助我找到解决方案。
猜你喜欢
  • 2014-06-10
  • 2015-02-19
  • 2017-07-06
  • 2016-07-07
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多