一、数据库连接池
1. 概念:一个容器(集合),存放数据库连接对象的池子。
用户来访问数据库时,从容器中获取连接对象;用户访问结束,将连接对象归还给容器
2. 优点:节约系统资源;高效。
3. 实现
(1)标准接口:DataSource javax.sql包下的
一些常用方法:
获取连接:getConnection()
归还连接:Connection.close()
如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接
(2)一般不会去实现这个接口,而是由数据库厂商实现接口
- C3P0:数据库连接池技术
- Druid:数据库连接池技术,由阿里巴巴提供
4. C3P0:数据库连接池技术
(1)使用步骤
- 导入jar包(导入两个jar包,C3P0包依赖另一个jar包)另外不要忘记导入数据库的驱动jar包
- 定义配置文件(包括数据库名称、用户名、密码等)
- 名称:
c3p0.properties or c3p0-config.xml
C3P0会自动查找这个名字对应的配置文件 - 路径:直接将文件放在src目录下即可
- 创建核心对象:数据库连接池对象
ComboPooledDataSource
- 获取连接:
getConnection()
/*
* C3P0演示
*/
public class C3P0Demo {
public static void main(String[] args) throws SQLException {
// 1.创建数据库连接池对象
Date=aSource ds = new ComboPooledDataSource();
// 2.获取连接对象
Connection conn = ds.getConnection();
// 3.打印连接对象
System.out.println(conn);
}
}
5. Druid:数据库连接池技术,由阿里巴巴提供
(1)使用步骤
- 导入jar包(导入一个jar包即可)另外不要忘记导入数据库的驱动jar包
- 定义配置文件(包括数据库名称、用户名、密码等)
- 特点1:是properties形式的
- 特点2:可以放在任意目录下,叫任意的名称
- 加载配置文件 Properties
- 获取数据库连接池对象:通过工厂类来获取
DruidDataSourceFactory
- 获取连接:
getConnection()
/*
* Druid演示
*/
public class DruidDemo {
public static void main(String[] args) throws SQLException {
// 1.导入jar包
// 2.定义配置文件
// 3.加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoder().getResourceAsStream("druid.properties");
pro.load(is);
// 4.获取数据库连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
// 5.获取连接
Connection conn = ds.getConnection();
// 6.打印连接对象
System.out.println(conn);
}
}
(2)工具类
一般使用时,会定义一个Druid工具类
- 定义一个类:
JDBCUtils
- 提供静态代码块加载配置文件,初始化数据库连接池对象
- 提供方法:
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池方法
/*
* Druid工具类
* 定义JDBCUtils工具类
*/
public class JDBCUtils {
// 1.定义成员变量 DataSource
private static DataSource ds;
static {
try {
// 1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtilds.class.getClassLoader().getResourceAsStream("druid.properties"));
// 2.获取 DataSource
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 stmt, Connection conn) {
return close(null, stmt, conn);
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if(rs != null) {
try {
rs.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close(); // 归还连接
} catch(SQLException e) {
e.printStackTrace();
}
}
}
/*
* 获取连接池方法
*/
public static DataSource getDataSource() {
return ds;
}
}
/*
* 使用Druid工具类
*/
public class DruidDemo {
public static void main(String[] args) {
/*
* 完成添加操作,给account表添加一条记录
*/
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils.getConnection();
// 2.定义sql
String sql = "insert into account values(null, ?, ?)";
// 3.获取pstmt对象
pstmt = conn.preparedStatement(sql);
// 4.给?赋值
pstmt.setString(1, "wanwu");
pstmt.setDouble(2, 3000);
// 5.执行sql
int count = pstmt.executeUpdate();
// 执行成功,打印1
System.out.println(count);
} catch(SQLException e) {
e.printStackTrace();
} finally {
// 6.释放资源
JDBCUtils.close(pstmt, conn);
}
}
}