1、数据库连接池
(1)现象:
多线程数据库访问中 ,随着线程结束数据库连接销毁,线程被释放。
每个线程都需要建立数据库连接,耗时,用户响应时间很慢。
(2)数据库连接池
1)连接复用
多线程共用后端物理连接,实现连接复用。
连接池管理物理连接,每个线程租借连接,用完后归还。
2)限流连接
为限制并发访问连接数,数据库服务器端设置最大并发连接数,若超过最大连接数抛 too many connections exception。
一般,在客户端Java程序中实现业务线程排队获取数据库连接限制同时获取数据库连接数,限流来保护后端数据库。
(3)概念
java jar包,介于java应用程序和jdbc物理连接之间,负责帮Java程序管理jdbc连接。
通过连接池暴露的接口,java程序可以获取数据库连接,使用完毕后归还给连接池。
连接池对JDBC连接有效管理,当连接数不足时自动创建连接,空闲连接较多时自动销毁连接,
多线程同时获取连接时提供排队等待保证应用程序有序获得连接。
(4)连接池组件
commons-dbcp.jar、commons-pool.jar、commons-logging.jar
package com.jdbc.pool;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.apache.commons.dbcp2.BasicDataSource;
public class DBPoolTest {
private static BasicDataSource ds = null;
private static String DB_DRIVER="com.mysql.jdbc.Driver";
private static String DB_URL="jdbc:mysql://192.168.198.128:3306/cloud_study";
private static String USER="root";
private static String PASS="123456";
public static void initDbPool() {
//1、创建连接池对象
ds=new BasicDataSource();
ds.setDriverClassName(DB_DRIVER);
ds.setUrl(DB_URL);
ds.setUsername(USER);
ds.setPassword(PASS);
}
public void DbPoolTest() {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//2、获取连接
conn=ds.getConnection();
String sql="select * from user";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//3、释放连接, .close(): dbcp中归还连接给连接池
if(conn!=null)
conn.close();
if(ps!=null)
ps.close();
if(rs!=null)
rs.close();
} catch (Exception e2) {
}
}