基于java线程池读取单个SQL数据库表
任务:基于线程池来操作MySQL,测试单台机器读写MySQL单表的效率。
思路:创建一个大小合适的线程池,让每个线程分别连接到数据库并进行读取输出操作。
连接到数据库
importjava.sql.DriverManager;
importjava.sql.SQLException;
importcom.mysql.jdbc.Statement;
publicclassTEXT{
}
classMySQLOpen{
privateConnectioncon=null;
privatestaticStringdriver="com.mysql.jdbc.Driver";
privatestaticStringurl="jdbc:mysql://localhost:3306/phpmyadmin";
privatestaticStringusername="root";
privatestaticStringpassword="root";
privatestaticStatementNULL=null;
publicvoidMysqlOpen(){
try{
Class.forName(driver);//加载驱动类
con=DriverManager.getConnection(url,username,password);//连接数据库
if(!con.isClosed())
System.out.println("***数据库成功连接***");
}catch(ClassNotFoundExceptione){
System.out.println("找不到驱动程序类,加载驱动失败");
e.printStackTrace();
}catch(SQLExceptione){
System.out.println("数据库连接失败");
e.printStackTrace();
}
}
}
利用statement类中的executeQuery方法操作MySQL
Statementstate=(Statement)con.createStatement();
ResultSetsql=state.executeQuery("select*fromuserwhereidbetween1and5");
利用sql.next()循环遍历取出想要的数据
while(sql.next()){
Stringid=sql.getString(1);
Stringusername=sql.getString(3);
Stringtext=sql.getString(6);
System.out.println(id+"\t"+username+"\t"+text);
}
以上就已经实现了主线程访问并操作数据库的相应内容。
创建线程池,设置好相应参数
ThreadPoolExecutorexecutor=newThreadPoolExecutor(5,15,200,TimeUnit.MILLISECONDS, newArrayBlockingQueue(5));
利用for循环去创建线程即可。
计算效率
longstart=System.currentTimeMillis();
longend=System.currentTimeMillis();
System.out.println("平均每秒可输出:"+100000/(end-start)+"条");
要注意主线程创建好其他线程后就继续往下执行了,所以要有一个判断其他线程是否结束的语句
while(true){
if(executor.getActiveCount()==0)
break;
}
可以利用Thread.activeCount()看一还有多少活跃的线程。
System.out.println("activeCountMain1:"+Thread.activeCount());
主要的思路就再上面,现在贴出整理好的代码:
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.concurrent.ArrayBlockingQueue;
importjava.util.concurrent.ThreadPoolExecutor;
importjava.util.concurrent.TimeUnit;
importcom.mysql.jdbc.Statement;
publicclassMain{
publicstaticvoidmain(String[]args){
ThreadPoolExecutorexecutor=newThreadPoolExecutor(5,15,200,TimeUnit.MILLISECONDS,
newArrayBlockingQueue(5));
longstart=System.currentTimeMillis();
System.out.println("activeCountMain1:"+Thread.activeCount());
for(inti=1;i<=20;i++){
MySQLmysql=newMySQL(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());
longend=System.currentTimeMillis();
System.out.println("平均每秒可输出:"+100000/(end-start)+"条");
}
}
classMySQLimplementsRunnable{
privateConnectioncon=null;
privatestaticStringdriver="com.mysql.jdbc.Driver";
privatestaticStringurl="jdbc:mysql://localhost:3306/phpmyadmin";
privatestaticStringusername="root";
privatestaticStringpassword="root";
privatestaticStatementNULL=null;
privatefinalinttaskNum;
publicMySQL(inttaskNum){
this.taskNum=taskNum;
}
publicStatementMysqlOpen(){
try{
Class.forName(driver);//加载驱动类
con=DriverManager.getConnection(url,username,password);//连接数据库
if(!con.isClosed())
System.out.println("***数据库成功连接***");
Statementstate=(Statement)con.createStatement();
returnstate;
}catch(ClassNotFoundExceptione){
System.out.println("找不到驱动程序类,加载驱动失败");
e.printStackTrace();
}catch(SQLExceptione){
System.out.println("数据库连接失败");
e.printStackTrace();
}
returnNULL;
}
@Override
publicvoidrun(){
readMySQL();
}
publicvoidreadMySQL(){
ResultSetsql=null;
Statementstate=MysqlOpen();
try{
sql=state.executeQuery("select*fromsina_user_weibos_1386622641whereidbetween"
+((taskNum-1)*5000)+"and"+(taskNum*5000));
System.out.println("---------task"+taskNum+"正在执行---------");
while(sql.next()){
Stringid=sql.getString(1);
Stringwid=sql.getString(2);
Stringusername=sql.getString(3);
Stringrepostscount=sql.getString(4);
Stringcommentscount=sql.getString(5);
Stringtext=sql.getString(6);
Stringcreateat=sql.getString(7);
Stringsource=sql.getString(15);
Stringlasttime=sql.getString(17);
System.out.println(id+"\t"+wid+"\t"+username+"\t"+repostscount+"\t"+commentscount+"\t"
+text+"\t"+createat+"\t"+source+"\t"+lasttime);
}
}catch(SQLExceptione){
e.printStackTrace();
}finally{
try{
sql.close();
state.close();
con.close();
}catch(Exceptione){
e.printStackTrace();
}
}
System.out.println("---------task"+taskNum+"执行完毕---------");
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。