为什么要创建连接池
当用户需要访问数据库的时候,需要创建和数据库的连接,使用完毕后需要销毁连接,创建和销毁是需要时间的,为了减少这些时间的消耗,我么可以创建连接池
连接池是什么
连接池是把和数据库的连接提前创建,保存在内存中,当用户需要访问数据库的时候,就从连接池获得连接,使用完毕后就将连接归还连接池,通过这样的方式,减少创建连接和销毁连接的时间消耗
在网上也有一些开源的连接池如:Druid、C3P0,这些连接池可以通过手动配置参数和通过配置文件的方式,很方便的使用连接池
创建连接池工具类
package com.itheima.datasource.dome1;
//自定义连接池
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.DataSource;
import com.itheima.jdbc.utils.JDBCuitel;
public class MyDataSource implements DataSource {
private List<Connection> connList = new ArrayList<Connection>();
// 将一些连接存入到内存中,可以定义一个集合,用于存储连接对象
//创建连接并保存到集合中
public MyDataSource() {
for(int i =1;i<=3;i++) {
connList.add(JDBCuitel.getconnection());
}
}
//定义一个归还连接的方法,将用户使用后的连接返回连接池
public void addBack(Connection conn) {
connList.add(conn);
}
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setLogWriter(PrintWriter arg0) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public void setLoginTimeout(int arg0) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Connection getConnection() throws SQLException {
// TODO Auto-generated method stub
Connection conn = connList.remove(0);
return conn;
}
//获取连接池的方法,通过调用这个方法,将连接池中的连接返回给用户
@Override
public Connection getConnection(String arg0, String arg1) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
创建连接池测试类
package com.itheima.datasource.dome1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
public class MyDataSource_ceshi {
@Test
public void demo1() {
PreparedStatement pstmt=null;
Connection conn=null;
ResultSet rs=null;
MyDataSource lian=null;
try {
lian = new MyDataSource();//new一个连接池
conn=lian.getConnection();//获取连接池中的一个连接
String sql="select * from user";
pstmt=conn.prepareStatement(sql);//预编译
rs=pstmt.executeQuery();//将预编译的SQl语句提交,并且返回数据集
while(rs.next()) {
System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getDouble("money"));
}
}catch(Exception e) {
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(pstmt!=null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null) {
lian.addBack(conn);//将连接归还连接池
}
}
}
}