DataSource的getConnection()忽略端口

时间:2015-10-05 17:23:25

标签: java mysql ssh port

我尝试通过ssh tunnel创建与远程服务器的连接。在我的尝试中我使用了jsch和putty。

int sshPort = 22;

Connection conn = null;
Session session = null;

try {
     //Set StrictHostKeyChecking property to no to avoid UnknownHostKey issue
     java.util.Properties config = new java.util.Properties();
     config.put("StrictHostKeyChecking", "no");

     JSch jsch = new JSch();
     session = jsch.getSession("sshUser", "sshHost", sshPort);
     session.setPassword(sshPassword);
     session.setConfig(config);
     session.connect();

     session.setPortForwardingL(8806, "127.0.0.1", 3306);

     BasicDataSource basicDataSource = new BasicDataSource();
     basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
     //I can type here any value of port, does not matter connection will be created on port 3306
     basicDataSource.setUrl("jdbc:mysql://localhost:8806/db");
     basicDataSource.setUsername("user");
     basicDataSource.setPassword("password");
 }

通过此代码,我希望sshHost:22中有一些localhost:8806可用。

但我得到的是connection = dataSource.getConnection();而不是始终与localhost:3306上的数据库连接。

enter image description here

正如我之前所说,我也尝试通过Putty连接 - 结果相同,通过代码连接忽略端口。

P.S。当我在IDEA的数据库工具上连接到'localhost:8806'时,Putty的隧道才有效。

P.P.S。感谢@Cool建议,我现在能够从代码中建立隧道。但是dataSource继续忽略该端口。

1 个答案:

答案 0 :(得分:1)

你应该转发" 8806"到" 3306"不要去" 22"港口。 所以我现在无法测试它,但你应该使用以下行

session.setPortForwardingL(8806, "sshHost", 3306);

顺便说一句,你可以使用以下内容而不需要腻子等。

ssh sshUser@sshHost -L 8806:localhost:3306