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, 进行数据库记录的操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值