用代理模式 保持用户关闭链接的习惯

package cn.itcast.jdbc.datasourse;

import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
//通过代理模式解决用户关闭链接的习惯
public class MyConnection implements Connection {            //这里实现的是java.sql.Connection
    private Connection realConnection;                           //这里的Connection也是java.sql.Connection
    private MyDataSourse2 myDataSourse;                       //链接在MyDataSource中存放,所以这里要有MyDataSouce

/***********************************************************************************************************************************/

/*********        //我们可以限制使用次链接的次数,当该链接使用超过多少次之后就将该链接真正的关掉          ******/
/*********        private int maxUseCount = 10;             //限制最大使用次数                 ******/
/*********      private int currentUseCount = 0;            //记录当前使用次数                    ******/

/*********     这一块可以不要,当你有这个需求的时候可以加上,此时close方法可以改写为下面的样式          ******/

/************************************************************************************************************************************/

/*********     @Override                                                                                                                                        ******/
 /*********    public void close() throws SQLException {                                                                                         ******/
/*********         this.currentUseCount++;                                                                                                                    ******/
/*********         if(this.currentUseCount < maxUseCount)                                                                                            ******/
 /*********            this.myDataSourse.connectionsPool.addLast(this);//这里只能用this也就是MyConnection                   ******/
 /*********        else                                                                                                                                                           ******/
            this.realConnection.close();                                                                                                                               ******/
    }

/*************************************************************************************************************************8***********/

MyConnection(Connection connection,MyDataSourse2 myDataSourse){
        this.realConnection = connection;
        this.myDataSourse = myDataSourse;
    }
    //这里实现了java.sql.Connection接口,我们只需要处理close方法,让他当被调用时不是直接关掉conn而是将链接放回到连接池中
    @Override
    public void close() throws SQLException {
        this.myDataSourse.connectionsPool.addLast(this);                //这里只能用this也就是MyConnection

}
    //////////////////////////下面的方法可以简单的处理。我们重点看上面的部分//////////////////////////////////////////////////////////////////////////////////////////////////////////
    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return this.realConnection.unwrap(iface);
    }

@Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return this.realConnection.isWrapperFor(iface);
    }

@Override
    public Statement createStatement() throws SQLException {
        return this.realConnection.createStatement();
    }

@Override
    public PreparedStatement prepareStatement(String sql) throws SQLException {
        return this.realConnection.prepareStatement(sql);
    }

@Override
    public CallableStatement prepareCall(String sql) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public String nativeSQL(String sql) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void setAutoCommit(boolean autoCommit) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public boolean getAutoCommit() throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

@Override
    public void commit() throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public void rollback() throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public boolean isClosed() throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

@Override
    public DatabaseMetaData getMetaData() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void setReadOnly(boolean readOnly) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public boolean isReadOnly() throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

@Override
    public void setCatalog(String catalog) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public String getCatalog() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void setTransactionIsolation(int level) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public int getTransactionIsolation() throws SQLException {
        // TODO Auto-generated method stub
        return 0;
    }

@Override
    public SQLWarning getWarnings() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void clearWarnings() throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public Statement createStatement(int resultSetType, int resultSetConcurrency)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public PreparedStatement prepareStatement(String sql, int resultSetType,
            int resultSetConcurrency) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public CallableStatement prepareCall(String sql, int resultSetType,
            int resultSetConcurrency) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public Map<String, Class<?>> getTypeMap() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public void setHoldability(int holdability) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public int getHoldability() throws SQLException {
        // TODO Auto-generated method stub
        return 0;
    }

