用了下CyclicBarrier,注意线程池中的线程数量设置,还有就是DB连接的时候,需要考虑单个DB能承受的最大连接数目和每个连接上能同时打开的cursor等限制,需要时可以通过jstack查看堆栈中关于等待锁的信息,同时注意在线程数/连接池中连接数以及任务数中找到性能平衡点

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ConPoolTest {
public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
long start = System.currentTimeMillis();
ExecutorService exec = Executors.newFixedThreadPool(5000);
CyclicBarrier barrier = new CyclicBarrier(5001);
for (int i = 0; i < 5000; i++) {
exec.execute(new TaskRun(barrier));
}
barrier.await();
System.out.println(ConnectionPool.connCnt);
ConnectionPool.cleanAll();
System.out.println(ConnectionPool.connCnt);
System.out.println(System.currentTimeMillis() - start);
exec.shutdown();
}
} class TaskRun implements Runnable {
CyclicBarrier barrier = null; TaskRun(CyclicBarrier barrier) {
this.barrier = barrier;
} @Override
public void run() {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = ConnectionPool.getConnect();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from t");
while (rs.next()) {
System.out.println(Thread.currentThread().getName() + " ... " + rs.getString(1));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (stmt != null)
stmt.close();
if (rs != null)
rs.close();
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import java.util.TreeMap; //简单初始化固定数目的链接,需要用的时候过来随机拿一个
public class ConnectionPool {
private static List<Connection> connList = new ArrayList<Connection>();
static TreeMap<Integer, Integer> connCnt = new TreeMap<Integer, Integer>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
static {
int i = 0;
while (i++ < 100) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system",
"*****");
connList.add(conn);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
} public static synchronized Connection getConnect() throws ClassNotFoundException, SQLException {
Random random = new Random();
int idx = random.nextInt(100);
boolean isContains = connCnt.containsKey(idx);
if (isContains) {
int cnt = connCnt.get(idx);
connCnt.put(idx, cnt + 1);
} else {
connCnt.put(idx, 1);
}
return connList.get(idx);
} public static synchronized void cleanAll() {
for (Connection conn : connList) {
try {
conn.close();
connCnt.clear();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

池以及barrier简单的更多相关文章

  1. KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

    KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

  2. Druid数据库连接池两种简单使用方式

    阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好 简单使用介绍 Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息全部 ...

  3. Druid数据库连接池就这么简单

    前言 本章节主要讲解Druid数据库连接池,为什么要学Druid数据库连接池呢?? 我的知识储备数据库连接池有两种->C3P0,DBCP,可是现在看起来并不够用阿~当时学习C3P0的时候,觉得这 ...

  4. [转]DBCP连接池的最简单应用(用于ORACLE数据库)

    http://blog.csdn.net/iihero/article/details/8254107 http://www.programgo.com/article/81693457907/ 鉴于 ...

  5. JUC之线程池基础与简单源码分析

    线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...

  6. 数据库连接池之_Druid简单使用

    数据库连接池: 连接池是创建和管理一个连接的缓冲池的技术,这些连接真备好被任何需要他们的线程使用,可以对传统的JDBCjava数据库连接()进行优化 在实际开发中,我们需要频繁的操作数据库,这就意味着 ...

  7. 进程池Pool的简单使用,同步异步的区别

    #进程池 """ 当需要创建子进程数量不多的时候,可以直接利用multiprocessing 中的Process动态生成多个进程,但是如果上百甚至上千个任务, " ...

  8. 数据库连接池 —— Druid的简单使用

    Druid不仅是一个数据库连接池,还包含一个ProxyDriver.一系列内置的JDBC组件库.一个SQL Parser.支持所有JDBC兼容的数据库,包括Oracle.MySql.Derby.Pos ...

  9. 常见线程池 newFixedThreadPool 的简单使用

    package com.aaa.threaddemo; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurr ...

随机推荐

  1. JavaScript中的类(class)、构造函数(constructor)、原型(prototype)

    类 Class 类的概念应该是面向对象语言的一个特色,但是JavaScript并不像Java,C++等高级语言那样拥有正式的类,而是多数通过构造器以及原型方式来仿造实现.在讨论构造器和原型方法前,我可 ...

  2. Laravel 5.5 FormRequest 自定义错误消息 postman调试时X-Requested-With设为XMLHttpRequest

    Laravel 5.5 FormRequest 自定义错误消息 使用FormRequest进行表单验证,就不用让验证逻辑和控制器里面的逻辑都混在一起.但在使用的时候呢,发现json错误返回的数据,与我 ...

  3. CLion使用OpenCV(Ubuntu 18.04)

    项目结构: 设置CMainLists.txt文件中的内容: cmake_minimum_required(VERSION 3.13) project(cv_test) ) find_package(O ...

  4. courator - create

    0. retry policy RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,3); 1. client 1) recipes ...

  5. 对KVM虚拟机进行cpu pinning配置的方法

    这篇文章主要介绍了对KVM虚拟机进行cpu pinning配置的方法,通过文中的各种virsh命令可进行操作,需要的朋友可以参考下 首先需求了解基本的信息 1 宿主机CPU特性查看 使用virsh n ...

  6. solr学习之域的管理与中文分析器配置

    该文使用  Centos6.5 64 位    solr4.10.3   IK-Analyzer中文分析器 一.solr域 在solr中域的概念与lucene中域的概念相同,数据库的一条记录或者一个文 ...

  7. SpringBoot项目启用本地Tomcat

    1.修改pom.xml文件,配置<packaging>war</packaging>,使其发布的时候打包成war包 <groupId>com.owlforest&l ...

  8. scrapy中 selenium(中间件) + 语言处理 +mysql

    在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现,通过 ...

  9. mysql 存储过程动态拼接sql并执行赋值

    )) BEGIN ## 定义变量 ,) ; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT ...

  10. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...