Pressure-test-for-MySql:由java实现的一个多线程对Mysql数据库测试

  • F2_622769
    了解作者
  • 79.2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-11 06:10
    上传日期
Pressure-test-for-MySql 由java实现的一个多线程对Mysql数据库测试 本次设计采用java语言连接mysql数据库,利用jdbc来实现具体的操作 ##程序模块 : (1)util包: JDBCUtil 类和 jdbc.properties ,后者为mysql数据库root用户账户信息、数据库驱动以及数据库地址的配置信息。前者是数据库的连接获取以及关闭流方法。 (2)testing包: Info负责信息的描述 Gui类负责用户界面以及按键响应的实现 Operating负责实现多线程操作的实现 TestMain 负责具体数据库具体操作的实现 ##详细设计 ###JDBCUtil工具类的实现: public class JDBCUtil { private JDBCUtil(){}//防止类外构造 Private static ResourceBundle rb=
Pressure-test-for-MySql-master.zip
  • Pressure-test-for-MySql-master
  • images
  • picture.png
    58.9KB
  • src
  • util
  • JDBCUtil.java
    1.4KB
  • jdbc.properties
    229B
  • testing
  • Operating.java
    1.2KB
  • Gui.java
    4.2KB
  • info.java
    474B
  • TestMain.java
    6.5KB
  • .settings
  • org.eclipse.jdt.core.prefs
    587B
  • bin
  • util
  • jdbc.properties
    229B
  • README.md
    16KB
  • .gitignore
    189B
  • .project
    388B
  • LICENSE
    11.1KB
  • .classpath
    372B
