JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API。通过这个API,可以直接连接并执行SQL脚本,与数据库进行交互。
使用JMeter压力测试时,操作数据库的场景
在使用JMeter进行接口压力测试时,有时需要批量生成测试数据,这时可以使用JMeter连接数据库以创建相应的测试数据。测试结束后,还需要对测试数据进行还原或删除,以清理不必要的数据。这些操作都涉及到连接数据库并执行SQL语句。
以下是使用JMeter连接数据库的方法:
🧹 添加JDBC驱动程序:将JDBC驱动程序(如:MySQL驱动程序)添加到JMeter的<Apache-JMeter>/lib
目录下。
🧹 配置JDBC连接字符串:在JMeter中,使用JDBC Connection Configuration元件配置数据库连接信息,包括URL、用户名、密码等。
🧹 编写JDBC请求:使用JDBC Request元件编写SQL语句,并在JMeter中执行。
🧹 添加JDBC预处理语句:在JMeter中,使用JDBC PreProcessor元件添加预处理语句,如:插入、更新等操作。
🧹 添加JDBC后置处理语句:在JMeter中,使用JDBC PostProcessor元件添加后置处理语句,如:查询、删除等操作。
通过以上步骤,可以在JMeter中使用JDBC接口连接数据库,执行SQL语句,以满足压力测试中的数据准备和清理需求。
Jmeter 连接 Mysql 数据库需安装对应的驱动包;
📩 下载地址:https://dev.mysql.com/downloads/connector/j/
**安装:**下载完成后解压放到Jmeter的 lib 下;
在 JMeter 主界面上,右键单击 Test Plan,然后选择 Add -> Threads (Users) -> Thread Group。这将创建一个线程组。
📩 步骤:添加配置元件 - JDBC Connection Configuration;
在 JDBC 连接中,配置数据库连接信息,包括 JDBC URL、用户名和密码等。
☕ **Variable Name for created pool:**字段用于设置一个变量名,该变量名将用于在测试计划中引用创建的JDBC连接池;
例如:如果将"Variable Name for created pool"字段设置为myJdbcPool
,则可以在其他JDBC元件(如JDBC Request、JDBC PreProcessor和JDBC PostProcessor)中通过在"Variable Name"字段中输入myJdbcPool
来引用此JDBC连接池。
这样,可以在测试计划中轻松地重用JDBC连接池,而无需为每个JDBC元件单独配置连接信息。这有助于提高测试计划的可维护性和可读性。
☕ Database URL:字段用于指定要连接的数据库的JDBC URL;
JDBC URL的格式通常为:jdbc:<数据库类型>://<主机名>:<端口号>/<数据库名>。以下是一些常见数据库的JDBC URL示例:
MySQL:
jdbc:mysql://localhost:3306/mydatabase
PostgreSQL:jdbc:postgresql://localhost:5432/mydatabase
Oracle:jdbc:oracle:thin:@localhost:1521:mydatabase
SQL Server:jdbc:sqlserver://localhost:1433;databaseName=mydatabase
请根据要连接的数据库类型和配置替换相应的值。在配置JDBC Connection Configuration元件时,请确保输入正确的JDBC URL,以便JMeter能够成功连接到目标数据库。
在JDBC URL中,可以在数据库名称之后添加一些可选参数,以便进一步配置连接(不喜欢可以不写)
MySQL:
useSSL=false
:禁用SSL加密。serverTimezone=UTC
:设置服务器时区。allowPublicKeyRetrieval=true
:允许从服务器获取公钥。useUnicode=true
:使用Unicode字符集。characterEncoding=UTF-8
:设置字符编码为UTF-8。 示例: jdbc:mysql://localhost:3306/mydatabase? useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8 PostgreSQL:ssl=false
:禁用SSL加密。sslmode=disable
:禁用SSL模式。currentSchema=myschema
:设置当前模式。 示例:jdbc:postgresql://localhost:5432/mydatabase?ssl=false&sslmode=disable¤tSchema=myschema Oracle:useSSL=false
:禁用SSL加密。defaultRowPrefetch=50
:设置默认的行预取值。 示例:jdbc:oracle:thin:@localhost:1521:mydatabase?useSSL=false&defaultRowPrefetch=50 SQL Server:encrypt=false
:禁用加密。trustServerCertificate=true
:信任服务器证书。loginTimeout=30
:设置登录超时时间(以秒为单位)。 示例: jdbc:sqlserver://localhost:1433;databaseName=mydatabase;encrypt=false;trustServerCertificate=true;loginTimeout=30
请注意,这些参数可能因数据库类型和驱动程序版本而异。在配置JDBC URL时,请根据数据库类型和驱动程序版本选择合适的参数。如果不确定要使用哪些参数,可以查阅数据库驱动程序的文档以获取更多信息。在大多数情况下,不需要添加这些可选参数,除非需要进一步配置连接。
☕ **JDBC Driver class:**JDBC 驱动程序类名,用于加载数据库的 JDBC 驱动程序。每个数据库都有对应的驱动程序类名。例如,对于 MySQL 数据库,驱动程序类名通常是 com.mysql.jdbc.Driver
。
☕ **username:**数据库的用户名;
☕ **passwrod:**数据库的密码;
其他参数请自行翻阅API;
**JDBC Driver:**不同的数据库和驱动连接方式参考下表
📩 步骤 :在线程组上右键单击,选择 Add -> Sampler -> JDBC Request (线程组-添加-取样器-JDBC Request)。将创建一个 JDBC 请求,用于模拟数据库操作。
❣️ **Variable Name bound to pool:**字段用于指定一个已经在JDBC Connection Configuration元件中创建的JDBC连接池的变量名
例如,如果在JDBC Connection Configuration元件中将"Variable Name for created pool"字段设置为myJdbcPool
,则可以在JDBC Request元件中将"Variable Name bound to pool"字段设置为myJdbcPool
,以便使用此JDBC连接池。
这样,可以在测试计划中轻松地重用JDBC连接池,而无需为每个JDBC Request元件单独配置连接信息。这有助于提高测试计划的可维护性和可读性。请确保在JDBC Request元件中输入正确的变量名,以便JMeter能够找到并使用正确的JDBC连接池。
❣️ Query Type: 字段用于指定要执行的SQL查询类型
Select Statement:执行一个SQL SELECT查询,用于从数据库中检索数据。 Update Statement:执行一个SQL UPDATE查询,用于修改数据库中的数据。 Insert Statement:执行一个SQL INSERT查询,用于向数据库中插入新数据。 Delete Statement:执行一个SQL DELETE查询,用于从数据库中删除数据。 Callable Statement:执行一个SQL存储过程或函数。 Prepared Select Statement:执行一个预编译的SQL SELECT查询,用于从数据库中检索数据。与"Select Statement"类似,但使用预编译的查询可以提高性能并防止SQL注入攻击。 Prepared Update Statement:执行一个预编译的SQL UPDATE查询,用于修改数据库中的数据。与"Update Statement"类似,但使用预编译的查询可以提高性能并防止SQL注入攻击。
在配置JDBC Request元件时,请根据要执行的SQL查询类型选择合适的"Query Type"。在执行预编译查询时,还需要在"Parameter values"字段中指定查询参数的值。请确保选择正确的"Query Type",以便JMeter能够正确执行SQL查询。
❣️ Query: 字段用于输入要执行的SQL查询语句;
在JMeter的JDBC Request元件中,"Query"字段用于输入要执行的SQL查询语句
以下是一些常见的SQL查询示例:
Select Statement:
SELECT * FROM users WHERE username = 'JohnDoe';
Update Statement:
UPDATE users SET email = 'newemail@example.com' WHERE username = 'JohnDoe';
Insert Statement:
INSERT INTO users (username, email) VALUES ('JohnDoe', 'johndoe@example.com');
Delete Statement:
DELETE FROM users WHERE username = 'JohnDoe';
Callable Statement:
{call my_stored_procedure(?, ?)}
在配置JDBC Request元件时,请根据要执行的SQL查询类型和需求输入相应的查询语句。请确保输入正确的查询语句,以便JMeter能够正确执行SQL查询。如果使用的是预编译查询,请确保在"Parameter values"字段中指定查询参数的值。在执行存储过程或函数时,请确保在"Query"字段中使用正确的语法。
在JMeter的JDBC Request元件中,确实不建议在"Query"字段中使用分号(;),因为JMeter可能无法正确解析和执行带有分号的查询语句
在JMeter的JDBC Request元件中,不支持在单个"Query"字段中编写多条SQL语句。如果需要执行多条SQL语句,可以考虑以下方法:
- 使用多个JDBC Request元件:为每个SQL语句创建一个单独的JDBC Request元件。这样,可以在每个元件中编写一条SQL语句,并按照测试计划中的顺序执行它们。
- 使用事务:如果数据库支持事务,可以在单个JDBC Request元件中使用事务来执行多条SQL语句。在"Query"字段中编写一个BEGIN TRANSACTION语句,然后编写的SQL语句,最后编写一个COMMIT或ROLLBACK语句。这样,可以在单个JDBC Request元件中执行多条SQL语句,并确保它们作为一个原子操作执行。
请注意,这些方法可能因数据库类型和驱动程序版本而异。在使用JMeter的JDBC Request元件时,请根据的数据库类型和驱动程序版本选择合适的方法。如果不确定如何执行多条SQL语句,可以查阅数据库驱动程序的文档以获取更多信息。在大多数情况下,使用多个JDBC Request元件是最简单和最可靠的方法。
设置线程组参数:
- 在线程组中,可以设置并发用户数、循环次数等参数,以模拟实际负载。
运行测试:
- 点击工具栏上的绿色运行按钮以开始测试。
查看结果:
- 在测试运行完成后,你可以查看各种性能指标,如响应时间、吞吐量等。
- 还可以导出测试结果以进一步分析。
在执行测试之前,确保已经正确配置了数据库连接池,包括连接池大小、最大连接数等参数。另外,还要注意测试环境的负载和资源使用情况,以确保测试结果的准确性。