将Windows / Eclipse中的Java连接到ScotchBox Vagrant Box MySQL数据库

时间:2015-12-16 17:07:39

标签: java mysql eclipse ssh vagrant

问题:如何将我在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 ,将主机作为我的Window计算机的IP地址(从运行Powershell然后ipconfig获得)。然后重新启动一切。那没用。

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

我没有想法和谷歌搜索。我相信这与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

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

1 个答案:

答案 0 :(得分:1)

使用HeidiSQL连接时,通过SSH隧道连接到mysql服务器,并使用VM框中的密钥。这对你来说是(或多或少)透明的,你可以连接到你的mysql服务器。

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

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