1、数据库连接池
1.概念
其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
2.好处
- 节约资源
- 用户访问高效
3.实现
- 标准接口:DataSource(数据源/连接池)-- javax.sql包下
- 方法:
- getConnection() 获取链接
- ==Connection.close()==归还链接,注意,不是关闭链接
4.介绍
- c3p0数据库连接池技术
- Druid数据库连接池技术
- SpringJDBC数据库连接池技术
2、C3P0连接池技术
1.与 Druid相比的
- 优点:资源文件自动读取
- 缺点:资源文件名固定
2.步骤
- 导入开发jar包,注意不要忽略了驱动包
- c3p0-0.9.5.2.jar
- mchange-commons-java-0.2.12.jar
- mysql-connector-java-5.1.37-bin.jar
- 创建和编写配置文件
- c3p0-config.xml
- 注意:文件名称不能改变,当加载驱动时会自动寻找这个名称的配置文件后缀名只能是xml或者properties。
- 位置:直接放在src目录下
- 获取连接池对象
- new出来的,new ComboPooledDataSource()
- 编写sql语句
- 获取执行sql语句对象
- executeQuery()
- executeUpdate()
- 执行sql语句,返回结果集
- 处理结果集 ResultSet
- 关闭资源
3.演示
-
创建和编写配置文件
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">10</property> <property name="checkoutTimeout">3000</property> </default-config> </c3p0-config>
-
demo1(数据库自己事先写好)
/* * 数据库连接池 * 利用连接池获取表中的信息 */ public class demo1 { public static void main(String[] args) throws SQLException { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs; // 1. 导入jar包(两个),不要忘记导入驱动包 // 2.写配置文件 // 3.获取连接池对象 DataSource ds = new ComboPooledDataSource(); conn = ds.getConnection(); // 4.编写sql语句 String sql = "select * from account"; // 5.获取sql语句执行对象 pstmt = conn.prepareStatement(sql); // 6.执行sql语句 rs = pstmt.executeQuery(); // 7.处理结果 while(rs.next()){ int id = rs.getInt(1); String name = rs.getString("name"); System.out.println(id + "---" + name); } // 8.释放资源(将链接放回连接线池) rs.close(); pstmt.close(); conn.close(); } }
输出结果
3、Druid连接池技术
1.概述
- 由阿里巴巴提供,号称世界上最好用的数据库连接池之一
2.步骤
-
导入开发jar包,注意不要忽略了驱动包
- mysql-connector-java-5.1.37-bin.jar
- druid-1.0.9.jar
-
创建和编写配置文件
- 配置文件名称可以自定义,后缀名为properties
-
加载配置文件
Properties pro = new Properties(); InputStream is = demo1.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is);
-
获取连接池对象
- 通过工厂来获取 DruidDataSourceFactory
// 获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(pro);
-
获取链接对象
conn = ds.getConnection();
-
编写sql语句
-
获取执行sql语句对象
- conn.prepareStatement(sql);
-
执行sql对象
- executeQuery()
- executeUpdate()
-
处理结果集,返回ResultSet
-
关闭资源
3.演示
-
创建和编写配置文件,druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/db3 username=root password=root initialSize=5 maxActive=10 maxWait=3000
-
demo1(数据库自己事先准备好)
public class demo1 { public static void main(String[] args) throws Exception { PreparedStatement pstmt = null; Connection conn = null; ResultSet rs = null; // 1.导入jar包 // 2.编写配置文件(druid.properties) // 3.加载配置文件 Properties pro = new Properties(); InputStream is = demo1.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); // 4.获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(pro); // 5.获取链接 conn = ds.getConnection(); // 6.编写sql语句 String sql = "select * from account"; // 7.获取sql语句执行对象 pstmt = conn.prepareStatement(sql); // 8.执行sql语句 rs = pstmt.executeQuery(sql); // 9.处理结果 while (rs.next()) { int id = rs.getInt(1); String name = rs.getString("name"); System.out.println(id + "---" + name); } //10.释放资源 if(rs!=null) { rs.close(); } if(pstmt!=null) { rs.close(); } if(conn!=null) { rs.close(); } } }
-
结果
4.打包成工具类
- 自定义工具类
package druid.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtiles {
private static DataSource dataSource = null;
static {
try {
// 加载配置文件
Properties properties = new Properties();
properties.load(JDBCUtiles.class.getClassLoader().getResourceAsStream("druid.properties"));
// 获取数据库连接池对象
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 4.获取链接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
// 5获取连接池对象
public static DataSource getDataSource() {
return dataSource;
}
// 5.释放资源
public static void close(Statement stmt, Connection conn) {
close(null, stmt, conn);
}
// 重载
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
演示工具类的使用
package druid;
import druid.utils.JDBCUtiles;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class demo2 {
public static void main(String[] args) throws SQLException {
Connection connection=null;
PreparedStatement ps=null;
ResultSet resources=null;
//1.获取连接对象
connection = JDBCUtiles.getConnection();
//2.编写sql语句
String sql = "select * from account";
//3.获取执行sq语句对象
ps = connection.prepareStatement(sql);
//4.执行sql语句
resources = ps.executeQuery();
//5.处理结果集
while (resources.next()){
int id = resources.getInt(1);
String name = resources.getString("name");
System.out.println(id + "---" + name);
}
//6.关闭资源
JDBCUtiles.close(resources,ps,connection);
}
}
输出结果