使用代理创建连接池 proxyPool
配置文件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的更多相关文章
- Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题
Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...
- nodejs mysql 创建连接池
用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javas ...
- Java创建连接池连接不同数据库
在一个应用里面,可能涉及到连接多个不同数据库进行操作,而每次连接写不同的实现会很麻烦.前面已经会了用JDBC连接数据库,那么利用反射和工厂模式,可以实现连接不同的数据库,这样处理起来将会很方便.同时建 ...
- jdk 动态代理 数据连接池
package com.itheima.datasource; import java.io.PrintWriter; import java.lang.reflect.InvocationHandl ...
- Python 使用 PyMysql、DBUtils 创建连接池,提升性能
转自:https://blog.csdn.net/weixin_41287692/article/details/83413775 Python 编程中可以使用 PyMysql 进行数据库的连接及诸如 ...
- MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池
MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...
- 使用第三方组件(django-redis)创建连接池
settings里面: ##redis配置CACHES={ 'default':{ 'BACKEND':'django_redis.cache.RedisCache', 'LOCATION':'red ...
- druid:java代码创建连接池
PropertiesDB 是一个读取配置文件的类,也可以不用,每个参数直接用String代替. public DataSource dataSource(PropertiesDB properties ...
- JDK动态代理连接池
JDK动态代理 1 什么是JDK动态代理 刚刚写ItcastConnection时爽么?因为Connection中的方法太多了,每个都要写,所以很累吧.累点到是没什么,可以完成功能就是好的.但是不 ...
随机推荐
- JVM虚拟机查找类文件的顺序
JVM查找类文件的顺序: 在doc下使用set classpath=xxx, 如果没有配置classpath环境变量,JVM只在当前目录下查找要运行的类文件. 如果配置了classpath环境,JVM ...
- Alpha冲刺 - 事后诸葛亮
Alpha冲刺 - 事后诸葛亮 Alpha完成情况表 Stardust(安卓端) 模块 预期计划 现实进展 完成度 登录/注册 登录时,从服务器拉取的数据并同步数据库.获取的数据有:用户名.密码.记录 ...
- St_geometry 初始用
数据准备 点表 CREATE TABLE point_stgeom tablespace UBOSS_STS_WAREHOUSE as select car_number, longid, latid ...
- Html body的滚动条禁止与启用
在写一个在页面中,经验证用户没有登录或session失效时候弹出登录框禁止页面滚动用到今天搞了一个功能,上下左右居中,模仿QQ空间里的样式,把横向和纵向滚动条禁止掉代码如下:<script ty ...
- 解决jqueryeasyUI dialog 弹出窗体超出浏览器,导致不能关闭的bug
使用panel的onMove事件攻克了panel,dialog以及window组件在被拖动时,会超出浏览器边界而无法拖回的情况. 当窗体被拖出浏览器有边界时.$(document).width();会 ...
- 【转】mysql explain执行计划详解
1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有: A:simp ...
- 启动Myeclipse报错“Failed to create the Java Virtual Machine”的解决办法
我安装的是Myeclipse 10.7.1.装上好久没用,今天启动突然报错:Failed to create the Java Virtual Machine. 检查Myeclipse安装好使用时好的 ...
- wallet.metamask.io 网页版钱包 connecting unknown network导致页面卡住
之前在还不是十分懂用的时候想要用其连接本地的打开的ganache,所以就像使用本地插件的metamask一样,点击custom rpc,然后输入http://localhost:7545,然后页面就一 ...
- leetcode701. Insert into a Binary Search Tree
https://www.cnblogs.com/grandyang/p/9914546.html 类似于二分查找的方法,用迭代的方法去做 注意:无论是进入左子树还是右子树,左右子树都变成了新的数,所以 ...
- saltstack配置管理之states
states是saltstack中的配置语言,我们安装一个包,管理一个配置文件,最后保证服务的正常运行,都需要我们编写一些states sls文件(描述状态的文件)去描述和实现我们的功能.sls文件都 ...