基于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+"执行完毕---------"); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。