基于java线程池读取单个SQL数据库表

任务:基于线程池来操作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 + "执行完毕---------");
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java遍历读取整个redis数据库实例

    redis提供了灵活的数据查询方式,最牛的就是key的搜索支持正则表达式. jedis.keys("*");表示搜索所有keyjedis.keys("abc*")表示搜索开头为abc的key数据 遍历了key就能遍历到value. 其实就是一个set 复制代码 代码如下: RedisDO rd = new RedisDO();  rd.open();  Set s = rd.jedis.keys("*");  Iterator it = s.it

  • Java从数据库中读取Blob对象图片并显示的方法

    本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法.分享给大家供大家参考.具体实现方法如下: 第一种方法: 大致方法就是,从数据库中读出Blob的流来,写到页面中去: 复制代码 代码如下: Connection conn = DBManager.getConnection();   String sql = "SELECT picture FROM teacher WHERE id=1";   PreparedStatement ps = null;   ResultSe

  • java sqlserver text 类型字段读取方法

    有这样一个需求,需要将原本存储在数据库中的文档转存至文件系统中,于是写了一个简单的程序完成此功能,代码如下: Java代码 复制代码 代码如下: import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager;

  • Java用jxl读取excel并保存到数据库的方法

    项目中涉及到读取excel中的数据,保存到数据库中,用jxl做起来比较简单. 基本的思路: 把excel放到固定盘里,然后前段页面选择文件,把文件的名字传到后台,再利用jxl进行数据读取,把读取到的数据存到list中,通过遍历list,得到map,存到数据库中. 首先导入jar包:在网上都有, 代码: 页面: 新模excel导入 <input type="file" name="excel" id="xinmu"> <input

  • Java+MySql图片数据保存与读取的具体实例

    1.创建表: 复制代码 代码如下: drop table if exists photo;CREATE TABLE photo (    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,    name VARCHAR(100) COMMENT '名称',    photo blob COMMENT '照片')ENGINE=InnoDBDEFAULT CHARSET=utf8COLLATE=utf8_general_ci; 图片在MySql中的数据存储格式为

  • Java读取properties文件连接数据库的方法示例

    之前我们在入门jdbc的时候,常用这种方法连接数据库: package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { public static Connection getConnection() { Connection conn = null; try { Class.forName

  • 基于java线程池读取单个SQL数据库表

    任务:基于线程池来操作MySQL,测试单台机器读写MySQL单表的效率. 思路:创建一个大小合适的线程池,让每个线程分别连接到数据库并进行读取输出操作. 连接到数据库 import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.Statement; public class TEXT { } class MySQLOpen { private Connection con = null; p

  • 深度源码解析Java 线程池的实现原理

    java 系统的运行归根到底是程序的运行,程序的运行归根到底是代码的执行,代码的执行归根到底是虚拟机的执行,虚拟机的执行其实就是操作系统的线程在执行,并且会占用一定的系统资源,如CPU.内存.磁盘.网络等等.所以,如何高效的使用这些资源就是程序员在平时写代码时候的一个努力的方向.本文要说的线程池就是一种对 CPU 利用的优化手段. 线程池,百度百科是这么解释的: 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的

  • Java线程池大小的设置方法实例

    目录 Java 中线程池创建的几种方式

  • Java线程池必知必会知识点总结

    目录 1.线程数使用开发规约 2.ThreadPoolExecutor源码 1.构造函数 2.核心参数 3.execute()方法 3.线程池的工作流程 4.Executors创建返回ThreadPoolExecutor对象(不推荐) 1.Executors#newCachedThreadPool=>创建可缓存的线程池 2.Executors#newSingleThreadExecutor=>创建单线程的线程池 3.Executors#newFixedThreadPool=>创建固定长度

  • Java线程池 ThreadPoolExecutor 详解

    目录 一 为什么要使用线程池 二 线程池原理详解 2.1 线程池核心组成 2.2 Execute 原理 三 线程池的使用 3.1 创建线程池 3.1.1 自定义线程池 3.1.2 功能线程池 3.1.3 功能线程池存在的问题 3.2 向线程池提交任务 3.3 关闭线程池 3.4 自定义线程池需要考虑因素 一 为什么要使用线程池 对于操作系统而言,创建一个线程的代价是十分昂贵的, 需要给它分配内存.列入调度,同时在线程切换时要执行内存换页,清空 CPU 缓存,切换回来时还要重新从内存中读取信息,破

  • Java 线程池详解及实例代码

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因. 例如Android中常见到的很多通用组件一般都离不开"池"的概念,如各种图片

  • Java线程池配置的一些常见误区总结

    前言 由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程的池化在各种语言内都有实践,当然在 Java 语言中线程池是也非常重要的一部分,有 Doug Lea 大神对线程池的封装,我们使用的时候是非常方便,但也可能会因为不了解其具体实现,对线程池的配置参数存在误解. 我们经常在一些技术书籍或博客上看到,向线程池提交任务时,线程池的执行逻辑如下: 当一个任务被提交后,线程池首先检查正在运行的线程数是否达到核心线程数,如果未达到则创建一个线程. 如果线程池内正在运行的线程数已经达到了核心

  • 深入理解Java线程池从设计思想到源码解读

    线程池:从设计思想到源码解析 前言初识线程池线程池优势线程池设计思路 深入线程池构造方法任务队列拒绝策略线程池状态初始化&容量调整&关闭 使用线程池ThreadPoolExecutorExecutors封装线程池 解读线程池execute()addWorker()Worker类runWorker()processWorkerExit() 前言 各位小伙伴儿,春节已经结束了,在此献上一篇肝了一个春节假期的迟来的拜年之作,希望读者朋友们都能有收获. 根据穆氏哲学,投入越多,收获越大.我作此文时

  • 如何理解Java线程池及其使用方法

    目录 一.前言 二.总体的架构 三.研读ThreadPoolExecutor 3.1.任务缓存队列 3.2.拒绝策略 3.3.线程池的任务处理策略 3.4.线程池的关闭 3.5.源码分析 四.常见的四种线程池 4.1.newFixedThreadPool 4.2.newSingleThreadExecutor 4.3.newCachedThreadPool 4.4.newScheduledThreadPool 五.使用实例 5.1.newFixedThreadPool实例 5.2.newCach

  • 很多人竟然不知道Java线程池的创建方式有7种

    目录 前言 什么是线程池? 线程池使用 1.FixedThreadPool 2.CachedThreadPool 3.SingleThreadExecutor 4.ScheduledThreadPool 5.SingleThreadScheduledExecutor 6.newWorkStealingPool 7.ThreadPoolExecutor 线程池的执行流程 线程拒绝策略 自定义拒绝策略 究竟选用哪种线程池? 前言 根据摩尔定律所说:集成电路上可容纳的晶体管数量每 18 个月翻一番,因

随机推荐