public class JdbcUtil2 {
//声明连接池<放到LinkedList中,操作其中对象的速度快 只需要改变连接>
private static LinkedList<Connection> connectionspool=new LinkedList<Connection>();
//静态代码块
static{
try {
String url="jdbc:mysql://localhost:3306/jdbcdb";
String user="root";
String password="mysql";
Class.forName("com.mysql.jdbc.Driver");
//创建3个连接并将它们代理
for(int i=0;i<3;i++)
{
final Connection conn=DriverManager.getConnection(url, user, password);
//对conn进行代理
Object proxyobj= Proxy.newProxyInstance(
JdbcUtil2.class.getClassLoader(),
new Class[]{Connection.class},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//是否是close方法
if(method.getName().equals("close"))
{
synchronized(connectionspool){
connectionspool.addLast((Connection)proxy);
connectionspool.notify();
}
return null;//如果调用的是close()方法,不会调用代理类的方法,会调用代理
}
return method.invoke(conn, args);
}
}); connectionspool.add((Connection)proxyobj); }
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public static Connection getConnection()
{
synchronized(connectionspool)
{
if(connectionspool.size()==0)
{
try {
connectionspool.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return getConnection();
}
else {
Connection conn=connectionspool.removeFirst();
System.err.println("pool中还有连接数:"+connectionspool.size());
return conn;
}
}
}
}

利用多线程测试代理连接池

 public class TestProxy  {
public static void main(String[] args) {
for(int i=0;i<3000;i++)
{
new MyThread().start();
}
}
} class MyThread extends Thread
{
@Override
public void run() {
Connection con = null;
try{
con = JdbcUtil2.getConnection();
System.err.println(this.getName()+","+con);
con.setAutoCommit(false);//设置事务的开始
String sql = "insert into users values('"+this.getName()+"','Tom','44')";
Statement st = con.createStatement();
st.execute(sql);
con.commit();
System.err.println(this.getName()+"子线程执行完成。。。。。");
}catch(Exception e){
e.printStackTrace();
}finally{
try {
con.setAutoCommit(true);
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

动态代理写connection连接池Demo的更多相关文章

  1. junit,面向切面开发(动态代理),工厂设计模式,数据库连接池

    1.junit junit又叫单元测试,好处是能进行批量测试,而且如果方法出现了问题能立刻定位出出现问题的方法,还有一个好处是感官效果很好,如果方法都通过了则显示绿条,否则显示红条 TestCase. ...

  2. workerman如何写mysql连接池

    首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用1.减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间2.减少 ...

  3. neutron-server Connection pool is full, discarding connection 连接池过满

    参考链接:https://zhiliao.h3c.com/Theme/details/48291 问题: -- ::33.235 WARNING requests.packages.urllib3.c ...

  4. c3p0写连接池 Demo

    1.导包 2.配置文件:名称必须为:c3p0-config.xml,且必须放在src根目录下 <c3p0-config> <!-- 默认配置,有且仅可出现一次 ,如果没有指定则使用这 ...

  5. dbcp写连接池 Demo

    1.导包 2.准备配置文件   .properties(注:这里的参数名driverClassName.url.username等是不能改变的) 不能任意命名的原因是[你懂得] 3.Demo publ ...

  6. Go组件学习——手写连接池并没有那么简单

    1.背景 前段时间在看gorm,发现gorm是复用database/sql的连接池. 于是翻了下database/sql的数据库连接池的代码实现,看完代码,好像也不是很复杂,但是总觉得理解不够深刻,于 ...

  7. Java_Web 连接池

    对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式正是为了解决资源的频繁分配﹑释放所造成的问题.为解决我们的问题,可以采用数据库连接池技术.数据库连接池的基本思想就是为 ...

  8. Mybatis的连接池

    先总结一个原则:mytatis的连接池最大值poolMaximumActiveConnections尽量跟服务器的并发访问量持平以至于大于并发访问量. 原因:在org.apache.ibatis.da ...

  9. JDBC之 连接池

    JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力 ...

随机推荐

  1. vs code(egret wing) php配置与调试

    所需插件 下面是便于编写以及调试php的插件,可以从IDE Store中搜索. PHP Debug,PHP IntelliSense,PHP IntelliSence Cranne. 环境配置 找到项 ...

  2. Java在ACM中的使用

    1.基本框架   import java.oi.*;   import java.util.*   public class Main   {   public static void main(St ...

  3. CentOS下安装postgresql

    一.说明 postgresql版本:9.4.1 安装包: postgresql94-server-9.4.1-1PGDG.rhel6.x86_64.rpm postgresql94-libs-9.4. ...

  4. android Uri获取真实路径转换成File的方法

    Uri uri = data.getData(); String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor ...

  5. 欧拉计划之Largest palindrome product

    A palindromic number reads the same both ways. The largest palindrome made from the product of two 2 ...

  6. http状态码有那些?分别代表是什么意思

    http状态码有那些?分别代表是什么意思? 简单版 [ 100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息 ...

  7. 为何某些公司不允许使用C++ STL?

    说几个STL的缺点吧,虽然都是在比较极端的情况下出现,但是对于一些大项目还是会遇到的 1. 代码膨胀问题每一个实例化过的模板类,都会膨胀出一份独立的代码,比如std::vector<std::s ...

  8. mirantis fuel

    使用mirantis公司的openstack部署工具--fuel,迅速部署体验openStack云管理软件; 1,使用virtualbox虚拟化工具(此工具在此使用主要是为了简化新建虚机的网络规划,f ...

  9. openStack工具集

    Openstack发展很猛,很多朋友都很认同,2013年,会很好的解决OpenStack部署的问题,让安装,配置变得更加简单易用. 很多公司都投入人力去做这个,新浪也计划做一个Openstack的is ...

  10. PE基金的运作模式有哪些?

    一.信托制(1)信托型基金是由基金管理机构与信托公司合作设立,通过发起设立信托受益份额募集资金,然后进行投资运作的集合投资工具(2)信托公司和基金管理机构组成决策委员会实施,共同进行决策(3)在内部分 ...