Java jmeter 使用 ssh 方式访问数据库

喵喵 · 2020年10月19日 · 最后由 喵喵 回复于 2020年10月20日 · 3933 次阅读

1. 背景

出差某单位现场,测试性能问题,Jmeter 脚本中存在通过连接池访问数据库方式获取数据,客户现场不允许直接连接数据库访问数据,而是通过 ssh 方式连接到数据库服务,在通过 127.0.0.1 的方式访问

2.解决思路

  • 通过 java,建立 ssh 通道,配置本地转发到远程和远程转发到本地的相关参数

  • 通过 jdbc:mysql://127.0.0.1:映射到本地的端口/dbname 方式访问 mysql

3.实现

3.1 java 实现建立 ssh

package ssh_connect;

    import com.jcraft.jsch.JSch;

    import com.jcraft.jsch.JSchException;

    import com.jcraft.jsch.Session;

    import java.sql.*;

    public class connect_ssh{



        /*

         * lPort:映射到本地的端口

         * sship:ssh服务ip

         * sshport:ssh端口,默认22

         * sshname:ssh用户名

         * sshpwd:ssh密码

         * mysqlport:mysql服务端口

         */

    public static void start_ssh(int lPort,String sship,int sshport,String sshname,

            String sshpwd,int mysqlport){

        JSch jsch=null;

        Session session = null;  

        try{        

                jsch = new JSch();

                //设置ssh的用户名、ip地址、端口,一般默认端口22

                session = jsch.getSession(sshname, sship, sshport);

                session.setPassword(sshpwd);  

                session.setConfig("StrictHostKeyChecking", "no");  

                session.connect();  

                //本地转发到远程

                session.setPortForwardingL(lPort, sship, mysqlport);

                //远程转发到本地

                session.setPortForwardingR(mysqlport,sship, lPort);

                //调试时可以解注

    //                System.out.println("ssh连接成功,ssh版本号:"+session.getServerVersion());

            }

        catch (Exception e){

                e.printStackTrace();

        }

    }



    //调试时可以解注

    // public static void main(String[] args) throws Exception{

    //     start_ssh(3334,"172.16.81.29",22,"htc","123123",3307);

    // }

    //

        }

3.2 将该方法打成 jar 包

下载ssh.jar

3.3 在 Jmeter 脚本中使用

前提:将ssh.jar包和jsch-0.1.54.jar包放在 jmeter/lib/ext 下面,重启 jmeter

第一步:

  • 在线程中,建立一个 Beanshell 请求,内容如下:
// 参数依次为:

    //映射到本地的端口(确保没有被占用);

    //sh服务ip;

    //ssh端口(默认22);

    //ssh用户名;

    //ssh密码;

    //mysql服务端口

     import ssh_connect.connect_ssh;

     connect_ssh a= new connect_ssh();

     a.start_ssh(3338,"172.16.81.29",22,"root","123123",3307);

第二步:

  • 添加 JDBC Connection Configuration

url 位置:jdbc:mysql://127.0.0.1:beanshell 中设置的映射到本地的端口/数据库名称?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8

第三步:

  • 正常添加 JDBC Request

** 注意:**

建立 ssh 之前,需要确保映射到本地的端口没有被占用
ssh 建立一次之后,就无需建立了,在脚本里注释就好

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

你这 ssh 和界面化连接数据库有啥区别😂

黑山老妖 回复

现场也是为了数据库安全考虑,不允许使用 ip 直接连接数据库,首先拿到服务器的身份(ssh+ 用户名 + 密码),在通过 127.0.0.1 的方式才能访问数据库,咱们测试是在另外一台机器上,使用 jmeter 来测试压力,所以这么配一下哈

黑山老妖 回复

你说的界面化连接数据库是 JDBC Connection Configration 不

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册