记录实验4过程及代码。
Maven项目修改pom.xml,添加以下依赖:
xml <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.22</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
数据库初始化:
java// SQLConnect.java
package org.example.webstructure.experiment4;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.sql.*;
public class SQLConnect {
public static void main(String[] args) throws SQLException {
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:19327/test", "root", "123456");
// 增
PreparedStatement preparedStatement = connection.prepareStatement("insert into testtable values('textKey2', 'textValue2')");
int columnNum = preparedStatement.executeUpdate();
System.out.println(columnNum);
preparedStatement = connection.prepareStatement("select value1 from testtable where key1 = 'textKey2'");
ResultSet result = preparedStatement.executeQuery();
result.next();
System.out.println(result.getString("value1"));
// 删
preparedStatement = connection.prepareStatement("delete from testtable where key1 = 'textKey2'");
columnNum = preparedStatement.executeUpdate();
System.out.println(columnNum);
preparedStatement = connection.prepareStatement("select count(value1) from testtable where key1 = 'textKey2'");
result = preparedStatement.executeQuery();
result.next();
System.out.println(result.getInt(1));
// 改
// 先增一个数据用来改
preparedStatement = connection.prepareStatement("insert into testtable values('textKey2', 'textValue2')");
columnNum = preparedStatement.executeUpdate();
System.out.println(columnNum);
preparedStatement = connection.prepareStatement("update testtable set value1 = 'textValue3' where key1 = 'textKey2'");
columnNum = preparedStatement.executeUpdate();
System.out.println(columnNum);
preparedStatement = connection.prepareStatement("select value1 from testtable where key1 = 'textKey2'");
result = preparedStatement.executeQuery();
result.next();
System.out.println(result.getString("value1"));
// 查
preparedStatement = connection.prepareStatement("select * from testtable");
result = preparedStatement.executeQuery();
result.next();
System.out.println(result.getString("value1"));
// 再删一次 省得我重复运行的时候这块老是报错
preparedStatement = connection.prepareStatement("delete from testtable where key1 = 'textKey2'");
columnNum = preparedStatement.executeUpdate();
// 释放资源
result.close();
preparedStatement.close();
connection.close();
// 连接池初始化
DruidDataSource dataSource = getDruidDataSource();
// 获取连接
Connection connectionFromPool = dataSource.getConnection();
connectionFromPool.close();
// 通过DBUtils进行增删改查
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:19327/test", "root", "123456");
QueryRunner queryRunner = new QueryRunner();
ResultSetHandler<test> resultSetHandler = new BeanHandler<>(test.class);
try {
// 查
test t = queryRunner.query(connection, "select key1, value1 from testtable where key1 = 'testKey1'", resultSetHandler);
System.out.println(t.getKey1() + " " + t.getValue1());
// 增
queryRunner.update(connection, "insert into testtable values('testKey3', 'testValue3')");
t = queryRunner.query(connection, "select key1, value1 from testtable where key1 = 'testKey3'", resultSetHandler);
System.out.println(t.getKey1() + " " + t.getValue1());
// 改
queryRunner.update(connection, "update testtable set value1 = 'testValue4' where key1 = 'testKey3'");
t = queryRunner.query(connection, "select * from testtable where key1 = 'testKey3'", resultSetHandler);
System.out.println(t.getKey1() + " " + t.getValue1());
// 删
queryRunner.update(connection, "delete from testtable where key1 = 'testKey3'");
Long i = queryRunner.query(connection, "select count(*) from testtable;", new ScalarHandler<>());
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
DbUtils.close(connection);
}
}
private static DruidDataSource getDruidDataSource() {
// 数据源配置
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://127.0.0.1:19327/test");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); //这个可以缺省的,会根据url自动识别
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 下面都是可选的配置
dataSource.setInitialSize(10); // 初始连接数,默认0
dataSource.setMaxActive(30); // 最大连接数,默认8
dataSource.setMinIdle(10); // 最小闲置数
dataSource.setMaxWait(2000); // 获取连接的最大等待时间,单位毫秒
dataSource.setPoolPreparedStatements(true); // 缓存PreparedStatement,默认false
dataSource.setMaxOpenPreparedStatements(20); // 缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句代码
return dataSource;
}
}
java// test.java
package org.example.webstructure.experiment4;
public class test {
private String key1;
private String value1;
public String getKey1() {
return key1;
}
public void setKey1(String key1) {
this.key1 = key1;
}
public String getValue1() {
return value1;
}
public void setValue1(String value1) {
this.value1 = value1;
}
public test() {}
}
java// SQLConnectTest.java
package org.example.webstructure.experiment4;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.*;
public class SQLConnectTest {
DruidDataSource dataSource;
public SQLConnectTest() {
this.dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://127.0.0.1:19327/test");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setInitialSize(10);
dataSource.setMaxActive(30);
dataSource.setMinIdle(10);
dataSource.setMaxWait(2000);
dataSource.setPoolPreparedStatements(true);
dataSource.setMaxOpenPreparedStatements(20);
}
public String UseTraditionalConnection() throws SQLException {
StringBuilder r = new StringBuilder();
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:19327/test", "root", "123456");
for (int i = 2; i <= 50; i++) {
PreparedStatement preparedStatement = connection.prepareStatement("select value1 from testtable where key1 = 'testKey1'");
ResultSet result = preparedStatement.executeQuery();
result.next();
r.append(result.getString("value1")).append(", ");
}
return r.toString();
}
public String UseConnectPool() throws SQLException {
StringBuilder r = new StringBuilder();
Connection connectionFromPool = dataSource.getConnection();
for (int i = 2; i <= 50; i++) {
PreparedStatement preparedStatement = connectionFromPool.prepareStatement("select value1 from testtable where key1 = 'testKey1'");
ResultSet result = preparedStatement.executeQuery();
result.next();r.append(result.getString("value1")).append(", ");
}
return r.toString();
}
}
先新建并且复制上面的代码,然后右键找Generate/生成,里面有个Test...:
点进去之后指定类名和对应JUnit版本(上面引入依赖时引入的是JUnit 4.13),再把要生成测试方法的两个方法勾上:
之后生成的文件参照下面的代码:
java// SQLConnectTestTest.java
package org.example.webstructure.experiment4;
import org.junit.Test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class SQLConnectTestTest {
SQLConnectTest test = new SQLConnectTest();
@Test
public void test() throws InterruptedException {
Thread.sleep(20000); // 20秒连接jConsole
}
@Test
public void useTraditionalConnection() throws InterruptedException {
List<Thread> threadSet = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
Thread t = new Thread(() -> {
try {
test.UseTraditionalConnection();
} catch (SQLException e) {
e.getErrorCode();
}
});
threadSet.add(t);
t.start();
}
for (Thread thread : threadSet) {
thread.join();
}
}
@Test
public void useConnectPool() throws InterruptedException {
List<Thread> threadSet = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
Thread t = new Thread(() -> {
try {
test.UseConnectPool();
} catch (SQLException e) {
e.getErrorCode();
}
});
threadSet.add(t);
t.start();
}
for (Thread thread : threadSet) {
thread.join();
}
}
}
类名旁边有个运行的按钮,点它就可以直接运行全部的测试方法。但是这会先别急运行,先找到Java安装目录下的bin文件夹下的jconsole.exe文件,双击运行:
找到之后回到IDEA中运行全部测试方法,再回来找左上角的Connection -> New Connection,找到运行测试的那个进程进行连接。test中阻塞线程的20秒就是用来连接这个的,如果时间不够可以自己调整。
从这里可以看到Java进程所有的线程,加载的类,堆内存使用情况,占用的CPU和内存资源的使用情况,在IDEA中可以看到两个测试方法的运行时间(对应实验要求的响应时间和资源利用率):
本文作者:御坂19327号
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!