java模拟数据库压测_数据库简单压测

本文介绍了如何使用Java和JMeter进行数据库压力测试,详细讲解了JMeter配置JDBC连接、设置线程组、添加JDBC请求的过程。同时,通过监控工具Monyog实时观察数据库性能指标,如链接状态、吞吐量、缓存等。文章还探讨了InnoDB Buffer Pool的配置优化,包括innodb_buffer_pool_size、innodb_buffer_pool_chunk_size和innodb_buffer_pool_instances等参数,以及优化数据库性能的多种思路,如索引、存储引擎选择、内存和磁盘I/O的优化。
摘要由CSDN通过智能技术生成

mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况

使用JM压测数据库

1、点击测试计划,再点击“浏览”,把JDBC驱动添加进来;

JDBC驱动:mysql-connector-java-5.1.39-bin.jar

一般位于java环境的   \java\jre\lib\ext   文件中

2、添加线程组,设置线程数、启动时间、循环次数

3、右键点击该线程组,再添加一个配置元件:JDBC Connection Configuration

JDBC配置原件参数说明:

Variable Name(变量名):这里写入数据库连接池的名字

Database URL:数据库连接地址 (jdbc:mysql://host:port/name)

JDBC Driver class:数据库驱动(可以将需要连接的数据库驱动jar包复制到jmeter的lib/目录下,然后在设置测试计划界面,最下面的Library中导入)(com.mysql.jdbc.Driver)

4、添加JDBC请求,(取样器中添加)

Variable name:这里写入数据库连接池的名字(和JDBC Connection Configuration名字保持一致 )

Query:里面填入查询数据库数据的SQL语句(填写的SQL语句末尾不要加“;”)

parameter valus:数据的参数值

parameter types:数据的参数类型

cariable names:保存SQL语句返回结果的变量名

result cariable name:创建一个对象变量,保存所有返回结果

query timeout:查询超时时间

handle result set:定义如何处理由callable statements语句返回的结果

5、添加结果树,调试

6、添加聚合报告,查看返回结果

利用Monyog实时监控数据库:

1/链接状态

2/数据库吞吐量

3/缓存未命中

4/声明

5/CPU使用率

6/磁盘IO

随着并发的增加,服务器的处理能力或者说tps也在增加,直到到达极限值。超过并发极限值后cpu或内存资源会出现死锁、阻塞等等问题导致服务器处理能力下降。

可以根据buffer_pool配置来提升事务处理能力

Buffer Pool

简介:Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中。Buffer Pool可以用来加速数据的读写,如果Buffer Pool越大,那么Mysql就越像一个内存数据库,所以了解Buffer Pool的配置可以提高Buffer Pool的性能。

innodb_buffer_pool_size:缓存区域的大小。

innodb_buffer_pool_chunk_size:当增加或减少innodb_buffer_pool_size时,操作以块(chunk)形式执行。块大小由innodb_buffer_pool_chunk_size配置选项定义,默认值128M。

innodb_buffer_pool_instances:当buffer pool比较大的时候(超过1G),innodb会把buffer pool划分成几个instances,这样可以提高读写操作的并发,减少竞争。读写page都使用hash函数分配给一个instances。

当增加或者减少buffer pool大小的时候,实际上是操作的chunk。buffer pool的大小必须是innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances,如果配置的innodb_buffer_pool_size不是innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_instances的倍数,buffer pool的大小会自动调整为innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的倍数,自动调整的值不少于指定的值。

如果指定的buffer大小是9G,instances的个数是16,chunk默认的大小是128M,那么buffer会自动调整为10G。具体的配置可以参考mysql官网的介绍mysql reference

优化思路:

表格结构合理

是否有适当的 索引来提高查询效率

是否为每个表使用适当的存储引擎

每个表是否使用适当的行格式

应用程序是否使用适当的 锁定策略

是否正确使用了用于缓存的所有内存区域?也就是说,足够大以容纳频繁访问的数据,但不能太大以至于它们会超载物理内存并导致分页。要配置的主要内存区域是InnoDB缓冲池,MyISAM密钥缓存和MySQL查询缓存。

磁盘寻求。磁盘需要一段时间才能找到一块数据。对于现代磁盘,平均时间通常低于10毫秒,因此我们理论上可以做到大约100次寻找。这个时间用新磁盘慢慢改善,并且很难针对单个表进行优化。优化寻道时间的方法是将数据分配到多个磁盘上。

磁盘读写。当磁盘位于正确位置时,我们需要读取或写入数据。使用现代磁盘,一个磁盘可提供至少10-20MB / s的吞吐量。这比搜索更容易优化,因为您可以从多个磁盘并行读取。

CPU周期。当数据在主存储器中时,我们必须处理它以获得我们的结果。与内存量相比具有大表是最常见的限制因素。但是对于小桌子,速度通常不是问题。

内存带宽。当CPU需要的数据量超过CPU缓存容量时,主内存带宽成为瓶颈。对于大多数系统来说,这是一个不常见的瓶颈,但需要注意的是。

要在一个可移植MySQL程序中使用面向性能的SQL扩展,可以将MySQL特定的关键字封装在/*! * /语句的注释分隔符中。其他SQL服务器将会忽略注释的关键字。

具体参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import java.sql.*; public class Bc { // 声明数据库地址及驱动 private Connection conn = null; private String url = "jdbc:oracle:thin:@localhost:1521:ORCL"; private String driver = "oracle.jdbc.driver.OracleDriver"; private String user = "www"; private String password = "www"; // 主函数 public static void main(String[] args) { Bc bc = new Bc(); String sql="select * from T_USERS"; String sql1 = "insert into T_USERS values ('rrr','ooo')"; String sql2 ="update T_USERS set USERSPASSWORD = '888888888884444' where USERSNAME= 'www'"; ResultSet rs= bc.select(sql); bc.execute(sql1); bc.execute(sql2); try{ //显示查询出来的结果------------------ ResultSetMetaData rmeta = rs.getMetaData(); //获得数据字段个数 int numColumns = rmeta.getColumnCount(); while(rs.next()) { for(int i = 0;i< numColumns;i++) { String sTemp = rs.getString(i+1); System.out.print(sTemp+" "); } System.out.println(""); } } catch (Exception e) { // TODO: handle exception } } // 创建数据库连接方法 public Connection create() { try { /* 使用Class.forName()方法自动创建这个驱动程序的实例且自动调用DriverManager来注册它 */ Class.forName(driver); /* 通过DriverManager的getConnection()方法获取数据库连接 */ conn = DriverManager.getConnection(url, user, password); } catch (Exception ex) { System.out.println("数据库连接出错"); } return conn; } // 执行查询时用的方法 public ResultSet select(String sql) { Connection c = create();//获取连接对象,可以不声明 ResultSet rs = null; try { Statement st = c.createStatement();// 获取Staetment对象 rs = st.executeQuery(sql);// 执行操作 } catch (Exception e) { System.out.println("查询出错"); } return rs; } // 更新方法 public void execute(String sql) { Connection c = create();//获取连接对象,可以不声明 ResultSet rs = null; try { Statement st = c.createStatement();// 获取Staetment对象 st.executeUpdate(sql); } catch (Exception e) { System.out.println("更新出错"); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值