使用包装设计模式实现自己的数据源
2017-11-15 22:15
513 查看
package com.lwh.datasource; import java.io.InputStream; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.LinkedList; import java.util.Properties; import java.util.logging.Logger; import javax.sql.DataSource; public class MyDataSource implements DataSource{ private static String driverClassName; private static String url; private static String user; private static String password; private static LinkedList<Connection> pool = new LinkedList<>(); static{ try{ InputStream is = MyDataSource.class.getClassLoader().getResourceAsStream("db.properties"); Properties props = new Properties(); props.load(is); driverClassName = props.getProperty("driverClassName"); url = props.getProperty("url"); user = props.getProperty("user"); password = props.getProperty("password"); Class.forName(driverClassName); for(int i = 0; i < 10; i++){ Connection conn = DriverManager.getConnection(url, user, password); pool.add(conn); } }catch(Exception e){ e.printStackTrace(); } } @Override public synchronized Connection getConnection() throws SQLException { if(pool.size() > 0){ Connection conn = pool.removeLast(); MyConnection myconn = new MyConnection(conn, pool); return myconn; }else{ throw new RuntimeException("服务器真忙"); } } @Override public PrintWriter getLogWriter() throws SQLException { // TODO Auto-generated method stub return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { // TODO Auto-generated method stub } @Override public void setLoginTimeout(int seconds) throws SQLException { // TODO Auto-generated method stub } @Override public int getLoginTimeout() throws SQLException { // TODO Auto-generated method stub return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { // TODO Auto-generated method stub return null; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { // TODO Auto-generated method stub return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { // TODO Auto-generated method stub return false; } @Override public Connection getConnection(String username, String password) throws SQLException { // TODO Auto-generated method stub return null; } }
package com.lwh.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.LinkedList; import java.util.Map; import java.util.Properties; import java.util.concurrent.Executor; /** 包装设计模式 a、编写一个类实现与被改写类(com.mysql.jdbc.Connection)相同的接口 b、定义一个引用,记住被改写类的实例 c、定义构造方法,传入被改写类的实例 d、对于要改写的方法,改写即可 e、对于不需要改写的方法,调用原有的对象的对应方法 */ //改写com.mysql.jdbc.Connection中的close方法,在调用时,不是关闭连接而是返回池中 public class MyConnection implements Connection { private Connection conn; private LinkedList<Connection> pool; public MyConnection(Connection conn, LinkedList<Connection> pool){ this.conn = conn; this.pool = pool; } @Override public void close() throws SQLException { pool.addFirst(conn); } @Override public <T> T unwrap(Class<T> iface) throws SQLException { // TODO Auto-generated method stub return null; } @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 g b945 etSchema() 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 com.lwh.datasource; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mysql.jdbc.PreparedStatement; public class MyDataSourceClient { private static DataSource ds = new MyDataSource(); public static void main(String[] args) { Connection conn = null; PreparedStatement pst = null; try{ conn = ds.getConnection(); System.out.println(conn); }catch(Exception e){ e.printStackTrace(); }finally{ if(pst != null){ try { pst.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close();//该方法应做到,不要关闭连接,而应该还回池中 } catch (SQLException e) { e.printStackTrace(); } } } } }
相关文章推荐
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 【Android】Android单例模式及使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用JDK动态代理方式实现自己的数据源
- 使用单例模式实现自己的HttpClient工具类
- 设计模式(二):自己动手使用“观察者模式”实现通知机制
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- 使用单例模式实现自己的HttpClient工具类
- Android网络编程专栏--使用单例模式实现自己的HttpClient工具类
- access数据库使用水晶报表(PUSH)推模式实现多数据源含子报表的订单打印
- 使用单例模式实现自己的HttpClient工具类