临安建设投标网站,什么叫效果图,法拍房北京网站,与别人相比自己网站建设优势一、为什么我们要用连接池技术#xff1f; 前面的数据库连接的建立及关闭资源的方法有些缺陷。统舱传统数据库访问方式#xff1a;一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接, 系统性能严重受损。 解决方案#xff1a;数据库连接池#xff08…一、为什么我们要用连接池技术 前面的数据库连接的建立及关闭资源的方法有些缺陷。统舱传统数据库访问方式一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接, 系统性能严重受损。 解决方案数据库连接池Connection Pool。 系统初始运行时主动建立足够的连接组成一个池.每次应用应用程序请求数据库连接时无需重新打开连接而是从池中取出已有的连接使用完后不再关闭而是归还。 二、连接池主要由三部分组成连接池的建立、连接池中连接的使用管理、连接池的关闭。 三、连接池技术的核心思想 连接复用通过建立一个数据库连接池以及一套连接使用、分配、管理策略使得该连接池中的连接可以得到高效、安全的复用避免了数据库连接频繁建立、关闭的开销。 1.连接池的建立 在系统初始化时根据相应的配置创建连接并放置在连接池中以便需要使用时能从连接池中获取这样就可以避免连接随意的建立、关闭造成的开销。 2.连接池中连接的使用管理 连接池管理策略是连接池机制的核心。当连接池建立后如何对连接池中的连接进行管理解决好连接池内连接的分配和释放对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用降低了系统建立新连接的开销同时也加速了用户的访问速度。 采用的方法是一个很有名的设计模式Reference Counting引用记数。该模式在复用资源方面应用的非常广泛把该方法运用到对于连接的分配释放上为每一个数据库连接保留一个引用记数用来记录该连接的使用者的个数。 1当客户请求数据库连接时首先查看连接池中是否有空闲连接指当前没有分配出去的连接。如果存在空闲连接则把连接分配给客户并作相应处理即标记该连接为正在使用引用计数加1。如果没有空闲连接则查看当前所开的连接数是不是已经达到maxConn最大连接数如果没达到就重新创建一个连接给请求的客户如果达到就按设定的maxWaitTime最大等待时间进行等待如果等待maxWaitTime后仍没有空闲连接就抛出无空闲连接的异常给用户。2当客户释放数据库连接时先判断该连接的引用次数是否超过了规定值如果超过就删除该连接并判断当前连接池内总的连接数是否小于minConn最小连接数若小于就将连接池充满如果没超过就将该连接标记为开放状态可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用避免频繁地建立、释放连接所带来的系统资源开销。 3.连接池的关闭 当应用程序退出时应关闭连接池此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库即关闭所有数据库连接这与连接池的建立正好是一个相反过程。 我们采用DBCP(DataBase connection pool),数据库连接池。DBCP(是 apache 上的一个 java 连接池项目也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包commons-dbcp.jar,commons-pool.jar,commons-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为所以通过连接池预先同数据库建立一些连接放在内存中应用程序需要建立数据库连接时直接到连接池中申请一个就行用完后再放回去。 四、连接池的实现 新建一个java工程并导入相应的包。 配置文件 1 jdbc.drivercom.mysql.jdbc.Driver
2 jdbc.urljdbc:mysql://localhost:3306/csdn
3 jdbc.userroot
4 jdbc.password123456
5 initsize1
6 maxactive1
7 maxwait5000
8 maxidle1
9 minidle1 dbcp的基本配置的介绍 1.initialSize 连接池启动时创建的初始化连接数量默认值为02.maxActive 连接池中可同时连接的最大的连接数默认值为8调整为20高峰单机器在20并发左右自己根据应用场景定3.maxIdle连接池中最大的空闲的连接数超过的空闲连接将被释放如果设置为负数表示不限制默认为8个maxIdle不能设置太小因为假如在高负载的情况下连接的打开时间比关闭的时间快会引起连接池中idle的个数 上升超过maxIdle而造成频繁的连接销毁和创建类似于jvm参数中的Xmx设置)4.minIdle连接池中最小的空闲的连接数低于这个数量会被创建新的连接默认为0调整为5该参数越接近maxIdle性能越好因为连接的创建和销毁都是需要消耗资源的但是不能太大因为在机器很空闲的时候也会创建低于minidle个数的连接类似于jvm参数中的Xmn设置5.maxWait 最大等待时间当没有可用连接时连接池等待连接释放的最大时间超过该时间限制会抛出异常如果设置-1表示无限等待默认为无限调整为60000ms避免因线程池不够用而导致请求被无限制挂起 DBUtil源码如下 1 package com.daliu.jdbc;2 3 import java.io.InputStream;4 import java.sql.Connection;5 import java.sql.SQLException;6 import java.util.Properties;7 8 import org.apache.commons.dbcp.BasicDataSource;9 10 /**11 * 使用连接池技术管理数据库连接12 */13 public class DBUtil {14 15 //数据库连接池16 private static BasicDataSource dbcp;17 18 //为不同线程管理连接19 private static ThreadLocalConnection tl;20 21 //通过配置文件来获取数据库参数22 static{23 try{24 Properties prop25 new Properties();26 27 InputStream is28 DBUtil.class.getClassLoader()29 .getResourceAsStream(30 com/daliu/jdbc/db.properties);31 32 prop.load(is);33 is.close();34 35 //一、初始化连接池36 dbcp new BasicDataSource();37 38 39 //设置驱动 (Class.forName())40 dbcp.setDriverClassName(prop.getProperty(jdbc.driver));41 //设置url42 dbcp.setUrl(prop.getProperty(jdbc.url));43 //设置数据库用户名44 dbcp.setUsername(prop.getProperty(jdbc.user));45 //设置数据库密码46 dbcp.setPassword(prop.getProperty(jdbc.password));47 //初始连接数量48 dbcp.setInitialSize(49 Integer.parseInt(50 prop.getProperty(initsize)51 )52 );53 //连接池允许的最大连接数54 dbcp.setMaxActive(55 Integer.parseInt(56 prop.getProperty(maxactive)57 )58 );59 //设置最大等待时间60 dbcp.setMaxWait(61 Integer.parseInt(62 prop.getProperty(maxwait)63 )64 );65 //设置最小空闲数66 dbcp.setMinIdle(67 Integer.parseInt(68 prop.getProperty(minidle)69 )70 );71 //设置最大空闲数72 dbcp.setMaxIdle(73 Integer.parseInt(74 prop.getProperty(maxidle)75 )76 );77 //初始化线程本地78 tl new ThreadLocalConnection();79 }catch(Exception e){80 e.printStackTrace();81 }82 }83 84 /**85 * 获取数据库连接86 * return87 * throws SQLException 88 */89 public static Connection getConnection() throws SQLException{90 /*91 * 通过连接池获取一个空闲连接92 */93 Connection conn 94 dbcp.getConnection();95 tl.set(conn);96 return conn;97 }98 99
100 /**
101 * 关闭数据库连接
102 */
103 public static void closeConnection(){
104 try{
105 Connection conn tl.get();
106 if(conn ! null){
107 /*
108 * 通过连接池获取的Connection
109 * 的close()方法实际上并没有将
110 * 连接关闭而是将该链接归还。
111 */
112 conn.close();
113 tl.remove();
114 }
115 }catch(Exception e){
116 e.printStackTrace();
117 }
118 }
119
120 /**
121 * 测试是否连接成功
122 * param args
123 * throws SQLException
124 */
125 public static void main(String[] args) throws SQLException {
126 System.out.println(getConnection());
127 }
128 } 效果如下