您的位置:首页 > 其它

JDBC之连接池

2010-08-19 17:45 253 查看
在JDBC编程中,如果反复的创建连接,进行数据库的查询,这样会使系统性能大大降低,为了重复利用Connection,所以引入了连接池的

概念,下面看看我的最简单的连接池.V1.0版。

因为我的Connection不能被别人随便的new,所以采用了单利模式。

package viekie.du.jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

public class ConnectionPool {

private static final String url = "jdbc:mysql://localhost:3306/jdbc";

private static final String user = "root";

private static final String password = "duchaolihaixu";

public static final int MAX_CONNECTION_NUMBER = 5;

public static final int EMPTY_POOL = -100;

private static int connectionNumbers = 0;

private static ConnectionPool instance = null;

private LinkedList<Connection> listPool = new LinkedList<Connection>();

private ConnectionPool() throws Exception{

for(int i=0; i<5; i++){

this.listPool.addFirst(this.createConnection());

connectionNumbers ++;

}

}

public static ConnectionPool getInstance() throws Exception{

if(null==instance){

synchronized(ConnectionPool.class){

if(null==instance){

instance = new ConnectionPool();

}

}

}

return instance;

}

public Connection getConnection() throws SQLException{

if(this.listPool!=null && this.listPool.size()>0){

connectionNumbers --;

return listPool.removeFirst();

}else{

throw new SQLException("the connection is empty or null");

}

}

private Connection createConnection() throws Exception{

Class.forName("com.mysql.jdbc.Driver");

DatabaseConnection conn = new DatabaseConnection(DriverManager.getConnection(url, user, password),this);

return conn;

}

public int getSize(){

if(connectionNumbers>=0){

return connectionNumbers;

}

return EMPTY_POOL;

}

public void setSize(int size){

connectionNumbers = size;

}

public void add(Connection conn) {

this.listPool.addLast(conn);

}

}

在来看看我的Connection的包装。

package viekie.du.jdbc;

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 DatabaseConnection implements Connection {

private Connection conn = null;

private ConnectionPool connPool= null;

public DatabaseConnection(Connection conn, ConnectionPool pool){

this.conn = conn;

this.connPool = pool;

}

@Override

public <T> T unwrap(Class<T> iface) throws SQLException {

return null;

}

@Override

public boolean isWrapperFor(Class<?> iface) throws SQLException {

return false;

}

@Override

public Statement createStatement() throws SQLException {

return null;

}

@Override

public PreparedStatement prepareStatement(String sql) throws SQLException {

return null;

}

@Override

public CallableStatement prepareCall(String sql) throws SQLException {

return null;

}

@Override

public String nativeSQL(String sql) throws SQLException {

return null;

}

@Override

public void setAutoCommit(boolean autoCommit) throws SQLException {

}

@Override

public boolean getAutoCommit() throws SQLException {

return false;

}

@Override

public void commit() throws SQLException {

}

@Override

public void rollback() throws SQLException {

}

@Override

public void close() throws SQLException {

if(null!=this){

int size = this.connPool.getSize();

if(size<ConnectionPool.MAX_CONNECTION_NUMBER){

this.connPool.add(this);

this.connPool.setSize(size++);

}else{

conn.close();

}

}

}

@Override

public boolean isClosed() throws SQLException {

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 {

}

@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 {

return null;

}

@Override

public Savepoint setSavepoint(String name) throws SQLException {

return null;

}

@Override

public void rollback(Savepoint savepoint) throws SQLException {

}

@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 {

return null;

}

@Override

public Clob createClob() throws SQLException {

return null;

}

@Override

public Blob createBlob() throws SQLException {

return null;

}

@Override

public NClob createNClob() throws SQLException {

return null;

}

@Override

public SQLXML createSQLXML() throws SQLException {

return null;

}

@Override

public boolean isValid(int timeout) throws SQLException {

return false;

}

@Override

public void setClientInfo(String name, String value)

throws SQLClientInfoException {

}

@Override

public void setClientInfo(Properties properties)

throws SQLClientInfoException {

}

@Override

public String getClientInfo(String name) throws SQLException {

return null;

}

@Override

public Properties getClientInfo() throws SQLException {

return null;

}

@Override

public Array createArrayOf(String typeName, Object[] elements)

throws SQLException {

return null;

}

@Override

public Struct createStruct(String typeName, Object[] attributes)

throws SQLException {

return null;

}

}

我的Connection对MySQL的Connection进行了包装,采用了代理模式,这样在connection的close调用的时候,就可以被我自定的

connection所捕获,然后,根据连接池的状态,重新把connection放入到连接池中或者关闭。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: