今天继续学习了connectionPool的概念,就是设置一个list来保存数据库连接对象。
在需要使用连接对象时,从list中获取,如果list为空的情况下,才生成新的connection
下面是具体的代码和配置文件。
当然,数据库连接池比较粗糙,复杂的连接池可以参考使用apache common 项目DBCP。 有时间好好研究下,这个对于网络游戏服务器端是比较重要的技术之一。
第三篇内容将要学习statement, preparedstatment, 进行数据库记录的操作
在需要使用连接对象时,从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, 进行数据库记录的操作