数据库连接池

package ruyi.core.conn;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;
import java.util.concurrent.Executors;

import ruyi.core.app.ApplicationContext;
import ruyi.core.thread.CommonThread;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ConnectionPool {
	
	private static ConnectionPool inst;
	
	private Vector<Connection> connPool;
	private Vector<Connection> connFullPool;
	protected final Log log = LogFactory.getLog(this.getClass());
	
	private ApplicationContext applicationContext;
	private String driver;
	private String urlStr;
	private String userName;
	private String userPWD;
	private int count=0;
   
	public int poolType=TYPE_MYSQL;
	public static final int TYPE_MYSQL=1;
	public static final int TYPE_SQLSERVER=2;
	
    Character start='`';
    Character stop='`';
	
	private ConnectionPool(){
		try {
			connPool= new Vector<Connection>();
			connFullPool=new Vector<Connection>();
			applicationContext = ApplicationContext.getInstance();
			driver = applicationContext.getProperty("core.database.driverClassName");
			Class.forName(driver);
			if(driver.contains("sqlserver")){
				poolType=TYPE_SQLSERVER;
				start='[';
				stop=']';
			}
			urlStr = applicationContext.getProperty("core.database.url");
			userName = applicationContext.getProperty("core.database.user"); 
			userPWD = applicationContext.getProperty("core.database.password");
		} catch (Exception e) {
			log.info("database connection failed.",e);
		}
	}
	
	public ConnectionPool(String driver, String urlStr, String userName, String userPWD){
		try {
			connPool= new Vector<Connection>();
			connFullPool=new Vector<Connection>();
			applicationContext = ApplicationContext.getInstance();
			this.driver = driver;
			Class.forName(driver);
			if(driver.contains("sqlserver")){
				poolType=TYPE_SQLSERVER;
				start='[';
				stop=']';
			}
			this.urlStr = urlStr;
			this.userName = userName; 
			this.userPWD = userPWD;
		} catch (Exception e) {
			log.info("Database connection failed.",e);
		}
	}
	
	public static ConnectionPool getInstance(){
		if (inst==null){
			inst=new ConnectionPool();
		}
		return inst;
	}
	
	public DBManager getDBConnection() throws ClassNotFoundException, SQLException{
		return new DBManager(this);
	}
	
	public int getSize(){
		return connPool.size();
	}
	
	private synchronized Connection connect(boolean debug){
		try {
			if(debug)
				log.debug("Connect to DB,urlStr:"+urlStr+"userName:"+userName+"userPWD:"+userPWD);
			Connection con = DriverManager.getConnection(urlStr, userName,userPWD);
			con.setAutoCommit(true);
			//con.setNetworkTimeout(Executors.newFixedThreadPool(1), 3000);
			return con;
		} catch (SQLException e) {
			log.error("Not able to connect the DB and redo the connection.urlStr:"+urlStr+"userName:"+userName+"userPWD:"+userPWD,e);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e1) {}
			return connect(debug);
		}
	}
	
	public boolean isClosed(Connection result){
		try {
			if(result==null){
				
			}else if(result.isClosed()){ 
				connFullPool.remove(result);
				result=null;
			}else{
				PreparedStatement pst=result.prepareStatement("select 1 from dual");
				pst.execute();
				pst.getResultSet().close();
				pst.close();
			}
		} catch (SQLException e) {
			connFullPool.remove(result);
			result=null;
		}
		return result==null;
	}
	public Connection getConnection(boolean debug){
		Connection result=null;
		while(true){
			synchronized(connPool){
				if(connPool.size()<=0||result!=null)
					break;
				result=connPool.remove(0);
			}
			if(isClosed(result))
				result=null;
		} 
		if(result==null){
			result=connect(debug);
			connFullPool.add(result);
		}
		count++;
		if(debug)
			log.debug("Get connection. The pool size is "+connFullPool.size()+", and the free connections is "+connPool.size()+", and the count is:"+count);	
		return result;
	}
	
	public void putConnection(DBManager dbManager){
		if(dbManager!=null&&dbManager.getConn()!=null){
			connPool.add(dbManager.getConn());
			if(dbManager.isDebug())
				log.debug("Disconnected. The pool size is "+connFullPool.size()+", and the free connections is "+connPool.size());
		}
	}
	public void putConnection(Connection conn){
		connPool.add(conn);
	}
	public int getPoolType() {
		return poolType;
	}

	public void setPoolType(int poolType) {
		this.poolType = poolType;
	}
	
//	public static void main(String[] args) throws Exception
//	{
//		/*--------------------------------------------------
//		 * String name ;
//        DBManager db = new DBManager();                           //测试从sqlserver是否连通
//        ResultSet rs = db.sendQuery("select * from platform.platform.test");
//        ArrayList<String> list = new ArrayList<String>();
//         while(rs.next()){
//    	   name= rs.getString("name");  
//    	   list.add(name);
//       }
//         System.out.println("list size"+ list.size());*/
//		
//	   /*	-------------------------------------------------------
//	    * DBManager db = new DBManager();                        //测试sqlserver返回插入id
//		int res =db.sendInsert("INSERT INTO platform.platform.test VALUES('songwei12');");
//		System.out.println("get return id is "+res);*/
//		
//		
//	   /*---------------------------------
//		* ArrayList<String> list = new ArrayList<String>();      //测试mysql是否连通
//		DBManager db = new DBManager();  
//		ResultSet rs = db.sendQuery("select * from demo");
//		while(rs.next()){
//		list.add(rs.getString("name"));
//		}
//		System.out.println("get data size from mysql :"+list.size());*/
//	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值