jdbc学习(二): 创建数据库连接池

今天继续学习了connectionPool的概念,就是设置一个list来保存数据库连接对象。
在需要使用连接对象时,从list中获取,如果list为空的情况下,才生成新的connection

下面是具体的代码和配置文件。

/**
 * 
 */
package db;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * @author sean
 * 
 * 1. 初始化jdbcPool对象,将jdcb2. properties文件名传入
 * 2. 通过jdbcPool获得连接
 * 3. 关闭jbdcPool的连接池
 * 4. 再次获得一个connection对象
 * 5. 比较两个对象的差别,结果为true
 * 也就是证明使用的是同一个对象,而不是新生成的connection对象
 *
 */
public class JdbcPoolDemo {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @throws SQLException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException, SQLException {
		// TODO Auto-generated method stub
		
		DBSource dbSource = new JdbcPool("jdbc2.properties");
		Connection conn1 = dbSource.getConnect();
		
		dbSource.closeConnection(conn1);
		
		Connection conn2 = dbSource.getConnect();
		
		//打印结果为true, 说明是从连接队列中取出的连接对象,而不是新的连接
		System.out.println(conn1 == conn2);
		
	}

}




/**
 * 
 */
package db;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Properties;

import sun.security.krb5.internal.p;

/**
 * @author sean
 * 
 * 1. 构造函数,设置jdbc配置文件
 * 2. 初始化,赋值,关键是其中的poolSize
 * 3. 
 *
 */
public class JdbcPool implements DBSource {

	private Properties props;
	private String driver;
	private String password;
	private String username;
	private String url;
	private int poolSize;								//连接池最大的容量
	private ArrayList<Connection> connections;			//连接池容器

	public JdbcPool() throws FileNotFoundException, IOException{
		this("jdbc.properties");
	}
	

	/**
	 * jdbcPool的构造函数
	 * 加载配置文件
	 * 按照key, value读取相应的信息,特别是poolSize
	 * @param configFilename
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public JdbcPool(String configFilename) throws FileNotFoundException, IOException {
		// TODO Auto-generated constructor stub
		props = new Properties();
		props.load(new FileInputStream(configFilename));
		
		url = props.getProperty("net.tuolian.url");
		username = props.getProperty("net.tuolian.username");
		password = props.getProperty("net.tuolian.password");
		driver = props.getProperty("net.tuolian.Driver");
		
		//读取连接池的最大个数
		poolSize = Integer.parseInt(props.getProperty("net.tuolian.poolSize"));
		
		//加载数据库驱动程序
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//初始化connection的容器列表
		connections = new ArrayList<Connection>();
	}


	/**
	 * 关闭连接池
	 * 如果当前的连接个数达到了队列上限,则关闭该连接
	 * 否则,将该连接放入连接队列中待用
	 * 
	 * 注意需要同步操作
	 * @return 
	 */
	public synchronized void closeConnection(Connection conn) throws SQLException {
		// TODO Auto-generated method stub
		if(connections.size() == poolSize){
			conn.close();
		}
		
		connections.add(conn);
	}

	/**
	 * 获得connection的数据库连接对象
	 * 如果当前连接队列为空,则返回一个新的连接
	 * 否则,从列表中取出最后一个对象
	 * 注意此处需要进行同步设置
	 */
	public synchronized Connection getConnect() throws SQLException {
		// TODO Auto-generated method stub
		if(connections.size() == 0){
			return DriverManager.getConnection(url, username, password);
		}		
		int index = connections.size() - 1;
		return connections.get(index);
	}

}





package db;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * 接口类
 * getConnection()
 * closeConn()
 * @author sean
 *
 */
public interface DBSource {
	public Connection getConnect() throws SQLException;
	public void closeConnection(Connection conn) throws SQLException;

}




net.tuolian.Driver=com.mysql.jdbc.Driver
net.tuolian.url=jdbc:mysql://localhost:3306/demo
net.tuolian.username=root
net.tuolian.password=root
net.tuolian.poolSize=100


当然,数据库连接池比较粗糙,复杂的连接池可以参考使用apache common 项目DBCP。 有时间好好研究下,这个对于网络游戏服务器端是比较重要的技术之一。

第三篇内容将要学习statement, preparedstatment, 进行数据库记录的操作

你可能感兴趣的:(java,sql,mysql,.net,jdbc)