Prueba de rendimiento tres: desarrollo de código JDBC

Ejecute el script Java usando Jmeter

1. Dependencias que deben agregarse en el proyecto JAVA

Paso uno: agregar lib

  • El paquete jar de framework proporcionado por Jmeter (en los directorios lib y ext en el directorio jmeter respectivamente)
    • ApacheJMeter_core.jar
    • ApacheJMeter_java.jar
    • slf4j-api-1.7.25.jar
    • jorphan.jar
    • oro-2.0.8.jar
  • Vincular dependencias de bases de datos:
    • mysql-connect-java-número de versión.jar

imagen.png

Paso 2: agregue lib a la variable de entorno del proyecto

  1. Abra Archivo → Estructura del proyecto → Bibliotecas → 【+】 → 【Java】
  2. imagen.png

2. Utilice Java para conectarse a la base de datos y procesar datos.

Agregar, eliminar y modificar datos

package test1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class test_setData {
    
    
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    
    
        // 1、注册驱动,告诉jdbc链接数据库的类型,传入MySQL的驱动类名
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8";
        String username = "";
        String password = "";
        String sql = "";

        // 2、通过ip、端口号、数据库名、用户名、密码,建立连接,返回一个链接对象Connection
        Connection conn = DriverManager.getConnection(url,username,password);

        //3、对SQL语句进行预编译,提升执行性能
        PreparedStatement ps = conn.prepareStatement(sql);

        /*
        * 如果SQL = "UPDATE user_identity SET name='?' where user_id = ?"
        * 其中有问号,则需要对?进行赋值
        * ps.setString(1,"test1);
        * ps.setInt(2,123456);
        * */

        //4、执行SQL,增删改用executeLargeUpdate;查用executeQuery()
        //增删改
        ps.executeLargeUpdate(sql);
        /*查
        ResultSet set = ps.executeQuery();
        while (set.next()){
          String name = set.getString("name");
          System.out.println(name);
        }
		*/

        // 5、关闭数据库连接,以防数据库崩溃
        conn.close();
    }
}

3. Ejecute la solicitud de Java en JMeter

Paso 1: Para escribir código
, debe modificar el código en la sección anterior para adaptarlo a la ejecución de solicitudes de Java en JMeter.
Primero herede el método en JavaSamplerClient y seleccione la interfaz que se heredará a través de la posición en la Figura 1.
Figura 1
imagen.png

package test1;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.sql.*;


public class test_JmeterOnJava implements JavaSamplerClient {
    
    
   public static void main(String[] args) {
    
    
        Arguments arguments = new Arguments();
        JavaSamplerContext context = new JavaSamplerContext(arguments);
        test_JmeterOnJava test = new test_JmeterOnJava();
        test.setupTest(context);
        test.runTest(context);
        test.teardownTest(context);
    }

    String url = "jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8";
    String username = "";
    String password = "";
    // String sql = "UPDATE user_identity SET name='zyt186药剂师' where user_id = 38602938";
    String sql = "select * from where  ....";
    Connection conn;
    PreparedStatement ps;

    /**
     * 初始化函数,每个线程先执行此函数,并且仅执行一次
     */
    @Override
    public void setupTest(JavaSamplerContext javaSamplerContext) {
    
    
        try {
    
    
            // 1、注册驱动,告诉jdbc链接数据库的类型,传入MySQL的驱动类名
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2、通过ip、端口号、数据库名、用户名、密码,建立连接,返回一个链接对象Connection
            //3、对SQL语句进行预编译,提升执行性能
            conn = DriverManager.getConnection(url, username, password);
            ps = conn.prepareStatement(sql);

        } catch (ClassNotFoundException | SQLException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 执行业务代码函数,在setupTest方法后执行,每个线程执行N次
     */
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
    
    
        SampleResult sampleResult = new SampleResult();
        // 设置请求名字
        sampleResult.setSampleLabel("select");
        ResultSet set = null;

        // 设置请求开始、结束时间,是为了拿到请求响应的时间
        //请求开始
        sampleResult.sampleStart();

        try {
    
    
            set = ps.executeQuery();
        } catch (SQLException ex) {
    
    
            throw new RuntimeException(ex);
        }
        //请求结束
            sampleResult.sampleEnd();
            while (true) {
    
    
                try {
    
    
                    if (!set.next()) break;
                } catch (SQLException ex) {
    
    
                    throw new RuntimeException(ex);
                }
                String name = null;
                try {
    
    
                    name = set.getString("name");
                } catch (SQLException ex) {
    
    
                    throw new RuntimeException(ex);
                }
                System.out.println(name);
                sampleResult.setSuccessful(true);

            }
        return sampleResult;
    }

    /**
     * 结束函数,在脚本运行结束时执行,每个线程仅执行一次
     */
    @Override
    public void teardownTest(JavaSamplerContext javaSamplerContext) {
    
    
        // 5、关闭数据库连接,以防数据库崩溃
        try {
    
    
            conn.close();
        } catch (SQLException e) {
    
    
            throw new RuntimeException(e);
        }
    }

    @Override
    public Arguments getDefaultParameters() {
    
    
        return null;
    }


}

Informar un error

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: org/apache/oro/text/regex/Perl5Matcher
	at org.apache.jmeter.util.JMeterUtils.<clinit>(JMeterUtils.java:141)
	at org.apache.jmeter.samplers.SampleResult.<clinit>(SampleResult.java:77)
	at test1.test_JmeterOnJava.runTest(test_JmeterOnJava.java:50)
	at test1.test_JmeterOnJava.main(test_JmeterOnJava.java:17)
Caused by: java.lang.NoClassDefFoundError: org/apache/oro/text/regex/Perl5Matcher
	... 4 more
Caused by: java.lang.ClassNotFoundException: org.apache.oro.text.regex.Perl5Matcher
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 4 more

Errores encontrados:
1. Cargando la clase com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver". El controlador se registra automáticamente a través del SPI y la carga manual de la clase del controlador generalmente no es necesaria. Solución
: cambie jdbc.properties settings.com.mysql. jdbc .El controlador cambió a com.mysql.cj.jdbc.Driver

2. Puede haber un problema de [falta: org.apache.oro.text.regex.Perl5Matcher]. Importe el siguiente paquete jar oro para resolverlo.
Descargue el paquete jar https://www.aliyundrive.com/s/UvKY7eygktD

Paso 2: Exportar el script como un paquete jar
1. archivo→estructura del proyecto→artiacts→JAR→de módulos con dependencias
imagen.png
2. Seleccione el script a exportar en la clase principal
imagen.png
3. Guárdelo todo el tiempo y estará bien
imagen.png
4. Seleccione compilar → crear artefactos
imagen.png
en el archivo El paquete jar exportado se puede encontrar en la carpeta
imagen.png
5. El paquete jar se coloca en \apache-jmeter-5.5\bin\ext, reinicie Jmeter y seleccione el nombre del paquete jar importado en la solicitud de Java
imagen.png
6 . ¡Éxito! imagen.png
cmd imprimirá el código en

4. Parametrización

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.sql.*;
public class test_JavaOnJmeter implements JavaSamplerClient {
    
    
    String sql = "select * from user_identity where user_id = ?";
    Connection conn;
    PreparedStatement ps;


