使用JDBC操作数据库,需要建立Connection,使用传统的JDBC操作需要每次创建Connection,创建Connection是一个非常消耗性能和消耗时间的过程,我们需要在提高程序性能,那么就需要减少每次创建创建连接带来的负面影响,解决这个问题我们将利用池子概念,预先创建一些链接放入池子中,如果需要操作数据,不用创建新的Connection,只需要在池子中获取即可,使用完毕放入池子!这样就形成了复用!
下面我们来自定义一个数据库连接池,因为存放数据库连接,所以,我们可以用一个集合去存放这些数据库连接,还应该有获取连接和回收连接的方法。
首先建立一个数据库test,并创建一张学生表:
CREATE TABLE `students` (
`sid` varchar(8) NOT NULL,
`sname` varchar(255) DEFAULT NULL,
`gender` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后建立一个数据库的配置文件:db.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=1234
接着建立一个JDBCUtils,代码如下:
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
public class JDBCUtils {
private static String driverClass;
private static String url;
private static String username;
private static String password;
//静态代码块
static{
try {
//通过反射机制加载配置文件
InputStream is = JDBCUtils.class.getResourceAsStream("/db.properties");
Properties p = new Properties();
p.load(is);
driverClass = p.getProperty("jdbc.driverClass");
url = p.getProperty("jdbc.url");
username = p.getProperty("jdbc.username");
password = p.getProperty("jdbc.password");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection openConnection() {
try {
Class.forName(driverClass);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
接下来就是自定义数据库连接池:
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
/**
* 数据库连接池
* @author littledyf
*
*/
public class DataSourcePool {
//1.创建集合存放数据库连接
private static LinkedList<Connection> list = new LinkedList<Connection>();
//2.初始化数据库连接池
static{
for (int i = 0; i < 10; i++) {
Connection conn = JDBCUtils.openConnection();
list.add(conn);
}
}
//3.从数据库连接池中获取一个对象
public static Connection getConnection(){
if(list.isEmpty()){
Connection conn = JDBCUtils.openConnection();
list.add(conn);
}
Connection conn = list.removeFirst();
return conn;
}
//4.使用完连接对象后,要把连接对象归还到连接池中
public static void addBack(Connection conn){
if(list.size() > 10){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
list.add(conn);
}
}
//5.获取连接池中空闲连接的数量
public static int getCount(){
return list.size();
}
}
测试:
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DataPoolTest {
@Test
public void t() throws SQLException {
Connection conn = DataSourcePool.getConnection();
PreparedStatement ps = conn.prepareStatement("select * from students");
ResultSet rs = ps.executeQuery();
while(rs.next()){
String sname = rs.getString("sname");
System.out.println(sname);
}
System.out.println(DataSourcePool.getCount());
//回收
DataSourcePool.addBack(conn);
System.out.println(DataSourcePool.getCount());
}
}