@Override
    public Savepoint setSavepoint() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public Savepoint setSavepoint(String name) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void rollback(Savepoint savepoint) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public void releaseSavepoint(Savepoint savepoint) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public Statement createStatement(int resultSetType,
            int resultSetConcurrency, int resultSetHoldability)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public PreparedStatement prepareStatement(String sql, int resultSetType,
            int resultSetConcurrency, int resultSetHoldability)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public CallableStatement prepareCall(String sql, int resultSetType,
            int resultSetConcurrency, int resultSetHoldability)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public PreparedStatement prepareStatement(String sql, String[] columnNames)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public Clob createClob() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public Blob createBlob() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public NClob createNClob() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public SQLXML createSQLXML() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public boolean isValid(int timeout) throws SQLException {
        // TODO Auto-generated method stub
        return false;
    }

@Override
    public void setClientInfo(String name, String value)
            throws SQLClientInfoException {
        // TODO Auto-generated method stub

}

@Override
    public void setClientInfo(Properties properties)
            throws SQLClientInfoException {
        // TODO Auto-generated method stub

}

@Override
    public String getClientInfo(String name) throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public Properties getClientInfo() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public Array createArrayOf(String typeName, Object[] elements)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public Struct createStruct(String typeName, Object[] attributes)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void setSchema(String schema) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public String getSchema() throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

@Override
    public void abort(Executor executor) throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public void setNetworkTimeout(Executor executor, int milliseconds)
            throws SQLException {
        // TODO Auto-generated method stub

}

@Override
    public int getNetworkTimeout() throws SQLException {
        // TODO Auto-generated method stub
        return 0;
    }

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package cn.itcast.jdbc.datasourse;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

public class MyDataSourse2 {
    private static String url = "jdbc:mysql://localhost:3306/test";
    private static String user = "root";
    private static String pwd = "";
    
    //用于存放链接
    LinkedList<Connection> connectionsPool = new LinkedList<Connection>();
    
