连接池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
- 连接池3:代理模式重写close方法
- Java代理模式学习---完成一个数据库连接池中的close方法拦截
- socket连接池之MySocket重写close问题
- 同过增强Connection类[重写了close的方法]实现的从连接池取出连接并放回连接的简单的实现流程
- 动态代理实现数据库连接池功能(代理Connection的close方法)
- 【设计模式】代理模式实现连接池
- jdbc 连接池动态代理模式
- 第十三讲 继承、方法重写与super、final关键字、抽象类与接口、Object类、工厂和静态代理模式
- 代理模式----尝试写自己的连接池
- MySQL第七天----Connection连接池、包装模式(装饰模式)与动态代理模式
- cocos2dx 代理模式实现方法
- 动态代理模式+tostring方法
- tcp连接close过程
- 工厂方法模式---重写计算器(C++)
- jdbc------连接池代理
- 数据源的编写(开发中不写)、使用动态代理覆写Connection的close方法
- dispose()与close()的区别 及pooling连接池相关
- 黑马程序员 关闭和释放连接 Close方法与Dispose方法
- Ant之build.xml详解
- 非排序寻找从小到大第3400个数
- 无限与有限的矛盾
- qsort对多维数组和结构体的排序
- Ubuntu 15.04 安装 MongoDB 3.x
- 连接池3:代理模式重写close方法
- 积极向上的佳句(1)
- java收集资料
- <manacher>神族文字
- Java集合工具2--Arrays
- 【CS学习】——UML九种图
- iOS中按钮不响应的解决方法
- 第四周项目(5):猴子选大王
- 学习ThinkPHP3.2.2:video8,判断是否post提交数据