使用代理创建连接池 proxyPool

配置文件properties

1 url=jdbc:mysql://127.0.0.1:3306/mine?characterEncoding=UTF-8

2 user=root

3 password=1234

4 driverClass=com.mysql.jdbc.Driver

主要代码

 1 package JDBCUtils;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.lang.reflect.InvocationHandler;
 6 import java.lang.reflect.Method;
 7 import java.lang.reflect.Proxy;
 8 import java.sql.Connection;
 9 import java.sql.DriverManager;
10 import java.util.LinkedList;
11 import java.util.Properties;
12 /**
13  * 使用代理创建连接池
14  * @author ASUS
15  *
16  */
17 public class ProxyConnUtils {
18
19     private static LinkedList<Connection> pool =  new LinkedList<>();
20     private static String url;
21     private static String user;
22     private static String password;
23     private static String driverClass;
24     //private static Connection conn;
25     static{
26         try {
27             Properties properties = new Properties();
28             InputStream in = ProxyConnUtils.class.getResourceAsStream("/db.properties");
29             properties.load(in);
30             url = properties.getProperty("url");
31             System.err.println(url);
32             user = properties.getProperty("user");
33             password = properties.getProperty("password");
34             driverClass = properties.getProperty("driverClass");
35             Class.forName(driverClass);
36             for(int i = 0;i<3;i++){
37                 final Connection conn = DriverManager.getConnection(url, user, password);
38                 //对connection做代理
39                 Object connProxy = Proxy.newProxyInstance(ProxyConnUtils.class.getClassLoader(),
40                     new Class[]{Connection.class},
41                     new InvocationHandler() {
42
43                         @Override
44                         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
45                             //判断是否是close方法   回收连接
46                             if(method.getName().equals("close")){
47                                 synchronized (pool) {
48                                     System.err.println("不能关闭");
49                                     pool.addLast((Connection) proxy);
50                                     pool.notify();
51                                     return null;
52                                 }
53                             }else{
54                                 //若果调用的不是close方法  直接放行
55                                 return method.invoke(conn, args);
56                             }
57                         }
58                     });
59                 // 将代理对象添加到池中去
60                 pool.add((Connection) connProxy);
61             }
62         } catch (Exception e) {
63             e.printStackTrace();
64             throw new RuntimeException(e);
65         }
66     }
67
68     //获取connection连接
69     public static Connection getConnection(){
70         synchronized (pool) {
71             if(pool.size() == 0){
72                 try {
73                     pool.wait();
74                 } catch (Exception e) {
75                     e.printStackTrace();
76                     throw new RuntimeException(e);
77                 }
78             }
79             Connection connection = pool.removeFirst();
80             return connection;
81         }
82     }
83 }

测试代码

 1 package JDBCTest;
 2 import java.sql.Connection;
 3 import java.sql.Statement;
 4 import java.util.Scanner;
 5 import JDBCUtils.ConnUtil;
 6 import JDBCUtils.ConnUtils;
 7 import JDBCUtils.ProxyConnUtils;
 8 public class Demo01_tx3 {
 9     class one extends Thread{
10         @Override
11         public void run() {
12             System.err.println("1:获取连接");
13             Connection con =
14                     ProxyConnUtils.getConnection();
15             try{
16                 System.err.println("2:打开事务");
17                 con.setAutoCommit(false);
18                 System.err.println("3:写入Jack");
19                 Statement st = con.createStatement();
20                 st.execute("insert into money(id,name) values(1,‘Jack‘)");
21                 System.err.println("4:提交  ..");
22                 con.commit();
23             }catch(Exception e){
24                 e.printStackTrace();
25             }finally {
26                 try {
27                     System.err.println("5:关闭连接");
28                     con.setAutoCommit(true);
29                     con.close();
30                 } catch (Exception e) {
31                     e.printStackTrace();
32                 }
33             }
34         };
35     };
36
37     public Demo01_tx3() {
38         for(int i=0;i<5;i++){
39             new one().start();
40         }
41     }
42
43     public static void main(String[] args) {
44         new Demo01_tx3();
45     }
46 }

运行结果

时间: 2024-12-23 23:10:45

使用代理创建连接池 proxyPool的相关文章

spring创建连接池的几种方式

spring使用连接池有很多种方式,jdbc(不使用连接池),c3p0,dbcp,jndi,下面将分别贴代码介绍这几种:  1.jdbc方式 使用的是DriverManagerDataSource,DriverManagerDataSource建立连接是只要有连接就新建一个connection,  根本没有连接池的作用 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManag

Python 使用 PyMysql、DBUtils 创建连接池提升性能

Python 使用 PyMysql.DBUtils 创建连接池提升性能 Python 编程中可以使用 PyMysql 进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接 MySQL 数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对 mysql 的性能会产生较大的影响.因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的. 解决方案:DBUtils DBUtils 是一套 Python 数据库连接池包,并允许对非线程安全的数据库接口

nodejs mysql 创建连接池

用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 程序员

jdk 动态代理 数据连接池

package com.itheima.datasource; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayL

Java创建连接池连接不同数据库

在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建造数据库连接池,处理多个业务数据处理. 那么具体怎么实现呢,下面一起来看一下: 整体结构如下: 第一步,先处理连接不同数据库 1.首先,将数据库配置信息创建一个公用类:JdbcUrl.java 主数据库可以用默认的构造方法,如果是连接其他库,则通过传递参数的方式来处理. 数据库参数有如下几个: 1

通过JNDI创建连接池

配置Context的五种方式 1,由服务器创建的连接池一定要将mysql驱动文件放在tomcat的lib文件夹内2,在META-INF文件夹里新建context.xml(发布web应用的时候会在tomcat/conf/Catalina/localhost生成配置文件) 1 <Context ...> 2 ... 3 <Resource name="jdbc/EmployeeDB" 4 auth="Container" 5 type="ja

tomcat创建连接池及helpDB类连接方法的书写

1.tomcat中sever配置 <Resource auth="Container" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" initialSize="10" jdbcInterceptors="org.apach

【设计模式】代理模式实现连接池

1. 连接池 创建Connection的过程是非常耗时的,为了保证Conection可以重用.应该将Connection进行池管理. 使用静态工厂方法管理一个唯一的连接: /** * 用静态工厂方法管理一个唯一的可重用的连接 */ public class ConnUtils { private ConnUtils(){} private static Connection con; //在静态代码块中创建与数据库的连接 static{ try{ Class.forName("com.mysql

25、连接池(DBCP、C3P0)、动态代理与分页技术

连接池 思考: 程序中连接如何管理? 1. 连接资源宝贵:需要对连接管理 2. 连接: a) 操作数据库,创建连接 b) 操作结束, 关闭! 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: a. 自定义一个连接池 b. 学习优秀的连接池组件 a) DBCP b) C3P0 动态代理 Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需