连接池介绍
概念:
连接池其实就是一个容器,存放数据库连接的容器。当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户访问数据库时,会从容器中获取连接对象,用户访问完后,再将这些连接对象归还给容器。
优点:
1.节约系统的资源
2.用户访问高效
连接池实现
1.标准的接口:DataSource再Javax.sql包下的
*接口中的方法
获取方法:Connection getConnection()
*归还连接:如果连接对象从连接池中获取的,那么调用Connection.close()方法不再是关闭连接吗,而是归还连接
2.一般我们不去实现它,由数据库厂商实现,下面是常用的连接池技术
1.C3P0:连接池技术
2.Druid:数据库连接池实现技术,由阿里巴巴提供(目前最好的)
C3P0:数据库连接池技术
步骤
1.导入c3p0-0.9.5.2.jar,和其依赖jar包 mchange-commons-java-0.2.12.jar。不要忘记导入数据库的驱动jar包JDBC
2.定义配置文件
*名称:必须是c3p0.properties 或者 c3p0-config.xml
*路径:直接将文件放在src目录下即可
c3p0的配置文件可以进行多个数据库信息的配置,如下代码,可以设置c3p0默认配置,也可以设置自定义配置。
<?xml version="1.0" encoding="utf-8"?>
<!-- 使用默认配置连接池对象 -->
<c3p0-config>
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/data01</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接参数 -->
<!-- initialPoolSize:初始化申请的连接数量。maxPoolSize:最大的连接对象。checkoutTimeout:超时时间。3000ms=3s -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">3000</property>
</default-config>
<!-- 自己连接设定 -->
<named-config name="MySetting">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/data01</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接参数 -->
<!-- initialPoolSize:初始化申请的连接数量。maxPoolSize:最大的连接对象。checkoutTimeout:超时时间。3000ms=3s -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
3.创建核心对象 数据库连接池对象 ComboPooledDataSource()没传参数使用的是默认配置
4.获取链接:getConnection
c3p0的使用实例
package com.learning.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/*
c3p0的演示
*/
public class demo02c3p0try {
public static void main(String[] args) throws SQLException {
//1.创建数据库连接池对象,ComboPooledDataSource()没传参数使用的是默认配置
DataSource ds=new ComboPooledDataSource();
//使用自定义连接配置
//ds=new ComboPooledDataSource("MySetting");
//2.获取对象
Connection conn=ds.getConnection();
//3.打印
System.out.println(conn);
conn.close();
}
}
Druid:数据库连接池实现技术
步骤
1.导入jar包druid-1.0.9.jar
2.配置文件
*properties文件类型
*可以叫任意的名称,可以放在任意目录下
3.加载配置文件,使用Properties进行加载
Properties pro=new Properties();
InputStream in =demo01druidtry.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(in);
4.获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
DataSource ds=DruidDataSourceFactory.createDataSource(pro);
5.获取连接:Connection getConnection()
实现示例如下
package com.learning.Durid;
import com.alibaba.druid.pool.DruidAbstractDataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
/*
Druid的演示
*/
public class demo01druidtry {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro=new Properties();
InputStream in =demo01druidtry.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(in);
//4.获取连接池对象
DataSource ds=DruidDataSourceFactory.createDataSource(pro);
Connection conn=ds.getConnection();
System.out.println(conn);
}
}
关于druid的使用,我们还可以通过创建工具类来简化操作,其步骤如下:
1.定义一个类JDBCUtils
2提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
(1).获取链接的方法:通过数据库连接池获取连接
(2).释放资源
(3).获取连接池的方法
根据上述步骤我们创建了一个工具类,代码如下:
package com.learning.JDBCUtils;
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;
import java.util.stream.IntStream;
/*
Druid连接池的工具类
*/
public class jdbcUtil {
//1.定义成员变量
private static DataSource ds;
static {
Properties pro=new Properties();
try {
//加载配置配置文件
pro.load(jdbcUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
//获取连接池对象
ds= 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 close(Statement statement,Connection connection){
//释放statement
if(statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//归还Connection
if(connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//重载close
public static void close(ResultSet resultSet, Statement statement, Connection connection){
//释放ResultSet
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
close(statement,connection);
}
//获取连接池的方法
public static DataSource getDataSource(){
return ds;
}
}
我们创建一个实例对工具类进行使用:
package com.learning.Durid.demo02;
import com.learning.JDBCUtils.jdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/*
使用自建工具类完成添加操作
*/
public class druidUtil {
public static void main(String[] args) {
PreparedStatement stat=null;
Connection conn=null;
try {
//1.获取连接对象
conn= jdbcUtil.getconnection();
//2.定义sql语句
String sql ="insert into account (name,money) values (?,?) ";
stat=conn.prepareStatement(sql);
stat.setString(1,"wang");
stat.setDouble(2,50000);
int count =stat.executeUpdate();
if(count>0){
System.out.println("添加成功!");
}else{
System.out.println("添加失败");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
jdbcUtil.close(stat,conn);
}
}
}