mysql常用的数据库连接池及用法
一.什么是数据连接池
1.什么是连接池 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们 采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交 给了连接池.
2.连接池的好处 用池来管理Connection,这样可以重复使用Connection。 当使用完Connection后,调用Connection的 close()方法也不会真的关闭Connection,而是把Connection“归还”给池。
二.常见的数据库连接池有哪些?
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。 这样应用程序可以方便的切换不同厂商的连接池! 常见的连接池有 DBCP连接池, C3P0连接池, Druid连接池.
三.DBCP连接池的用法
1.DBCP连接池
DBCP也是一个开源的连接池,是Apache成员之一,在企业开发中也比较常见,tomcat内置的连接池。
- 需要在项目添加文件夹放入jar包,然后再idea添加依赖,就可以使用了。(末尾提供jar包和配置的云盘地址)
2.在src目录下新建utils包,然后编写DBCP帮助类。
package utils;
IMPORT org.apache.commons.dbcp.BasicDataSource;
IMPORT java.sql.Connection; IMPORT java.sql.ResultSet; IMPORT java.sql.SQLException; IMPORT java.sql.Statement;
public class DBCPUtils {
//1.定义常量 保存数据库连接的相关信息 public static final STRING DRIVERNAME = "com.mysql.jdbc.Driver"; //填写自己电脑的 public static final STRING URL = "jdbc:mysql://localhost:3306/test01?characterEncoding=UTF-8"; //填写自己电脑的 public static final STRING USERNAME = "root"; //填写自己电脑的 public static final STRING PASSWORD = "123456";
//2.创建连接池对象 (有DBCP提供的实现类) public static BasicDataSource dataSource = NEW BasicDataSource();
//3.使用静态代码块进行配置 static{ dataSource.setDriverClassName(DRIVERNAME); dataSource.setUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setMaxActive(20); }
//4.获取连接的方法 public static CONNECTION getConnection() throws SQLEXCEPTION {
//从连接池中获取连接 CONNECTION CONNECTION = dataSource.getConnection(); RETURN CONNECTION; }
//5.释放资源方法 public static void CLOSE(CONNECTION con, Statement statement){
IF(con != NULL && statement != NULL){ try { statement.close(); //归还连接 con.close(); } catch (SQLEXCEPTION e) { e.printStackTrace(); } }
}
public static void CLOSE(CONNECTION con, Statement statement, ResultSet resultSet){
IF(con != NULL && statement != NULL && resultSet != NULL){ try { resultSet.close(); statement.close(); //归还连接 con.close(); } catch (SQLEXCEPTION e) { e.printStackTrace(); } }
}
}
|
3.在src 新建一个test包,之后在包下,新建一个TestDBCP类。
package test; import utils.DBCPUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
public class TestDBCP {
/* * 测试DBCP连接池 * */ public static void main(String[] args) throws SQLException {
//1.从DBCP连接池中拿到连接 Connection con = DBCPUtils.getConnection();
//2.获取Statement对象 Statement statement = con.createStatement();
//3.查询所有员工的姓名 String sql = "select ename from employee"; ResultSet resultSet = statement.executeQuery(sql);
//4.处理结果集 while(resultSet.next()){ String ename = resultSet.getString("ename"); System.out.println("员工姓名: " + ename); }
//5.释放资源 DBCPUtils.close(con,statement,resultSet); }
}
|
四.C3P0连接池用法
- C3P0是一个开源的JDBC连接池,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、 Spring等。
2.需要在项目需要添加配置文件。然后在添加jar包,添加完jar包,为jar包添加依赖,就可以使用了。(末尾提供jar包和配置的云盘地址)
3.在src目录下新建utils包,然后编写C3P0帮助类。
package utils; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class C3P0Utils {
//1.创建连接池对象 C3P0对DataSource接口的实现类 //使用的配置是 配置文件中的默认配置 //public static ComboPooledDataSource dataSource = new ComboPooledDataSource(); //使用指定的配置 public static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql"); //获取连接的方法 public static Connection getConnection() throws SQLException {
return dataSource.getConnection(); } //释放资源 public static void close(Connection con, Statement statement){ if(con != null && statement != null){ try { statement.close(); //归还连接 con.close(); } catch (SQLException e) { e.printStackTrace(); } }
} public static void close(Connection con, Statement statement, ResultSet resultSet){
if(con != null && statement != null && resultSet != null){ try { resultSet.close(); statement.close(); //归还连接 con.close(); } catch (SQLException e) { e.printStackTrace(); } }
} }
|
4.配置文件
<c3p0-config>
<!--默认配置--> <default-config> <!-- initialPoolSize:初始化时获取三个连接, 取值应在minPoolSize与maxPoolSize之间。 --> <property name="initialPoolSize">3</property>
<!-- maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。--> <property name="maxIdleTime">60</property>
<!-- maxPoolSize:连接池中保留的最大连接数 --> <property name="maxPoolSize">100</property> <!-- minPoolSize: 连接池中保留的最小连接数 --> <property name="minPoolSize">10</property>
</default-config>
<!--配置连接池mysql可填写自己电脑对应的-->
<named-config name="mysql"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test01?characterEncoding=UTF-8</property> <property name="user">root</property> <property name="password">123456</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </named-config> <!--配置连接池2,可以配置多个-->
</c3p0-config> |
5.在src 新建一个test包,之后在包下,新建一个TestD3P0类。
package test; import utils.C3P0Utils; import java.sql.*; public class TestC3P0 {
//需求 查询姓名为李白的 记录 public static void main(String[] args) throws SQLException {
//1.获取连接 Connection con = C3P0Utils.getConnection();
//2.获取预处理对象 String sql = "select * from employee where ename = ?"; PreparedStatement ps = con.prepareStatement(sql);
//3.设置占位符的值 ps.setString(1,"李白"); ResultSet resultSet = ps.executeQuery();
//4.处理结果集 while(resultSet.next()){ int eid = resultSet.getInt("eid"); String ename = resultSet.getString("ename"); int age = resultSet.getInt("age"); String sex = resultSet.getString("sex"); double salary = resultSet.getDouble("salary"); Date date = resultSet.getDate("empdate");
System.out.println(eid +" " + ename + " " + age +" " + sex +" " + salary +" " +date); }
//5.释放资源 C3P0Utils.close(con,ps,resultSet); }
}
|
五.Druid连接池
- Druid(德鲁伊)是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功 能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。
- 导入jar包和配置文件(末尾提供jar包和配置的云盘地址)
3.配置文件,可以根据自己电脑,进行配置.
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/test01?characterEncoding=UTF-8 username=root password=123456 initialSize=5 maxActive=10 maxWait=3000 |
4.在src目录下新建utils包,然后编写C3P0帮助类。
package utils; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class C3P0Utils {
//1.创建连接池对象 C3P0对DataSource接口的实现类 //使用的配置是 配置文件中的默认配置 //public static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//使用指定的配置 public static ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
//获取连接的方法 public static Connection getConnection() throws SQLException {
return dataSource.getConnection(); }
//释放资源 public static void close(Connection con, Statement statement){
if(con != null && statement != null){ try { statement.close(); //归还连接 con.close(); } catch (SQLException e) { e.printStackTrace(); } }
}
public static void close(Connection con, Statement statement, ResultSet resultSet){
if(con != null && statement != null && resultSet != null){ try { resultSet.close(); statement.close(); //归还连接 con.close(); } catch (SQLException e) { e.printStackTrace(); } }
} }
|
5.在src 新建一个test包,之后在包下,新建一个TestDruid类。
package test; import com.lagou.utils.DruidUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
public class TestDruid {
// 需求 查询 薪资在3000 到 5000之间的员工的姓名 public static void main(String[] args) throws SQLException {
//1.获取连接 Connection con = DruidUtils.getConnection();
//2.获取Statement对象 Statement statement = con.createStatement();
//3.执行查询 ResultSet resultSet = statement.executeQuery("select ename from employee where salary between 3000 and 5000");
//4.处理结果集 while(resultSet.next()){ String ename = resultSet.getString("ename"); System.out.println(ename); }
//5.释放资源 DruidUtils.close(con,statement,resultSet); }
}
|
本项目需要的jar包和配置文件
云盘地址:https://pan.baidu.com/s/1JIIMrfIn1W4ER2wtZuE0EA
提取码:hhxy
注释:搞不定的可与博主交流