连接池简介
1、连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
作用:避免频繁地创建与消毁,给服务器减压力。
2、数据库的弊端:
1.当用户群体少服务器可以支撑,如果群体比较大万级别服务器直接死机。数据库默认的并发访问50.
2.每一个用完数据库之后直接关闭,不能重复利用太浪费资源。
3、设计连接池:
1.在池子中创建出多个连接供使用。
2.当用户需要操作数据库时直接从池子中获取连接即可。
3.当用户使用完毕之后把连接归还给连接池,可以达到重复使用。
4.可以设定池子的最大容器。比如50个连接,当第51个人访问的时候,需要等待。
5.其它用户释放资源的时候,可以使用。
4、手动实现连接池
importjava.io.IOException;importjava.io.InputStream;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.Properties;public classJDBCTool {private staticConnection conn;private staticString driverName;private staticString username;private staticString url;private staticString password;static{
InputStream is= JDBCTool.class.getClassLoader().getResourceAsStream("qq.properties");
Properties prop= newProperties();try{
prop.load(is);
}catch(IOException e) {
e.printStackTrace();
}
driverName= (String)prop.get("driverClassName");
username= (String)prop.get("username");
url= (String)prop.get("url");
password= (String)prop.get("password");try{
Class.forName(driverName);
}catch(Exception e) {
e.printStackTrace();
}
}public staticConnection getConn() {try{
conn=DriverManager.getConnection(url, username, password);
}catch(SQLException e) {
e.printStackTrace();
}returnconn;
}public static voidclose(Connection conn,PreparedStatement ps,ResultSet rs) {if(conn!=null) {try{
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}if(ps!=null) {try{
ps.close();
}catch(SQLException e) {
e.printStackTrace();
}
}if(rs!=null) {try{
rs.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
手动实现连接池第一步
importjava.sql.Connection;importjava.util.ArrayList;importjava.util.List;public classMyJDBCPool {/*1.定义一个容器 集合
2.初始化连接,并放在池子中。
3.创建一个从容器中获取连接的方法
4.创建一个归还连接的方法。*/
private static List pool = new ArrayList<>();private static int List_size = 3;static{for(int i=0;i
Connection conn=null;
conn=JDBCTool.getConn();
pool.add(conn);
System.out.println("当前存放连接为:"+conn+",当前池子中剩余连接数为:"+pool.size());
}
System.out.println("=====================");
}//取出一个连接 要判断是否为空
public static Connection getConn() throwsNullPointerException{if(pool.isEmpty()) {
System.out.println("请等待");throw new NullPointerException("已经空了,别拿了");
}
Connection conn= pool.remove(0);
System.out.println("当前取出的连接为:"+conn+",当前剩余连接数为:"+pool.size());returnconn;
}//归还连接 要判断是否为真正的连接
public static voidreturnConn(Connection conn) {if(conn==null) {
System.out.println("你玩我?");return;
}
pool.add(conn);
System.out.println("当前存入的连接为:"+conn+",当前剩余连接数为:"+pool.size());
}
}
手动实现连接池第二步
importjava.sql.Connection;public classTest1 {public static voidmain(String[] args) {
Connection conn=MyJDBCPool.getConn();
Connection conn1=MyJDBCPool.getConn();
Connection conn2=MyJDBCPool.getConn();
MyJDBCPool.returnConn(conn2);
MyJDBCPool.returnConn(conn1);
MyJDBCPool.returnConn(conn);
}
}
手动连接池的测试
注:这里涉及到一个properties文件,文件内容是key =value形式存在的,先使用类加载器(或输入流)将文件加载进来,然后使用properties对象处理文件,使用get()方法获取内容。
常用连接池
1、导入连接池的步骤
导包 buildpath
配置文件 properties
加载文件流,使用properties处理文件
使用连接池的API读取prop对象,创建连接池
getConnection获取连接
返回连接的引用
2、dbcp连接池 开源连接池,效率