内容介绍
# Pressure-test-for-MySql 由java实现的一个多线程对Mysql数据库测试 本次设计采用java语言连接mysql数据库,利用jdbc来实现具体的操作 ##程序模块 : (1)util包: JDBCUtil 类和 jdbc.properties ,后者为mysql数据库root用户账户信息、数据库驱动以及数据库地址的配置信息。前者是数据库的连接获取以及关闭流方法。 (2)testing包: Info负责信息的描述 Gui类负责用户界面以及按键响应的实现 Operating负责实现多线程操作的实现 TestMain 负责具体数据库具体操作的实现 ##详细设计 ###JDBCUtil工具类的实现: ```Java public class JDBCUtil { private JDBCUtil(){}//防止类外构造 Private static ResourceBundle rb= ResourceBundle.getBundle("util/jdbc"); private static String URL= null; private static String USER= null; private static String PASSWORD= null; private static String DRIVER= null; static {//不能再静态块里构造静态变量,最好放在块外 URL= rb.getString("jdbc.url"); USER= rb.getString("jdbc.user"); PASSWORD= rb.getString("jdbc.password"); DRIVER= rb.getString("jdbc.driver"); try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ``` 在这里,我们把配置文件jdbc.properties里的内容的加载,以及jdbc驱动的加载都写到了静态块里,这样是为了在编译以及运行的时候,直接随着类的加载而加载。做到多次运行,只加载一次。 ```Java public static Connection getConnection()throws SQLException//创建连接方法,因为每一个操纵都需要得到一个连接,所以需要返回值 { Connection conn= null;//此处因为可能和出现连接失败的情况,容易使得conn变为空,因此为了防止出现异常,赋给默认值null conn= DriverManager.getConnection(URL, USER, PASSWORD); return conn; } ``` 我们把异常抛出了,是为了后期在处理的时候对异常的更好的捕捉 ```Java public static void close(ResultSet rs, Statement st,Connection conn) { try { if(rs!= null) rs.close(); if(st!= null) st.close(); if(conn!= null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ``` 单独把数据库各种流的关闭提取出来,因为有些操作用不到resultSet,所以在每一个流关闭之前,都需要判断一下是否为空。 ###package testing; ```Java public class TestMain { private Connection conn = null; private PreparedStatement ps = null; private ResultSet rs = null; private String sql; private String sqlTemp; public void add(int tableCount, int fieldCount, int dataCount)// 添加测试,三个参数分别是: // 所操作的表的个数,字段数,数据量 { Thread currentThread = Thread.currentThread(); int count = 0; try { conn = JDBCUtil.getConnection();//获取数据库连接,,异常被外部捕获后,程序自动停止。而异常被抛进来之后,程序会觉 //得外部没有异常,这样依旧会持续那个永真while tableCount = tableCount > tableCount() ? tableCount() : tableCount;// 在目标表的数量和实际表数量选小的作为实际值 fieldCount = fieldCount > fieldCount() ? fieldCount() : fieldCount; /* * 开始拼接sql语句 */ sqlTemp = " ("; String val = ")values("; for (int i = 0; i < fieldCount - 1; i++) {// 不用给主键赋值 sqlTemp += "id" + i + ",";// 拼接前n-1个字段 val += "0,";// 给所有条目的内容添加0 } sqlTemp += "id" + (fieldCount - 1) + val + "0);";// sql语句的后半部分拼接完毕 while (dataCount > 0) { for (int i = 0; i < tableCount; i++) { sql = "insert into " + "target" + i + sqlTemp;// 表示向targeti这个表中插入数据 ps = conn.prepareStatement(sql);// 因此,我们只需要在异常抛出的地方,设置一下对应窗体需要显示的内容即可 ps.executeUpdate();// 执行更新 dataCount--; count++; } } } catch (SQLException e) {// 捕获处理 // TODO: handle exception synchronized (this) { Gui.jta.append(currentThread.getName() + "挂掉,所插入的数据为:" + count+ '\n'); currentThread.stop(); } } finally { JDBCUtil.close(rs, ps, conn); } } public void query(int tableCount, int dataCount)// 查询测试 { Thread currenThread = Thread.currentThread(); int id = 0, count = 0; try { conn = JDBCUtil.getConnection();// 连接数据库 tableCount = tableCount > tableCount() ? tableCount() : tableCount;// 在目标表的数量和实际表数量选小的作为实际值 int counting = counter(tableCount);// 记录所有表中的记录总数 counting = (dataCount < counting ? dataCount : counting);// 获取需要查询数据量和总数据量之间的较小值 Gui.jta.append("数据查询量为:" + counting + '\n');// 表示不论线程是否挂掉,都要输出查询总量,因为如果没挂掉,则这个数就表示查询到的结果 sqlTemp = " where id0= ?;";// 表名不可以用占位符,只有值可以用,因为在数据库中,任何书 while (counting > 0)// 查询的最终结束条件。 { for (int i = 0; i < tableCount; i++) { sql = "select * from target" + i + sqlTemp; ps = conn.prepareStatement(sql);// 创建预编译器 ps.setInt(1, id); ps.executeQuery();// 执行查询 counting--; count++; } id++; } } catch (Exception e) { // TODO: handle exception synchronized (this) { Gui.jta.append(currenThread.getName() + "挂掉,查询量:" + count+'\n');// 如果挂掉,就输出所查询成功的次数 currenThread.stop(); } } finally { JDBCUtil.close(rs, ps, conn); } } public void addTable(int tableCount)// 加表技术,当让也可以是负数,这样表示删除表,不论是添加还是删除,都是倒序。 { try { conn = JDBCUtil.getConnection();// 连接数据库,将异常抛进来了 int count = tableCount();// 获取当前表的数量 if (count == 0)// 如果test库里没有表,那么就直接创建表 { for (int i = 0; i < tableCount; i++) { ps = conn.prepareStatement("create table target" + i + "(id0 int(10) primary key auto_increment)");// 倒着开始删除表 ps.execute();// 执行 } System.out.println(123456); } else if (tableCount <= 0)// 删除表的操作 { tableCount = -tableCount;// for (int i = count - 1; (i > count - 1 - tableCount) && i >= 0; i--) { ps = conn.prepareStatement("drop table target" + i + ";");// 倒着开始删除表 ps.execute();// 执行删除 } } else {// 添表操作 for (int i = count; i < (count + tableCount); i++) { sql = "create table target" + i + " like target0;";// 以表0为模板加表 ps = conn.prepareStatement(sql); ps.execute(); } } } catch (Exception e) { // TODO: handle exception } finally { JDBCUtil.close(rs, ps, conn); } Gui.jta.append("add Table successfully!!!\n");// 通知添表成功 } public void addField(int fieldCount)// 为所有表添加字段,同样包括删除操作 { sqlTemp = "alter table "; try { conn = JDBCUtil.getConnection();// 连接数据库,将异常抛进来了 int fieldscount = fieldCount(); int tablecount = tableCount();// 获取当前表的总数 for (int i = 0; i < tablecount; i++) {// 遍历每一个表 if (fieldCount < 0)// 删除字段 { for (int j = fieldscount - 1; j > fieldscount + fieldCount - 1; j--) { sql = sqlTemp + "target" + i + " drop column id" + j + ";"; ps = conn.prepareStatement(sql); ps.execute(); } } else { for (int j = fieldscount; j < fieldscount + fieldCount; j++) { sql = sqlTemp + "target" + i + " add column id" +
评论
    相关推荐