    public static void main(String[] args) {
    
    
        //模拟jmeter执行一次脚本
        test_JavaOnJmeter test = new test_JavaOnJmeter();
        JavaSamplerContext context = new JavaSamplerContext(test.getDefaultParameters());

        test.setupTest(context);
        test.runTest(context);
        test.teardownTest(context);
    }

    /**
     * 初始化函数,每个线程先执行此函数,并且仅执行一次
     */
    @Override
    public void setupTest(JavaSamplerContext javaSamplerContext) {
    
    
        try {
    
    
            // 1、注册驱动,告诉jdbc链接数据库的类型,传入MySQL的驱动类名
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2、通过ip、端口号、数据库名、用户名、密码,建立连接,返回一个链接对象Connection
            String url = javaSamplerContext.getParameter("url");
            System.out.println(url);
            String dbUserName = javaSamplerContext.getParameter("dbUsername");
            System.out.println(dbUserName);
            String dbPassword = javaSamplerContext.getParameter("dbPassword");
            System.out.println(dbPassword);

            //3、对SQL语句进行预编译,提升执行性能
            conn = DriverManager.getConnection(url,dbUserName,dbPassword);
            ps = conn.prepareStatement(sql);

        } catch (ClassNotFoundException | SQLException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 执行业务代码函数,在setupTest方法后执行,每个线程执行N次
     */
    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
    
    
        SampleResult sampleResult = new SampleResult();

        // 设置请求名字
        sampleResult.setSampleLabel("select");
        ResultSet set = null;

        // 设置请求开始、结束时间,是为了拿到请求响应的时间
        //请求开始
        sampleResult.sampleStart();

        try {
    
    
            int userId = javaSamplerContext.getIntParameter("userId");
            ps.setInt(1,userId);
            set = ps.executeQuery();
        } catch (SQLException ex) {
    
    
            throw new RuntimeException(ex);
        }
        //请求结束
        sampleResult.sampleEnd();
        while (true) {
    
    
            try {
    
    
                if (!set.next()) break;
            } catch (SQLException ex) {
    
    
                throw new RuntimeException(ex);
            }
            String name = null;
            try {
    
    
                name = set.getString("name");
            } catch (SQLException ex) {
    
    
                throw new RuntimeException(ex);
            }
            System.out.println(name);
            sampleResult.setSuccessful(true);

        }
        return sampleResult;
    }

    /**
     * 结束函数,在脚本运行结束时执行,每个线程仅执行一次
     */
    @Override
    public void teardownTest(JavaSamplerContext javaSamplerContext) {
    
    
        // 5、关闭数据库连接,以防数据库崩溃
        try {
    
    
            conn.close();
        } catch (SQLException e) {
    
    
            throw new RuntimeException(e);
        }
    }

    @Override
    public Arguments getDefaultParameters() {
    
    
        Arguments arguments = new Arguments();
        arguments.addArgument("url","");
        arguments.addArgument("dbUsername","");
        arguments.addArgument("dbPassword","");
        arguments.addArgument("userId","");
        return arguments;
    }
}

Supongo que te gusta

Origin blog.csdn.net/TDLDDMZ/article/details/131153650
Recomendado
Clasificación