基于java线程池读取单个SQL数据库表
作者:Cedric是陈大泽 发布时间:2024-01-25 08:17:00
标签:java,线程池,数据库
任务:基于线程池来操作MySQL,测试单台机器读写MySQL单表的效率。
思路:创建一个大小合适的线程池,让每个线程分别连接到数据库并进行读取输出操作。
连接到数据库
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Statement;
public class TEXT {
}
class MySQLOpen {
private Connection con = null;
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/phpmyadmin";
private static String username = "root";
private static String password = "root";
private static Statement NULL = null;
public void MysqlOpen() {
try {
Class.forName(driver); //加载驱动类
con = DriverManager.getConnection(url, username, password); //连接数据库
if (!con.isClosed())
System.out.println("***数据库成功连接***");
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类,加载驱动失败");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}
}
}
利用statement类中的executeQuery方法操作MySQL
Statement state = (Statement) con.createStatement();
ResultSet sql = state.executeQuery("select * from user where id between 1 and 5");
利用sql.next()循环遍历取出想要的数据
while (sql.next()) {
String id = sql.getString(1);
String username = sql.getString(3);
String text = sql.getString(6);
System.out.println(id+"\t"+username+"\t"+text);
}
以上就已经实现了主线程访问并操作数据库的相应内容。
创建线程池,设置好相应参数
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 15, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5));
利用for循环去创建线程即可。
计算效率
long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
System.out.println("平均每秒可输出: " + 100000 / (end - start) + " 条");
要注意主线程创建好其他线程后就继续往下执行了,所以要有一个判断其他线程是否结束的语句
while (true) {
if (executor.getActiveCount() == 0)
break;
}
可以利用Thread.activeCount()看一还有多少 活跃的线程。
System.out.println("activeCountMain1 : " + Thread.activeCount());
主要的思路就再上面,现在贴出整理好的代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.mysql.jdbc.Statement;
public class Main {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 15, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5));
long start = System.currentTimeMillis();
System.out.println("activeCountMain1 : " + Thread.activeCount());
for (int i = 1; i <= 20; i++) {
MySQL mysql = new MySQL(i);
executor.execute(mysql);
System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" + executor.getQueue().size()
+ ",已执行玩别的任务数目:" + executor.getCompletedTaskCount());
}
executor.shutdown();
while (true) {
if (executor.getActiveCount() == 0)
break;
}
System.out.println("activeCountMain2 : " + Thread.activeCount());
long end = System.currentTimeMillis();
System.out.println("平均每秒可输出: " + 100000 / (end - start) + " 条");
}
}
class MySQL implements Runnable {
private Connection con = null;
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/phpmyadmin";
private static String username = "root";
private static String password = "root";
private static Statement NULL = null;
private final int taskNum;
public MySQL(int taskNum) {
this.taskNum = taskNum;
}
public Statement MysqlOpen() {
try {
Class.forName(driver); //加载驱动类
con = DriverManager.getConnection(url, username, password); //连接数据库
if (!con.isClosed())
System.out.println("***数据库成功连接***");
Statement state = (Statement) con.createStatement();
return state;
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类,加载驱动失败");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}
return NULL;
}
@Override
public void run() {
readMySQL();
}
public void readMySQL() {
ResultSet sql = null;
Statement state = MysqlOpen();
try {
sql = state.executeQuery("select * from sina_user_weibos_1386622641 where id between "
+ ((taskNum - 1) * 5000) + " and " + (taskNum * 5000));
System.out.println("---------task " + taskNum + "正在执行---------");
while (sql.next()) {
String id = sql.getString(1);
String wid = sql.getString(2);
String username = sql.getString(3);
String repostscount = sql.getString(4);
String commentscount = sql.getString(5);
String text = sql.getString(6);
String createat = sql.getString(7);
String source = sql.getString(15);
String lasttime = sql.getString(17);
System.out.println(id + "\t" + wid + "\t" + username + "\t" + repostscount + "\t" + commentscount + "\t"
+ text + "\t" + createat + "\t" + source + "\t" + lasttime);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
sql.close();
state.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("---------task " + taskNum + "执行完毕---------");
}
}
来源:https://blog.csdn.net/qq_27075943/article/details/51208503
0
投稿
猜你喜欢
- 背景当我慢慢的开在高速公路上,宽敞的马路非常的拥挤!这时候我喜欢让百度导航的小度给我讲笑话,但她有点弱,每次只能讲一个。百度号称要发力人工智
- 一、背景最近有个需求是从一个后台的留言网站爬取留言数据,后台管理网站必然涉及到了登录,登录就有个验证码的问题必须得解决,由于验证码是从后端生
- 问题你需要将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它。解决方案对于序列化最普遍的做法就
- 前言环境搭建可查看Python人脸识别微笑检测数据集可在https://inc.ucsd.edu/mplab/wordpress/index
- 目录前言1、背景2、模拟测试3、结论总结前言如果不是踩到坑,我估计到现在还不知道时间字段会四舍五入。1、背景通过 Java 代码获取当日最大
- 有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候。对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Se
- 什么是钩子之前有转一篇关于回调函数的文章钩子函数、注册函数、回调函数,他们的概念其实是一样的。 钩子函数,顾名思义,就是把我们自己实现的ho
- 目录jiaba库的使用1、jieba库的安装2、统计荷塘月色词频总结jiaba库的使用jieba库是一款优秀的 Python 第三方中文分词
- 有这种要求,更新自己本身的字段的某个值进行加或者减常规方法:UPDATE tbl_kintai_print_hisSET &nb
- 1. 数据筛选 a b c0 0 2 41 6 8 102 12 14 163 18 20 224 24 26 285 30 32 346
- 描述remove() 函数用于移除列表中某个值的第一个匹配项。语法remove()方法语法:list.remove(obj)参数obj --
- 最近一直忙,我们的注册页面还是在持续优化。今天抽时间分析了下数据,依然以主注册表单为例,对表单里3个区块、9个字段做了个小小出错排行;看看哪
- 这篇文章主要介绍了如何使用Python发送HTML格式的邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- Python在很大程度上可以对shell脚本进行替代。笔者一般单行命令用shell,复杂点的多行操作就直接用Python了。这篇文章就归纳一
- 1 算术运算add(other)比如进行数学运算加上具体的一个数字data['open'].add(1)2018-02-27
- 目录1)连接请求的变量1、max_connections2、back_log3、wait_timeout和interative_timeou
- 1. 图信号处理知识图卷积神经网络涉及到图信号处理的相关知识,也是由图信号处理领域的知识推导发展而来,了解图信号处理的知识是理解图卷积神经网
- 1、在Python中以相对路径或者绝对路径来导入文件或者模块的方法今天在调试代码的时候,程序一直提示没有该模块,一直很纳闷,因为我导入文件一
- 这篇文章主要介绍了Python如何使用函数做字典的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 如下所示:from statsmodels.tsa.stattools import adfullerprint(adfuller(data