- 浏览: 175480 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (87)
- Android (7)
- J2EE (34)
- JavaScript (6)
- CSS (1)
- Scala (0)
- WEB (5)
- Ruby (1)
- J2EE Netbeans JDK (1)
- Maven (2)
- AndroidMenuTest (0)
- ExtJS (1)
- MyBatis (4)
- iBatis (3)
- Quartz (1)
- JavaABC (3)
- HTML (1)
- JQuery (2)
- mysql (3)
- Linux (2)
- windows (1)
- ant (2)
- jboss (1)
- eclipse (1)
- junit (1)
- nginx (1)
- Google (0)
- git (2)
- python (1)
- kafka (1)
- sqlserver (1)
- jdk8+ (1)
很早的时候就知道要提高访问数据的效率,连接池是其中一个最重要的环节。虽然知道其原理就是将连接提前建立好放在一个池子里,然后当需要的时候直接使用用建立好的连接,而不用 每次都新建,使用完后还会去,而不用关闭,刚开始的时候总是不太明白,或者说不知道他是如何储存连接,如何使用连接。
最近就花了点时间,写了个简单的连接池,就重点介绍下连接池这个类:
DBConnPool.java
DBConnProperties.java,这个就是存放数据库的一些连接参数。(详细见附件)
然后我用多线程写了一个测试用例
TestThread.java 测试
Java代码 收藏代码
Test.java的main方法如下:
Java代码 收藏代码
其中还用直接用直接连接的测试用例(见附近)
测试结果如下:
* 同时执行个数50个的 时间 同时执行个数200个的 时间 同时执行个数5000个的 时间 同时执行个数10000个的 时间
* 连接池(最大连接2,最小连接1) 297ms 453ms 6375ms 13906ms
* 连接池(最大连接6,最小连接3) 281ms 469ms 5344ms 11235ms
* 连接池(最大连接8,最小连接4) 297ms 485ms 5890ms 11235ms
* 连接池(最大连接10,最小连接5) 328ms 516ms 5438ms 11469ms
* 连接池(最大连接20,最小连接10) 390ms 563ms 5829ms 11890ms
* 连接池(最大连接30,最小连接20) 375ms 562ms 5766ms 11141ms
* 普通连接方式 1750ms 4922ms 超过最大连接报异常了
*
对于结果的疑问,用连接池的方式,比直接连接的方式效率要高多了,这是无容置疑的,可是,当我增大连接池的数量时,那么当用多个访问时,效率且基本上没什么变化,这是为什么呢?,按道理池里面的连接数越多,速度应该越快,时间就越短,为什么没有这种效果,希望有人能指点小弟!
最近就花了点时间,写了个简单的连接池,就重点介绍下连接池这个类:
DBConnPool.java
public class DBConnPool { private String url; private DBConnProperties DBconnpro; private Vector<Connection> connpool=new Vector(); //存放连接 private Vector<DBConnPool> waitconn=new Vector(); //存放等待连接的线程 private int connpool_outsize=0; //连接正在使用的数量 public DBConnPool(String url){ this.url=url; init(); } /** * 从连接池中获取连接 * @return */ public Connection getConn() { Connection conn=null; synchronized(this){ if(connpool.isEmpty()){ if(connpool_outsize+connpool.size()>=DBconnpro.getConnectionMax()){ //当连接池为空,并且当前使用连接数已经大于最大连接数时,当前连接线程进入等待,直到有新空连接时继续执行 try { waitconn.add(this); //将当前连接请求放入等待队列 // System.out.println("连接超过最大数,进入等待"); wait(); // System.out.println("继续执行"); return getConn(); //被唤醒后,重新请求获取连接 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ //当连接池为空,并且连接数已经大于最大连接数时,新建连接 conn=newConn(); connpool_outsize++; return conn; } } if(!connpool.isEmpty()){ //当连接池不为空时,从连接池获得连接 conn=connpool.remove(0); connpool_outsize++; return conn; } } return conn; } /** * 连接使用完毕后,放回连接池 * @param conn */ public void returnConn(Connection conn) { synchronized(this){ if(!waitconn.isEmpty()){ //当有等待队列中有等待的连接时,将连接放入连接池,一提供给等待连接队列使用 DBConnPool dbconnpool=waitconn.remove(0); // System.out.println("有新连接释放"); connpool.add(conn); connpool_outsize--; dbconnpool.notify(); }else{ if(connpool_outsize+connpool.size()>DBconnpro.getConnectionMin()){ //当有等待队列中没有有等待的连接,并且当前使用连接数已经大于最小连接数时,将连接(connection)关闭连接 try { connpool_outsize--; conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ //当有等待队列中没有有等待的连接,并且当前使用连接数已经小于或等于最小连接数时,将连接放回连接池 connpool.add(conn); connpool_outsize--; } } } } /** * 创建一个新的连接 * @return */ public Connection newConn() { Connection conn=null; try { Class.forName(DBconnpro.getServerdbdriver()); conn=DriverManager.getConnection(DBconnpro.geturl(),DBconnpro.getServerdbname(),DBconnpro.getServerdbpassword()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } /** * 初始化连接池 */ public void init() { this.DBconnpro=new DBConnProperties(url); connpool=new Vector(); for(int i=0;i<DBconnpro.getConnectionMin();i++){ Connection conn=newConn(); connpool.add(conn); } } }
DBConnProperties.java,这个就是存放数据库的一些连接参数。(详细见附件)
然后我用多线程写了一个测试用例
TestThread.java 测试
Java代码 收藏代码
/** * 测试连接池效率 */ public DBConnPool connpool; public Chaxun(int i,DBConnPool connpool){ this.i=i; this.connpool=connpool; } public void run(){ // System.out.println("开始执行第"+i+"个线程"); Connection conn=connpool.getConn(); PreparedStatement pstm=null; ResultSet rs=null; try { pstm=conn.prepareStatement("select * from t_user"); rs=pstm.executeQuery(); while(rs.next()){ // System.out.println(rs.getString("name")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(rs!=null){ rs.close(); } if(pstm!=null){ pstm.close(); } if(connpool!=null){ connpool.returnConn(conn); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // System.out.println("第"+i+"个线程线程执行完毕,时间为:"+(new Date()).getTime()); // System.out.println("总共执行时间为:"+((new Date()).getTime()-Test.times)); logger.info(i+":"+((new Date()).getTime()-Test.times)); }
Test.java的main方法如下:
Java代码 收藏代码
/** * 测试连接池效率 */ DBConnPool dbconnpool=new DBConnPool("src/system.properties"); times=(new Date()).getTime(); System.out.println("第一次执行时间为:"+times); for(int i=0;i<10000;i++){ Thread thread=new TestThread(i,dbconnpool); thread.start(); }
其中还用直接用直接连接的测试用例(见附近)
测试结果如下:
* 同时执行个数50个的 时间 同时执行个数200个的 时间 同时执行个数5000个的 时间 同时执行个数10000个的 时间
* 连接池(最大连接2,最小连接1) 297ms 453ms 6375ms 13906ms
* 连接池(最大连接6,最小连接3) 281ms 469ms 5344ms 11235ms
* 连接池(最大连接8,最小连接4) 297ms 485ms 5890ms 11235ms
* 连接池(最大连接10,最小连接5) 328ms 516ms 5438ms 11469ms
* 连接池(最大连接20,最小连接10) 390ms 563ms 5829ms 11890ms
* 连接池(最大连接30,最小连接20) 375ms 562ms 5766ms 11141ms
* 普通连接方式 1750ms 4922ms 超过最大连接报异常了
*
对于结果的疑问,用连接池的方式,比直接连接的方式效率要高多了,这是无容置疑的,可是,当我增大连接池的数量时,那么当用多个访问时,效率且基本上没什么变化,这是为什么呢?,按道理池里面的连接数越多,速度应该越快,时间就越短,为什么没有这种效果,希望有人能指点小弟!
- ConnectionPool.rar (864.7 KB)
- 下载次数: 7
发表评论
-
日志过滤小工具
2020-01-06 20:15 4531.从全量日志中截断部 ... -
GC参考手册
2017-11-09 14:12 551英文版原文:GC Tuning: In Practice 垃圾 ... -
IDENTITY_INSERT 设置为 OFF 时无法指定插入自增ID
2017-02-15 16:10 660IDENTITY_INSERT 设置为 OFF 时,无法指定I ... -
运行时Exception:Wrong return type in function
2015-11-17 21:31 1525D:\Soft\jdk1.7.0_79\bin\java ... -
Java中的常量:如何避免反模式
2015-10-20 20:41 450参考http://www.importnew.com/1670 ... -
java Socket通信小栗子
2015-09-14 09:25 614server端: package com.test.soc ... -
MyBatis 自动生成xml文件
2015-03-12 11:22 3800package com.test.mybatis; ... -
Java mail test
2015-02-12 11:03 1308mail局域网Exchange服务器测试代码,仅限发送到dom ... -
Java Concurrency / Multithreading Tutorial
2014-10-28 09:35 705Java Concurrency / Multithreadi ... -
Comparison method violates its general contract!
2014-10-22 17:24 959jdk1.6升级到1.7后Comparator有null的参数 ... -
JDK1.7 不兼容compare方法
2014-10-21 16:20 787java.lang.IllegalArgumentExcept ... -
Unknown Source的出现及解决
2014-06-18 10:03 930http://www.2cto.com/kf/201103/8 ... -
ApplicationDeadlockException
2014-06-16 15:39 784参考 : How to avoid huge transact ... -
Java Date相关处理
2014-02-26 14:35 6071.获取UTC时间: Calendar c ... -
Error listenerStart
2013-12-11 19:25 729INFO: Deploying web applicati ... -
Error configuring application listener of class org.springframework.web.context.
2013-12-07 18:54 38184如果Eclipse的BuildPath里面不缺jar包并且在 ... -
iReport字体报错“JRFontNotFoundException”
2013-10-11 11:08 12797net.sf.jasperreports.engine.uti ... -
Eclipse里Jboss的配置
2013-07-15 17:41 9611.\WorkSpace\.metadata\.plugins ... -
Ant安装使用入门
2013-07-04 14:03 570下载Ant之后,增加环境变量1.ANT_HOME=xx/xx/ ... -
javaSystem获取系统信息
2013-03-27 16:30 808public static void main(Strin ...
相关推荐
Tongweb5是一款基于Java的Web应用服务器,它支持配置JDBC连接池来管理数据库连接。本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些...
在IT行业中,数据库连接管理是应用系统性能优化的关键环节之一,而JDBC连接池就是解决这一问题的有效工具。本文将详细讲解JDBC连接池的工作原理、配置方法以及如何通过优化来提升连接速度。 JDBC(Java Database ...
在Java开发中,数据库操作是不可或缺的一部分,而JDBC连接池是提高数据库访问效率、优化系统资源使用的重要技术。本文将深入探讨JDBC连接池的概念、工作原理,并以"通用basedao"模板为例,讲解如何在实际项目中应用...
JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一组接口和类,而JDBC连接池就是在这个基础上实现的一种优化策略。本文将详细介绍JDBC连接池驱动的相关知识,主要涉及`mysql-connector-java-...
本实例提供了完美的Java JDBC连接池配置,适用于Oracle、MySQL和SQL Server等主流数据库,允许开发者轻松地在不同数据库之间切换方言。 首先,让我们了解什么是JDBC连接池。JDBC(Java Database Connectivity)是...
本示例中的"简单的jdbc连接池类"实现了一个基本的数据库连接池功能,非常适合初学者理解和实践。 首先,我们来理解`jdbc`。JDBC(Java Database Connectivity)是Java语言用来与各种数据库进行交互的一种标准接口。...
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
Java JDBC连接池是一种高效管理数据库连接的技术,它允许应用程序重复使用已经建立的数据库连接,从而减少频繁创建和关闭连接带来的开销。在大型系统中,尤其是高并发环境下,使用连接池能够显著提升性能并降低资源...
关于jdbc连接池连接数据库的原理
描述中提到的"jdbc连接池设计",意味着这个压缩包可能包含了一个简单的JDBC连接池实现或者相关的示例代码。其中,`jdom.jar`是一个Java文档对象模型库,主要用于解析XML文档。在数据库连接池的场景中,`jdom.jar`...
**JDBC连接池BoneCP_Demo详解** 在Java开发中,数据库操作是不可或缺的一部分,而JDBC(Java Database Connectivity)是Java与数据库交互的标准接口。然而,直接使用JDBC进行数据库连接管理可能会导致资源浪费,...
而JDBC连接池是一种管理资源的技术,它能有效地管理和复用数据库连接,提高系统性能并减少系统资源的消耗。在Java应用中,常见的连接池实现有DBCP、C3P0、HikariCP、Druid等。 标题"完美的java jdbc连接池实例.zip...
jdbc连接池代码详解
jdbc连接池属性介绍,
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点包括: 1. **连接测试**:C3P0提供了多种测试策略,确保获取到的连接是可用的。 2. **连接池初始化和最大...
HikariCP是一款高效、高性能的Java JDBC连接池,它被设计为替代传统连接池如C3P0和DBCP,以提供更快、更稳定的数据访问性能。在HikariCP v3.4.5这个版本中,我们可以深入探讨其在数据库连接管理、性能优化以及配置...
一款小型JDBC连接池组件,具有性能高,代码轻,稳定好的特点。 一款小型JDBC连接池组件,具有性能高,代码轻,稳定好的特点。 一款小型JDBC连接池组件,具有性能高,代码轻,稳定好的特点。 一款小型JDBC连接...
**JDBC连接池DBCP详解** Java数据库连接池(JDBC Connection Pool)是Java应用程序管理数据库连接的一种机制,它能够有效地提高数据库访问效率并优化资源使用。DBCP(Jakarta DBCP,又称为Apache Commons DBCP)是...
2. C3P0:这是一个开源的JDBC连接池,提供了比DBCP更高级的功能,如连接测试、空闲连接检测、自动扩展等。C3P0通过组合多个数据源来实现连接池,可以更好地控制并发和资源管理。 这些jar包的收集意味着开发者可以...
在IT行业中,数据库连接管理是应用系统性能优化的关键一环,而JDBC连接池就是解决这一问题的有效工具。本文将深入探讨如何自定义JDBC连接池,并对常用的连接池技术进行介绍。 首先,自定义JDBC连接池的核心在于管理...