数据库连接池
- 概述:简单理解,就是一个容器(集合),存放数据库连接对象(Connection)的容器。
- 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
- 举例:餐厅服务员,刚开始有几人,来一个客人一个服务员接待,接待完,重新等候其他客人。
- 好处:
- 节约资源(可以避免用一次数据库就创建一个数据库连接对象)
- 用户访问更高效(用户只需要从池中取出连接对象即可,不用的时候重新放回去池中即可)
- 数据库连接池种类
- C3P0:是一个流行的Java数据库连接池库,用于管理数据库连接。它提供了许多功能,包括连接池的管理、连接的缓存和重用、连接的超时和故障处理等
- Druid:是一个开源的Java数据库连接池和监控库,由阿里巴巴开发和维护。它提供了高性能、高可靠性和强大的监控功能,被广泛应用于Java应用程序中
C3P0
-
使用步骤(使用到的jar包都在文末)
- 导入jar包 (两个) c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar (不要忘记导入数据库驱动jar包)
- 定义配置文件
- 名称:c3p0.properties 或者 c3p0-config.xml
- 路径:将文件放在src目录下即可
- 创建数据库连接池对象(ComboPooledDataSource)
- 获取连接(getConnection)
- 归还连接(close)
-
代码示例
- 配置文件 c3p0.properties(这里使用自己的用户和密码)
url = jdbc:mysql://localhost:3306/test username = root password = root
- Java 代码
import com.mchange.v2.c3p0.ComboPooledDataSource; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class C3P0Example { // 创建一个数据库连接池对象 private static ComboPooledDataSource dataSource; // 静态代码块 static{ // 加载配置文件到内存中 Properties pro = new Properties(); try { pro.load(C3P0Example.class.getClassLoader().getResourceAsStream("c3p0.properties")); } catch (IOException e) { e.printStackTrace(); } // 配置 c3p0 连接池 dataSource = new ComboPooledDataSource(); dataSource.setJdbcUrl(pro.getProperty("url")); dataSource.setUser(pro.getProperty("username")); dataSource.setPassword(pro.getProperty("password")); } public static Connection getConnection() throws SQLException { // 从连接池获取 数据库连接对象 return dataSource.getConnection(); } public static void main(String[] args) { Connection con = null; try { // 获取数据库连接对象 con = getConnection(); // 定义sql语句 String sql = "SELECT * FROM account WHERE id = ?"; // 获取执行 SQL 对象 PreparedStatement pst = con.prepareStatement(sql); // 填充占位符 pst.setInt(1,2); // 执行 SQL ResultSet rs = pst.executeQuery(); // 输出结果 while(rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); double balance = rs.getDouble(3); System.out.println(id+"--"+name+"--"+balance); } } catch (SQLException e) { e.printStackTrace(); }finally { if(con != null){ try { // 将连接返回给 连接池 con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
Druid
-
使用步骤
- 导入 jar 包 druid-1.0.9.jar
- 定义配置文件 properties
- 加载配置文件,Properties 对象
- 获取数据库连接池对象:通过工厂类来获取 (DruidDataSourceFactory)
- 获取连接(getConnection)
- 关闭连接(close)
-
示例代码
- 配置文件 druid.properties
url = jdbc:mysql://localhost:3306/test username = root password = root
- Java 代码
public class DruidExample { // 创建一个数据库连接池对象 private static DruidDataSource ds; // 静态代码块 static{ try { // 加载配置文件到内存中 Properties pro = new Properties(); InputStream is = DruidExample.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); // 配置 druid 连接池 ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { // 从连接池获取 数据库连接对象 return ds.getConnection(); } public static void main(String[] args) { Connection con = null; try { // 获取数据库连接对象 con = getConnection(); // 定义sql语句 String sql = "SELECT * FROM account WHERE id = ?"; // 获取执行 SQL 对象 PreparedStatement pst = con.prepareStatement(sql); // 填充占位符 pst.setInt(1,2); System.out.println(1); // 执行 SQL ResultSet rs = pst.executeQuery(); // 输出结果 while(rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); double balance = rs.getDouble(3); System.out.println(id+"--"+name+"--"+balance); } } catch (SQLException e) { e.printStackTrace(); }finally { if(con != null){ try { // 将连接返回给 连接池 con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }