配置文件properties

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

user=root

password=1234

driverClass=com.mysql.jdbc.Driver

主要代码

 package JDBCUtils;

 import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
import java.util.Properties;
/**
* 使用代理创建连接池
* @author ASUS
*
*/
public class ProxyConnUtils { private static LinkedList<Connection> pool = new LinkedList<>();
private static String url;
private static String user;
private static String password;
private static String driverClass;
//private static Connection conn;
static{
try {
Properties properties = new Properties();
InputStream in = ProxyConnUtils.class.getResourceAsStream("/db.properties");
properties.load(in);
url = properties.getProperty("url");
System.err.println(url);
user = properties.getProperty("user");
password = properties.getProperty("password");
driverClass = properties.getProperty("driverClass");
Class.forName(driverClass);
for(int i = 0;i<3;i++){
final Connection conn = DriverManager.getConnection(url, user, password);
//对connection做代理
Object connProxy = Proxy.newProxyInstance(ProxyConnUtils.class.getClassLoader(),
new Class[]{Connection.class},
new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断是否是close方法 回收连接
if(method.getName().equals("close")){
synchronized (pool) {
System.err.println("不能关闭");
pool.addLast((Connection) proxy);
pool.notify();
return null;
}
}else{
//若果调用的不是close方法 直接放行
return method.invoke(conn, args);
}
}
});
// 将代理对象添加到池中去
pool.add((Connection) connProxy);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} //获取connection连接
public static Connection getConnection(){
synchronized (pool) {
if(pool.size() == 0){
try {
pool.wait();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
Connection connection = pool.removeFirst();
return connection;
}
}
}

测试代码

 package JDBCTest;
import java.sql.Connection;
import java.sql.Statement;
import java.util.Scanner;
import JDBCUtils.ConnUtil;
import JDBCUtils.ConnUtils;
import JDBCUtils.ProxyConnUtils;
public class Demo01_tx3 {
class one extends Thread{
@Override
public void run() {
System.err.println("1:获取连接");
Connection con =
ProxyConnUtils.getConnection();
try{
System.err.println("2:打开事务");
con.setAutoCommit(false);
System.err.println("3:写入Jack");
Statement st = con.createStatement();
st.execute("insert into money(id,name) values(1,'Jack')");
System.err.println("4:提交 ..");
con.commit();
}catch(Exception e){
e.printStackTrace();
}finally {
try {
System.err.println("5:关闭连接");
con.setAutoCommit(true);
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
};
}; public Demo01_tx3() {
for(int i=0;i<5;i++){
new one().start();
}
} public static void main(String[] args) {
new Demo01_tx3();
}
}

运行结果

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

  1. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  2. nodejs mysql 创建连接池

    用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javas ...

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

    在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建 ...

  4. jdk 动态代理 数据连接池

    package com.itheima.datasource; import java.io.PrintWriter; import java.lang.reflect.InvocationHandl ...

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

    转自:https://blog.csdn.net/weixin_41287692/article/details/83413775 Python 编程中可以使用 PyMysql 进行数据库的连接及诸如 ...

  6. MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池

    MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...

  7. 使用第三方组件(django-redis)创建连接池

    settings里面: ##redis配置CACHES={ 'default':{ 'BACKEND':'django_redis.cache.RedisCache', 'LOCATION':'red ...

  8. druid:java代码创建连接池

    PropertiesDB 是一个读取配置文件的类,也可以不用,每个参数直接用String代替. public DataSource dataSource(PropertiesDB properties ...

  9. JDK动态代理连接池

    JDK动态代理   1 什么是JDK动态代理 刚刚写ItcastConnection时爽么?因为Connection中的方法太多了,每个都要写,所以很累吧.累点到是没什么,可以完成功能就是好的.但是不 ...

随机推荐

  1. 17秋 软件工程 团队第五次作业 Alpha Scrum10

    17秋 软件工程 团队第五次作业 Alpha Scrum10 今日完成的任务 世强:Android客户端成员列表完善.APP前端子部门和活动中心界面与数据交互: 港晨:Web前端主页的接口对接: 树民 ...

  2. json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1

    问题描述:使用Python代码将txt城市列表文件转换为xls文件,源码如下, #!/usr/bin/env Python # coding=utf-8 import os import json i ...

  3. 解决Fatal error in launcher: Unable to create process using '"'

    问题 分析原因 网上看了很多方案都说直接运行 python3 -m pip install --upgrade pip 来升级pip版本就好了,这个在大多数情况下都是有用的.因为重装以后会根据更改后的 ...

  4. RestTemplate 服务名请求

    @loadBalance注解修饰的restTemplate才能实现服务名的调用,没有修饰的restTemplate是没有该功能的. @loadBalance是Netflix的ribbon中的一个负载均 ...

  5. 转://oracle 11G+ASM for Linux手工建库

    环境描述 环境:Oracle Linux 6.5 + ORACLE 11g R2+ASM ORACLE的程序已经安装完毕.但是没有创建任何数据库. 实验内容 安装ORACLE11g数据库,不使用DBC ...

  6. Javascript中的各结构的嵌套和函数

    各位朋友大家好,上周更新给大家分享了JavaScript的入门知识及各种常用结构的用法,那么,本次更新博主就跟大家更深入的聊一聊JS各结构的嵌套用法,及JS中及其常用的一种结构——函数.以下为函数和循 ...

  7. Spring Security 用户认证原理分析

    本文基于 spring-security-core-5.1.1 和 tomcat-embed-core-9.0.12. 核心原理 用户通过 username 和 password 登录时,后端会经过一 ...

  8. Django rest framework集成微博第三方登录

    Django restframework 集成第三方登录(微博.微信.QQ等) 友情链接 python-social-auth-app官方文档 微博开放者平台 QQ开放者平台 准备工作 1.注册微博开 ...

  9. NodeJS之path模块

    NodeJS之path模块 常用的主要有如下工具函数: 1. path.basename(path[, ext]) 2. path.extname(path) 3. path.dirname(path ...

  10. ubuntu 安装json

    命令行中输入:sudo apt-get install libjsoncpp-dev