数据库连接池(涉及到增强类里面方法采用的方法介绍)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39531549/article/details/82764358

一、连接池概述

        1、连接池的概述
		* 之前得到数据库连接 DriverManager.getConnection();
			- 每个用户连接都需要执行一次这个方法

		* 比如 每次创建连接需要0.1秒,关闭连接需要0.1,如果一个访问需要0.2秒
			- 比如现在有10万个人,有十万次连接和关闭,要花费20000秒,时间很长会造成服务器的压力会很大很大

		* 可以使用连接池解决这个问题

		* 什么是连接池:预先创建一些连接,放到内存中的一个空间里面。每次用户访问时候,从内存空间里面获取一个连接,用完之后,不进行关闭,放回内存的空间里面,供其他用户使用。避免频繁的创建和关闭。在内存中的空间理解为是一个容器,容器里面放的数据库的连接

		* 自定义连接池(了解)
			- 实现步骤:
				-- 第一步:创建一个类实现一个接口 DataSource
				
				-- 第二步:实现接口里面的方法,主要实现getConnection()

					* 创建数据库连接  DriverManager.getConnection()
					
					* 创建多个连接 for循环
					
					* 在内存中分配一个空间 List集合,把创建的多个连接放到集合里面
					
					* 把创建的多个连接放到集合里面 使用list里面add方法

					* 从list集合里面获取连接 remove方法取出去连接
						- list.remove(0)

		* 开源的连接池
			- DBCP连接池(会用)
			
			- C3P0连接池(一般企业中的都使用这个连接池)
			
			- Tomcat内置的连接池(了解)
==============================================================================================================

二、自定义连接池

	2、自定义连接池
		* 实现步骤:
			- 第一步:创建一个类实现一个接口 DataSource
			
			- 第二步:实现接口里面的方法,主要实现getConnection()
				-- 创建数据库连接  DriverManager.getConnection()
				-- 创建多个连接 for循环
				-- 在内存中分配一个空间 List集合,把创建的多个连接放到集合里面
				-- 把创建的多个连接放到集合里面 使用list里面add方法

				-- 从list集合里面获取连接 remove方法取出去连接
					* list.remove(0)
		
		*代码演示
			-mypool.java类实现DataSource接口
				public class MyPool implements DataSource {
				List<Connection> list = new ArrayList<Connection>();
				Connection conn = null;
				public MyPool(){
					//创建对象,创建连接池
					for(int i=1;i<10;i++){
						try {
							conn = JDBCUtils.getConnection();
							list.add(conn);
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
				
				//把使用完的连接放回连接池里面
				public void backPool(Connection conn){
					list.add(conn);
				}
				public Connection getConnection() throws SQLException {
					if(list.size()<0){
						//创建对象,创建连接池
						for(int i=1;i<10;i++){
							try {
								conn = JDBCUtils.getConnection();
								list.add(conn);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
					return list.remove(0);
				}
			-测试类
				public class TestPool {
					public static void main(String[] args) {
						Connection conn = null;
						PreparedStatement pst = null;

						// 获取连接池对象
						MyPool myPool = new MyPool();
						try {
							// 获取连接
							conn = myPool.getConnection();

							// 编写sql
							String sql = "select * from account";
							pst = conn.prepareStatement(sql);
							ResultSet executeQuery = pst.executeQuery();
							while (executeQuery.next()) {
								int id = executeQuery.getInt(1);
								String name = executeQuery.getString(2);
								int salay = executeQuery.getInt(3);
								System.out.println(id + "  " + name + "   " + salay);
							}
						} catch (Exception e) {
							e.printStackTrace();
						} finally {
							// 释放资源
							JDBCUtils.releaseResource(conn, pst);
							// 放回connection
							myPool.backPool(conn);
						}
					}
				}
==============================================================================================================

 三、增强一个类中的方法

	*如何增强一个类中的方法
			* 增强一个类中的方法有三种

				① 第一种继承
					* 使用继承方式增强类中的方法,必须要知道父类是什么,得到父类
					class Man {
						public void run1() {
							System.out.println("man run...........");
						}
					}

					class SuperMan extends Man {
						public void run1() {
					//		super.run1();
							System.out.println("superman run...........");
						}
					}

				② 第二种装饰者模式
					* 首先创建一个接口,在接口里面定义方法
					* 写两个类,这两个类分别实现这个接口
					* 在增强的方法所在的类里面,得到被增强方法所在类的引用

					* 缺点:由于实现接口,所有需要把接口里面的所有的方法都实现

					* 代码
						interface Bird {
							public void fly() ;
						}

						//增强ying类里面的fly的方法
						//创建两个类,分别实现这个接口
						class Ying implements Bird {

							public void fly() { //被增强的方法
								System.out.println("ying fly 1000 m..............");
							}
						}

						class Diao implements Bird {
							
							private Bird bird;
							//通过构造得到
							public Diao(Bird bird) {
								this.bird = bird;
							}

							public void fly() { //增强的方法
						//		bird.fly();
								System.out.println("diao fly 9m");
							}
						}

						调用:
						Diao diao = new Diao(new Ying());
						diao.fly();


				③ 第三种动态代理
==============================================================================================================

 四、增强Connection里面close方法

        4、实现增强Connection里面的close方法
		* 实现的是把close方法实现的功能不是关闭连接,而是把连接放回list集合里面
		
		* 步骤
			- 第一步:创建一个类,实现Connection接口
			
			- 第二步:增强close方法
					** 通过构造得到conn和list结合
					** 代码
					private List<Connection> list;
					private Connection conn;

					//实现把连接放回到list里面
					//通过构造
					public MyClose(Connection conn,List<Connection> list) {
						this.list = list;
						this.conn = conn;   
					}

					* 把conn放到list里面
					* 代码
					public void close() throws SQLException {
						//把conn放到list里面
						list.add(conn);
					}
			
			- 第三步:由于实现Connection接口,但是现在只是增强close方法,其他的方法需要保留原有的逻辑
				public Statement createStatement() throws SQLException {
					// TODO Auto-generated method stub
					return conn.createStatement();
				}
			
			- 第四步:在自定义连接池类里面,使用增强的类
				* 在获取连接的方法里面 getConnection方法里面,new 创建的增强的类,把conn和list集合传递进去,
				返回new 的连接
				conn = list.remove(0);
				MyClose myclose = new MyClose(conn, list);
				return myclose;
			
			- 第五步:使用多态形式,使用自定义的连接池,执行conn里面的close方法不是关闭连接了,而是把连接放到list里面
				DataSource pool = new MyPool();
==============================================================================================================

猜你喜欢

转载自blog.csdn.net/weixin_39531549/article/details/82764358
今日推荐