连接池工具类
public class MyDBPool{ //独占锁 private static ReentrantLock lock = new ReentrantLock(); //定义连接池中连接对象的存储容器【线程安全】 private static List<MyConnection> list = Collections.synchronizedList(new ArrayList<>()); //定义数据库连接属性 private final static String DRIVER_CLASS = "jdbc.driver_class"; private final static String URL = "jdbc.url"; private final static String USERNAME = "jdbc.username"; private final static String PASSWORD = "jdbc.password"; //定义默认连接池属性配置 private final static int initSize = 2; private final static int maxSize = 4; private final static int stepSize = 1; private final static int timeout = 2000; //初始化连接池 static{ try { //加载驱动 Driver driver = (Driver) Class.forName(DRIVER_CLASS).newInstance(); //使用DriverManager注册驱动 DriverManager.registerDriver(driver); //初始化连接 createConnection(initSize); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() { MyConnection poolConnection = null; try{ lock.lock(); //连接池对象为空时,初始化连接对象 if(list.size() == 0){ createConnection(initSize); } //获取可用连接对象 poolConnection = getAvailableConnection(); //没有可用连接对象时,等待连接对象的释放或者创建新的连接对象使用 while(poolConnection == null){ System.out.println("---------------等待连接---------------"); createConnection(stepSize); poolConnection = getAvailableConnection(); if(poolConnection == null){ TimeUnit.MILLISECONDS.sleep(30); } } }catch(Exception e){ e.printStackTrace(); }finally { lock.unlock(); } return poolConnection; } //创建数据库连接 private static void createConnection(int count) throws SQLException{ if(list.size() + count <= maxSize){ for(int i = 0; i < count; i++){ System.out.println("初始化了"+ (i + 1) +"个连接"); Connection connect = DriverManager.getConnection(URL, USERNAME, PASSWORD); MyConnection pool = new MyConnection(connect, true); list.add(pool); } } } //获取可用连接对象 private MyConnection getAvailableConnection() throws SQLException{ for(MyConnection pool : list){ if(pool.isStatus()){ Connection con = pool.getConnect(); //验证连接是否超时 if(!con.isValid(timeout)){ Connection connect = DriverManager.getConnection(URL, USERNAME, PASSWORD); pool.setConnect(connect); } pool.setStatus(false); return pool; } } return null; } }继承Connection 的MyConnection
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; //自行封装的连接对象 public class MyConnection implements Connection{ //驱动返回的连接对象 private Connection connection; //false--繁忙,true--空闲 private boolean status; public MyConnection(Connection connection, boolean status) { this.connection = connection; this.status = status; } public void setConnection(Connection connection) { this.connection = connection; } public Connection getConnection(){ return this.connection; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } @Override public void close() throws SQLException { this.status = true; } //下面是Connection连接对象原有方法 @Override public <T> T unwrap(Class<T> iface) throws SQLException { return conn.unwrap(iface); } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { return conn.isWrapperFor(iface); } @Override public Statement createStatement() throws SQLException { return conn.createStatement(); } @Override public PreparedStatement prepareStatement(String sql) throws SQLException { return conn.prepareStatement(sql); } @Override public CallableStatement prepareCall(String sql) throws SQLException { return conn.prepareCall(sql); } @Override public String nativeSQL(String sql) throws SQLException { return conn.nativeSQL(sql); } @Override public void setAutoCommit(boolean autoCommit) throws SQLException { conn.setAutoCommit(autoCommit); } @Override public boolean getAutoCommit() throws SQLException { return conn.getAutoCommit(); } @Override public void commit() throws SQLException { conn.commit(); } @Override public void rollback() throws SQLException { conn.rollback(); } @Override public boolean isClosed() throws SQLException { return conn.isClosed(); } @Override public DatabaseMetaData getMetaData() throws SQLException { return conn.getMetaData(); } @Override public void setReadOnly(boolean readOnly) throws SQLException { conn.setReadOnly(readOnly); } @Override public boolean isReadOnly() throws SQLException { return conn.isReadOnly(); } @Override public void setCatalog(String catalog) throws SQLException { conn.setCatalog(catalog); } @Override public String getCatalog() throws SQLException { return conn.getCatalog(); } @Override public void setTransactionIsolation(int level) throws SQLException { conn.setTransactionIsolation(level); } @Override public int getTransactionIsolation() throws SQLException { return conn.getTransactionIsolation(); } @Override public SQLWarning getWarnings() throws SQLException { return conn.getWarnings(); } @Override public void clearWarnings() throws SQLException { conn.clearWarnings(); } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { return conn.createStatement(resultSetType, resultSetConcurrency); } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return conn.prepareStatement(sql, resultSetType,resultSetConcurrency); } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return conn.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetConcurrency); } @Override public Map<String, Class<?>> getTypeMap() throws SQLException { return conn.getTypeMap(); } @Override public void setTypeMap(Map<String, Class<?>> map) throws SQLException { conn.setTypeMap(map); } @Override public void setHoldability(int holdability) throws SQLException { conn.setHoldability(holdability); } @Override public int getHoldability() throws SQLException { return conn.getHoldability(); } @Override public Savepoint setSavepoint() throws SQLException { return conn.setSavepoint(); } @Override public Savepoint setSavepoint(String name) throws SQLException { return conn.setSavepoint(name); } @Override public void rollback(Savepoint savepoint) throws SQLException { conn.rollback(savepoint); } @Override public void releaseSavepoint(Savepoint savepoint) throws SQLException { conn.releaseSavepoint(savepoint); } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return conn.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return conn.prepareStatement(sql, resultSetType, resultSetConcurrency,resultSetHoldability); } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return conn.prepareCall( sql, resultSetType, resultSetConcurrency, resultSetHoldability); } @Override public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { return conn.prepareStatement( sql, autoGeneratedKeys); } @Override public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { return conn.prepareStatement( sql, columnIndexes); } @Override public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { return conn.prepareStatement( sql, columnNames); } @Override public Clob createClob() throws SQLException { return conn.createClob(); } @Override public Blob createBlob() throws SQLException { return conn.createBlob(); } @Override public NClob createNClob() throws SQLException { return conn.createNClob(); } @Override public SQLXML createSQLXML() throws SQLException { return conn.createSQLXML(); } @Override public boolean isValid(int timeout) throws SQLException { return conn.isValid(timeout); } @Override public void setClientInfo(String name, String value) throws SQLClientInfoException { conn.setClientInfo(name, value); } @Override public void setClientInfo(Properties properties) throws SQLClientInfoException { conn.setClientInfo(properties); } @Override public String getClientInfo(String name) throws SQLException { return conn.getClientInfo(name); } @Override public Properties getClientInfo() throws SQLException { return conn.getClientInfo(); } @Override public Array createArrayOf(String typeName, Object[] elements) throws SQLException { return conn.createArrayOf(typeName, elements); } @Override public Struct createStruct(String typeName, Object[] attributes) throws SQLException { return conn.createStruct(typeName, attributes); } }