动态代理连接数据库


package 动态连接数据库;

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;

public class UtilsDB {

public static void main(String[] args) {
UtilsDB u = new UtilsDB();
System.err.println(u.getCon());

}

private static LinkedList<Connection> pool = new LinkedList<Connection>();

static {
try {

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///abc";

for (int i = 0; i < 3; i++) {
// 真实对象
final Connection con = DriverManager.getConnection(url, "root",
"1234");
// 声明代理

Object obj = Proxy.newProxyInstance(
UtilsDB.class.getClassLoader(),
new Class[] { Connection.class },

new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {

if (method.getName().equals("close")) {

System.err.println("有人还连接");

synchronized (pool) {
pool.addLast((Connection) proxy);
pool.notifyAll();
return null;

}

} else {
return method.invoke(con, args);

}

}
});

// 将代理人添加到pool

pool.add((Connection) obj);

}

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public static Connection getCon() {
synchronized (pool) {
if (pool.size() == 0) {
try {
pool.wait();

} catch (Exception e) {

throw new RuntimeException(e.getMessage());
}
return getCon();
} else {

Connection con = pool.removeFirst();
System.err.println("pool.size:" + pool.size());
return con;

}

}

}

}


package 动态连接数据库;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class TestDb {

public static void main(String[] args) {
//Connection con=UtilsDB.getCon();
//System.err.println(con);

for (int i = 0; i < 110; i++) {

new Thread() {
public void run() {

Connection con = UtilsDB.getCon();

try {
Statement st = con.createStatement();

System.err.println(con + "\t" + this.getName() + "\t"
+ st);

} catch (SQLException e) {
e.printStackTrace();

} finally {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
};

}.start();

}

}
}

动态代理连接数据库,码迷,mamicode.com

时间: 2024-09-30 16:48:19

动态代理连接数据库的相关文章

使用Java中的动态代理实现数据库连接池

2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在 互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度.很多的连接池 都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前

【框架】[Spring] 基于Spring框架的Web应用演示(附带cglib工具进行动态代理)

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前言: Spring也差不多学了Ioc控制反转和实现AOP技术的两种方式了,分享一个学习Spring,用来入门挺好的例子. 如果你是刚刚学习Spring,那么此实例应该可以很好的帮助你应用Spring到Web项目中. 里面的DAO层-提交数据库的事务我并没有使用Spring 的注解功能,而是用spring的AOP来实现的.这样更灵活,其实,框架为我们做的事越多,我们就越受框架的约束

2018-07-24期 Java动态代理实现数据库连接池

package cn.sjq.proxy.ds.pool; 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.DriverManager; import java.sql.SQLExcep

Spring框架5:事务和动态代理

事务 我们在service中加一个转账的功能 public void transfer(String sourceName, String targetName, Float money) { Account source = accountDao.findAccountByName(sourceName); Account target = accountDao.findAccountByName(targetName); source.setMoney(source.getMoney() -

Java基础加强——动态代理

代理模式: 为其他对象提供一种代理以控制对这个对象的访问. 代理模式主要分为两类: 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了.  动态代理:在程序运行时,运用反射机制动态创建而成 1.静态代理相对好理解一些,来看下面的代码: 接口 Count.java /** * 账户接口 * @author jiangbei01 * */ public interface Count { void add(); void update();

理解java动态代理

java动态代理是java语言的一项高级特性.在平时的项目开发中,可能很难遇到动态代理的案例.但是动态代理在很多框架中起着不可替代的作用,例如Spring的AOP.今天我们就聊一聊java动态代理的实现原理. jdk对于动态代理的支持主要依赖于两个类:Proxy和InvocationHandler.我们先看一下类图. Subject类是主题类,定义了我要做什么.我们需要代理的类即实现Subject接口的RealSubject. 1.InvocationHandler InvocationHand

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

关于java的一个典型的动态代理

今天看书的一个过程中,看到一个动态代理看下代码 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy { public static void testDynamicProxy(){ Calculator calculator = new CalculatorImpl(); LogH