连接池3:代理模式重写close方法

来源:互联网 发布:新华软件学校 编辑:程序博客网 时间:2024/05/16 09:12

这种代码在实际中很少会使用,因为会有现成的框架来使用。

1,新的数据源

package cn.itcast.jdbc.dataSource;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.LinkedList;public class MyDataSource2 {    private static String url = "jdbc:mysql://localhost:3306/jdbc";    private static String user = "root";    private static String password = "123456";    private static int initCount = 5;    private static int maxCount = 10;    private int currentCount = 0;    public static void main(String[] args) {    }    LinkedList<Connection> connectionPool = new LinkedList<Connection>();    public MyDataSource2() {        try {            for (int i = 0; i < initCount; i++) {                this.connectionPool.addLast(this.createConnection());                this.currentCount++;            }        } catch (SQLException e) {            throw new ExceptionInInitializerError();        }    }    public Connection getConnection() throws SQLException {        synchronized (connectionPool) {            if (this.connectionPool.size() > 0)                return this.connectionPool.removeFirst();            if (this.currentCount < maxCount) {                this.currentCount++;                return this.createConnection();            }            throw new SQLException("已经没有可用连接");        }    }    public void free(Connection conn) {        this.connectionPool.addLast(conn);    }    private Connection createConnection() throws SQLException {        Connection realConn = DriverManager.getConnection(url, user, password);        MyConnection myConnection = new MyConnection(realConn, this);        return myConnection;    }}

2,修改close方法
实现Connection接口

package cn.itcast.jdbc.dataSource;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;public class MyConnection implements Connection {    private Connection realConnection;    private MyDataSource2 dataSource;    MyConnection(java.sql.Connection connection, MyDataSource2 dataSource) {        realConnection = connection;        this.dataSource = dataSource;    }    @Override    public void close() throws SQLException {       //修改close方法,放回连接池而不是关闭连接        this.dataSource.connectionPool.addLast(this);    }    @Override    public <T> T unwrap(Class<T> iface) throws SQLException {        return this.realConnection.unwrap(iface); // 后面的做法相同,都交给realConnection去做    }    @Override    public boolean isWrapperFor(Class<?> iface) throws SQLException {        // TODO Auto-generated method stub        return false;    }    @Override    public Statement createStatement() throws SQLException {        // TODO Auto-generated method stub        return null;    }    @Override    public PreparedStatement prepareStatement(String sql) throws SQLException {        // TODO Auto-generated method stub        return null;    }    @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;    }}

3,修改工具类

package cn.itcast.jdbc;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import cn.itcast.jdbc.dataSource.MyDataSource2;public final class JdbcUtils {    private static MyDataSource2 myDataSource = null;    private JdbcUtils() {    }    static {        try {            Class.forName("com.mysql.jdbc.Driver");            myDataSource = new MyDataSource2();        } catch (Exception e) {            throw new ExceptionInInitializerError(e);        }    }    public static Connection getConnection() throws SQLException {        // return DriverManager.getConnection(url, user, password);        return myDataSource.getConnection(); // 取连接    }    public static void free(ResultSet rs, Statement st, Connection conn) {        try {            if (rs != null)                rs.close();        } catch (SQLException e) {            e.printStackTrace();        } finally {            try {                if (st != null)                    st.close();//现在close方法就是将连接放回连接池,而不是关闭连接            } catch (SQLException e) {                e.printStackTrace();            } finally {                try {                    if (conn != null)                         conn.close();                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }}
0 0
原创粉丝点击