基于java线程池读取单个SQL数据库表
程序员文章站
2023-10-30 18:11:40
任务:基于线程池来操作mysql,测试单台机器读写mysql单表的效率。
思路:创建一个大小合适的线程池,让每个线程分别连接到数据库并进行读取输出操作。
连接到数据库...
任务:基于线程池来操作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 + "执行完毕---------"); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。