    /*当创建链接时,不是随意的我想创建多少个链接就创建多少个链接,这时因为数据库的链接是有限的
     * 当超过这个范围时,数据库是承受不了的,所以我们就要限制创建链接的个数*/
    private static int initCount = 5;     //设置最小链接数
    private static int maxCount = 20;     //设置最大链接数
    private int currentCount = 0;         //记录当前链接数
    
    
    //初始化链接池时,向链接池内放入10个链接   
    public MyDataSourse2(){
        try {
            for(int i = 0;i< initCount ;i++){
                this.connectionsPool.addLast(this.createConnection());
                this.currentCount++;
            }
        } catch (SQLException e) {
//            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }
    //得到链接
    /*Connection是不支持多线程的,当有多个请求建立链接时,就要保证他们各自拿到的链接不相等
     * 这时就需要用到同步代码块*/
    public Connection getConnection() throws SQLException{
        synchronized(connectionsPool){      //这里的锁用的就是链接池
            if(this.connectionsPool.size() > 0){    //如果池里还有就直接取
                return this.connectionsPool.removeFirst();
            }
            if(this.currentCount < maxCount) {  //如果池里没有了,就判断当前链接是否超过最大链接数,如果没有就创建
                this.currentCount++;
                return this.createConnection();
            }
            /*如果说池里没有了,而且已经达到最大链接数这时有3种处理方式
             * 1 抛一个异常出去
             * 2 返回一个null
             * 3 让它等待别人释放链接
             * 这里简单的处理,抛一个异常出去
             * */
            throw new SQLException("已没有链接");
        }
    }
    
    //释放链接  如果用链接池的话,当我们要释放资源的时候就不能够简单的把conn给关闭掉,而应该是把conn重新放回到链接池中
    public void free(Connection conn){
        this.connectionsPool.addLast(conn);
    }
    //创建链接
    private Connection createConnection() throws SQLException{
//        return DriverManager.getConnection(url,user,pwd);
        Connection realConn = DriverManager.getConnection(url,user,pwd);
        MyConnection myConnection = new MyConnection(realConn, this);
        return myConnection;
    }
}
/*
 * 当我们对数据库进行操作时,往往花费在建立和数据库的链接时花费的时间最长,所以最好就是链接保证链接不要
 * 频繁的建立,这时就应该考虑到创建一个链接池,每次用的时候直接从链接池中去取,用完后再放回去
 * 这样做虽然在创建时花费的时间会很长,但是一旦创建完成,在用的时候就能够很好的提高效率
 * */

用代理模式 保持用户关闭链接的习惯,布布扣,bubuko.com

时间: 2024-10-06 20:19:01

用代理模式 保持用户关闭链接的习惯的相关文章

JDBC学习笔记(18):通过代理模式来保持用户关闭连接的习惯

在前面的JdbcUtils包中,在关闭连接的时候使用了conn.close()方法,如果关闭了连接,那么放回连接池中的连接就成为无效的连接,为了规范用户关闭连接的习惯,使用代理模式来将连接放回连接池而又不改变用户的程序: 将JdbcUtils工具包改变回原来的情形: 1 package com.xxyh.jdbc; 2 import java.sql.Connection; 3 import java.sql.ResultSet; 4 import java.sql.SQLException;

IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘

*********用户登录,回车的监听(代理模式UITextFieldDelegate) #import "HMViewController.h" @interface HMViewController () <UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UITextField *userNameText; @property (weak, nonatomic) IBOutlet UITextField

Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异

本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象. 这个概念给的有些抽象,说白了就是假设内存中存在某个对象A.假设再次须要使用对象A的时候假设内存中有A这个对象就直接使用它,不要再次new了.假设没有,则又一次new一个.基于这个特点,享元模式使用时通常会给待訪问对象传递一个Tag,用来标识这个对象,并且要同一时候使用抽象工厂

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

Java设计模式——代理模式

前言: 上一篇说到了策略模式.单类图上来说,它和本篇要说的代理模式还真是有些像似.都需要一个公共的接口,还有一些实现类.代理类(包装类)封装了一个接口对象,提供客户端调用.这些都很类似.不过,有一个细节需要我们注意一下,那就是这里的代理类也需要去继承这里的公共接口.而在策略模式中,包装类则不需要这么做. 概述: 代理模式就是定义一个原对象的代理对象,来帮助原对象和系统之外的业务作沟通.也就是说,如果我们不能直接或是不愿直接去使用原对象,那么我们就可以使用创建一个原对象的代理来进行操作. 本文链接

【设计模式】-代理模式

模式动机 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为"代理"的第三者来实现 间接引用.代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务. 通过引入一个新的对象(如小图片和远程代理 对象)来实现对真实对象的操作或者将新的对 象作为真实对象的一个替身,这种实现机制即 为代理模式,通过引入代理对象来间接访问一 个对象,这就是代理模式的模式动机. 模式定义 代理模式(Proxy P

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

设计模式之代理模式(Proxy)

1.初识代理模式 生活中大家一定遇到这样的情况了:比如说我要买一条毛巾,不妨就是洁丽雅的吧,那一般人的话我应该不是去洁丽雅的工厂里面直接去买吧,而是我们在洁丽雅专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理.这其实和我们OO中的代理模式是很相似的. 一个it人士,上网应该是经常的事了吧,那么总会有这样的情况,打开一个网页,文字先出现,而那些比较大的资源,例如图片要等等才会显示出来,这是为什么呢??实际上这其中采用的就是代理模式. 2.代理模式的一个简单的例子 就说上面的毛

从java 反射看延迟加载(代理模式)(二)

代理模式 代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问.现实世界的代理人被授权执行当事人的一些事宜,无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信.而事实上代理人是要有当事人的授权,并且在核心问题上还需要请示当事人. 在软件设计中,使用代理模式的意图也很多,比如因为安全原因需要屏蔽客户端直接访问真实对象,或者在远程调用中需要使用代理类处理远程方法调用的技术细节 (如 RMI),也可能为了提升系统性能,对真实对象进行封装,从而达到延迟加载的目的. 代理模式