`

Java的动态代理产生Connection

阅读更多

创建数据库连接池:

public class DataSource {

    private InputStream inStream;

    private Properties pro;

    private static int initCount = 5;// 初始连接数

    private static int maxCount = 10;// 数据库最大连接数

    int currentConnt = 0;// 当前数据库的连接数

    LinkedList<Connection> connectionPool=new LinkedList<Connection>();

   

    public DataSource(){

       inStream=this.getClass().getResourceAsStream("/system.properties");

       pro=new Properties();

       try {

           pro.load(inStream);

           try {

              Class.forName(pro.getProperty("driver"));

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

                  connectionPool.addLast(CreateConnection());

              }

           } catch (ClassNotFoundException e) {

              e.printStackTrace();

           }

          

       } catch (IOException e) {

           e.printStackTrace();

       }

      

    }

   

    private Connection CreateConnection(){

       Connection conn=null;

       MyConnectionProxy myproxy=null;

       try {

           conn=DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("username"), pro.getProperty("password"));

           myproxy=new MyConnectionProxy(this);

       } catch (SQLException e) {

           e.printStackTrace();

       }

       currentConnt++;

       return myproxy.bind(conn);

    }

   

    public Connection GetConnection(){

       synchronized (connectionPool) {

           if(connectionPool.size()>0){

              return connectionPool.removeFirst();

           }

           if(currentConnt<maxCount){

              return CreateConnection();

           }

           throw new RuntimeException("数据库已达到最大连接数!");

       }

    }

}

 

创建代理类

public class MyConnectionProxy implements InvocationHandler {

    private Connection realConnection;

    private Connection proxyConnection;

    private DataSource datasource;

   

    private int maxUseCount = 10;

    private int currentUserCount = 0;

   

    MyConnectionProxy(DataSource ds){

       this.datasource=ds;

    }

   

    Connection bind(Connection conn){

       this.realConnection=conn;

       proxyConnection=(Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, this);

       //Proxy.newProxyInstance()方法表示:产生一个新的类,该类继承于第二个参数Connnection,但该类的方法的现实是由第三个参数this负责实现

       return proxyConnection;

    }

    //MyConnectionProxy类所有方法的实现都是由invoke方法实现

    public Object invoke(Object proxy, Method method, Object[] args)

           throws Throwable {

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

           this.currentUserCount++;

           if(this.currentUserCount<maxUseCount){

              this.datasource.connectionPool.addLast(this.proxyConnection);

           }else{

              this.realConnection.close();

              this.datasource.currentConnt--;

           }  

       }

       return method.invoke(this.realConnection, args);

    }

 

}

 

JDBC工具类:

public class SQLDBConnection {

    private static SQLDBConnection sqldb;

    private DataSource datasource;

   

    private SQLDBConnection(){

       datasource=new DataSource();

    }

   

    public static SQLDBConnection getSQLDBConnection(){

       if(sqldb==null){

           synchronized (SQLDBConnection.class) {

              if(sqldb==null){

                  sqldb=new SQLDBConnection();

              }

           }

       }

       return sqldb;

    }

   

    public Connection GetConnection(){

        return this.datasource.GetConnection();

    }

   

    public

分享到:
评论
1 楼 chengjiansunboy 2012-06-26  
没写完哦.

相关推荐

    代理模式详解

    动态代理的实现方式较为复杂,一般使用Java自带的`java.lang.reflect.Proxy`类和`InvocationHandler`接口来实现。动态代理的好处在于可以灵活地为多个类提供统一的代理服务,而无需针对每个类单独编写代理类。 1. *...

    JAVA设计模式之事务处理.docx

    3. **嵌套事务处理**:当业务服务层的方法相互调用时,可能会产生嵌套事务,处理起来较为复杂。 为了解决这些问题,可以引入设计模式,如事务代理(Transaction Proxy)或装饰者(Decorator)模式。事务代理模式...

    Java手机程序设计入门8

    ### Java手机程序设计入门8 —— ...综上所述,《Java 手机程序设计入门 8》这一章节通过详细介绍 MIDP for Palm OS 的使用方法,为 J2ME 新手提供了宝贵的学习资料,同时也对 Java 移动应用开发领域产生了深远的影响。

    JAVA程序开发技术

    - **定义**:用于生成动态内容的Java服务器端技术。 - **生命周期**:初始化、服务、销毁。 **5.1.3 JSP入门** - **定义**:Java Server Pages,用于创建动态网页的技术。 - **特点**:结合HTML标签与Java代码。 *...

    java经典面试2010集锦100题(不看你后悔)

    JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中:...

    JDK中的23个设计模式简介

    装饰器模式是指为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类。例如,java.io.BufferedInputStream(InputStream) 将一个 InputStream 对象装饰为一个带缓冲的 InputStream 对象...

    http请求,http get请求,http post请求

    POST请求不是幂等的,连续发送可能产生不同的结果,比如多次创建相同数据可能会创建多个资源。 四、HttpRequestTool.java 在给定的"HttpRequestTool.java"文件中,我们可以推测这是一个用于发送HTTP请求的工具类。...

    hibernate环境搭建

    4. 额外的依赖:可能需要如`dom4j.jar`用于XML处理,`javassist.jar`用于动态代理等。 在获取了所有必需的JAR文件后,你需要将它们添加到项目的类路径中。这通常可以通过以下方式完成: - 如果你使用的是Eclipse、...

    jdbc基础和参考

    jdbc: 1.数据库连接的方式: ODBC:开放式数据库连接。 C语言实现的,提供语言和(基于SQL的)数据库进行交互的“一致性”的...1.load()方法默认要加载的对象一定存在,所以很放心的使用代理对象,等到用到的时候从...

    Jmeter 的教程与实践

    JMeter是Java开发的,所以确保你的系统已经安装了Java运行环境。然后从Apache官网下载最新版本的JMeter,解压到任意目录,通过双击bin目录下的`jmeter.bat`(Windows)或`jmeter.sh`(Unix/Linux)启动JMeter。界面...

    AIDL的简单实例

    这会产生一个与AIDL文件同名的Java接口,但扩展名为`.java`。这个生成的Java类是客户端和服务端都可以使用的,它提供了序列化和反序列化的功能,使得数据能够在进程间传递。 3. **在服务中实现接口** 在服务端,你...

    android AIDL

    客户端通过`bindService()`方法连接服务,并获取到`IMyService`接口的代理对象,然后就可以调用服务端的方法了: ```java ServiceConnection connection = new ServiceConnection() { @Override public void ...

    二十三种设计模式【PDF版】

    将牛郎织女分开(本应在一起,分开他们,形成两个接口),在他们之间搭建一个桥(动态的结合) 设计模式之 Flyweight(共享元) 提供 Java运行性能,降低小而大量重复的类的开销. C. 行为模式 设计模式之 Command(命令) ...

    Linux服务器nginx访问日志里出现大量http 400错误的请求分析

    Chrome浏览器有时会采用预连接(pre-connection)技术,即在请求HTML文件之前预先建立多个TCP连接,以便更快地加载网页资源。如果HTML文件链接的资源较少,或者资源已经被客户端缓存,这些未使用的连接会被关闭。...

    WebService简单应用

    HttpURLConnection con = (HttpURLConnection) url.openConnection(); // 设置网络连接的一些属性... } ``` 3. **本地代理接口方式调用**: - **定义**:使用工具自动生成本地代理类,简化调用过程。 - **...

    黄淮学院J2EE考试复习试题

    在EJB调用机制中,存根(stub)是在客户端端产生的,用于代理远程方法调用。 25. **禁用默认拦截器的注释** 禁用默认拦截器的注释是`@Interceptors({})`。 26. **注入资源的注释** 注入资源的注释是`@...

    maven3配置文档

    接着,你可以配置`settings.xml`文件来定制Maven的行为,如代理服务器、远程仓库位置、服务器认证和密码等。`localRepository`标签用于指定本地仓库的路径。 然后,通过执行Maven命令,你可以进行清理、安装、创建...

    在线考试系统文献综述

    JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件...

    ssh(structs,spring,hibernate)框架中的上传下载

    此外,JDK的动态代理只对接口有效,否则必须使用CGLIB生成目标类的子类。我们依从于Spring的倡导为业务类定义一个接口:  代码 7 业务层操作接口 1. public interface FileService 2. { 3. void save...

Global site tag (gtag.js) - Google Analytics