admin管理员组文章数量:1033047
JavaWeb后端入门2—连接池
1.概述
1.1 什么是连接池
创建和管理一个连接的缓冲池的技术。
是装有连接的容器,使用连接的时候可以从连接池中进行获取,使用完成后将连接归还给连接池
1.2 为什么要学习
连接对象创建和销毁是需要好费时间的,在服务器初始化的时候就初始化一些连接。把这些对象连接放入到内存中,使用的时候可以从内存中获取,使用完成后将连接放入到连接池中。将内存中获取和归还的效率要远远高于创建和销毁的效率(提升性能)。
1.3 连接池的原理
2. 自定义连接池
2.1 实现步骤
- 编写类实现Datasource接口
- 重写getConnection方法
- 在内存中初始化多个连接
- 编写归还连接的方法
2.2 实现代码
- 写一个MyDataSource方法
public class MyDataSource implements DataSource {
//将一些连接存入到内存中,可以定义一个集合,用于存储连接对象。
private List<Connection> connList = new ArrayList<Connection>();
//在初始化的时候提供一些连接
public MyDataSource() {
//初始化连接:
for(int i =1 ;i<=3;i++) {
//向集合中存入链接
connList.add(JDBCUtils.getConnection());
}
}
//从连接池中获得链接的方法
@Override
public Connection getConnection() throws SQLException {
Connection conn = connList.remove(0);
return conn;
}
// 编写归还连接的方法
public void addBack(Connection conn) {
connList.add(conn);
}
....}
- 测试代码
package com.itheima.datasource.demo1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
import com.itheima.jdbc.utils.JDBCUtils;
/*
* 自定义连接池的测试类
* */
public class DataSourceDemo1 {
@Test
/* 测试自定义连接池 */
public void demo1() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
MyDataSource dataSource = null;
try {
// 获得连接
// conn = JDBCUtils.getConnection();
// 从连接池中获得连接
dataSource = new MyDataSource();
conn = dataSource.getConnection();
// 编写SQL语句
String sql = "select * from account";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 设置参数
// 执行SQL
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// JDBCUtils.release(rs,pstmt, conn);
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
// 归还连接
dataSource.addBack(conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
}
3. C3P0连接池
3.1 概述
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等
参考文档:/
3.2 使用方法1:手动设置参数
首先引入c3p0-0.9.1.2.jar
代码语言:javascript代码运行次数:0运行复制package com.itheima.datasource.demo2;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;
import org.junit.Test;
import com.itheima.jdbc.utils.JDBCUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/*
* C3P0连接池测试
* */
public class C3P0Demo1 {
@Test
// 手动设置参数的方式
public void demo1() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获得链接:从连接池中获取
// 创建c3p0的连接池
ComboPooledDataSource dateSource = new ComboPooledDataSource();
// 设置连接参数
dateSource.setDriverClass("com.mysql.jdbc.Driver");
dateSource.setJdbcUrl("jdbc:mysql://43.226.152.21:3306/web_test4");
dateSource.setUser("root");
dateSource.setPassword("Qq1991101313");
// 从连接池中获得链接
conn = dateSource.getConnection();
// 编写sql
String sql = "select * from account1";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 执行SQL
rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, pstmt, conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
}
3.3 使用方法2:使用配置文件
- 在src目录下创建c3p0-config.xml文件(点击查看官方示例代码)
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://x.x.x.x:3306/web_test4</property>
<property name="user">root</property>
<property name="password">xxx</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
<!-- This app is massive! -->
<named-config name="oracle">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://x.x.x.x:3306/web_test4</property>
<property name="user">root</property>
<property name="password">xxx</property>
</named-config>
</c3p0-config>
- 代码框架同3.2,这里只重写Demo2
@Test
/*
* 采用配置文件的方式
*/
public void demo2() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 创建C3P0连接池
/*
* 只要创建连接池,就会默认去类路径下查找c3p0-config.xml
*/
ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");
// 从连接池获得链接
conn = dataSource.getConnection();
// 编写SQL
String sql = "select * from account";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 执行SQL
rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, pstmt, conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
4. 改写工具类
连接池对象应该是一个应用只创建一次,不需要每次使用都创建一个新的连接池。
- 提取出
JDBCUtils2.java
不需要之前的注册驱动和获得链接了,直接创建C3P0连接池,给出获得链接的方法。
代码语言:javascript代码运行次数:0运行复制package com.itheima.jdbc.utils;
/*JDBC工具类*/
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils2 {
/**创建一个连接池:只创建一次*/
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
*获得链接的方法
* @throws SQLException
**/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 获得连接池
* */
public static DataSource getDataSource() {
return dataSource;
}
/**
*资源释放的方法
**/
public static void release(Statement stmt,Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
conn = null;
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
rs = null;
}
}
}
- 测试提取出的工具类
@Test
/**
* 使用新的工具类的测试
*/
public void demo1() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
/** 不用创建连接池了 */
// 从连接池获得链接
conn = JDBCUtils2.getConnection();
// 编写SQL
String sql = "select * from account";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 执行SQL
rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, pstmt, conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-08 ,如有侵权请联系 cloudcommunity@tencent 删除入门数据后端连接内存JavaWeb后端入门2—连接池
1.概述
1.1 什么是连接池
创建和管理一个连接的缓冲池的技术。
是装有连接的容器,使用连接的时候可以从连接池中进行获取,使用完成后将连接归还给连接池
1.2 为什么要学习
连接对象创建和销毁是需要好费时间的,在服务器初始化的时候就初始化一些连接。把这些对象连接放入到内存中,使用的时候可以从内存中获取,使用完成后将连接放入到连接池中。将内存中获取和归还的效率要远远高于创建和销毁的效率(提升性能)。
1.3 连接池的原理
2. 自定义连接池
2.1 实现步骤
- 编写类实现Datasource接口
- 重写getConnection方法
- 在内存中初始化多个连接
- 编写归还连接的方法
2.2 实现代码
- 写一个MyDataSource方法
public class MyDataSource implements DataSource {
//将一些连接存入到内存中,可以定义一个集合,用于存储连接对象。
private List<Connection> connList = new ArrayList<Connection>();
//在初始化的时候提供一些连接
public MyDataSource() {
//初始化连接:
for(int i =1 ;i<=3;i++) {
//向集合中存入链接
connList.add(JDBCUtils.getConnection());
}
}
//从连接池中获得链接的方法
@Override
public Connection getConnection() throws SQLException {
Connection conn = connList.remove(0);
return conn;
}
// 编写归还连接的方法
public void addBack(Connection conn) {
connList.add(conn);
}
....}
- 测试代码
package com.itheima.datasource.demo1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
import com.itheima.jdbc.utils.JDBCUtils;
/*
* 自定义连接池的测试类
* */
public class DataSourceDemo1 {
@Test
/* 测试自定义连接池 */
public void demo1() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
MyDataSource dataSource = null;
try {
// 获得连接
// conn = JDBCUtils.getConnection();
// 从连接池中获得连接
dataSource = new MyDataSource();
conn = dataSource.getConnection();
// 编写SQL语句
String sql = "select * from account";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 设置参数
// 执行SQL
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// JDBCUtils.release(rs,pstmt, conn);
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
// 归还连接
dataSource.addBack(conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
}
3. C3P0连接池
3.1 概述
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等
参考文档:/
3.2 使用方法1:手动设置参数
首先引入c3p0-0.9.1.2.jar
代码语言:javascript代码运行次数:0运行复制package com.itheima.datasource.demo2;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;
import org.junit.Test;
import com.itheima.jdbc.utils.JDBCUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/*
* C3P0连接池测试
* */
public class C3P0Demo1 {
@Test
// 手动设置参数的方式
public void demo1() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获得链接:从连接池中获取
// 创建c3p0的连接池
ComboPooledDataSource dateSource = new ComboPooledDataSource();
// 设置连接参数
dateSource.setDriverClass("com.mysql.jdbc.Driver");
dateSource.setJdbcUrl("jdbc:mysql://43.226.152.21:3306/web_test4");
dateSource.setUser("root");
dateSource.setPassword("Qq1991101313");
// 从连接池中获得链接
conn = dateSource.getConnection();
// 编写sql
String sql = "select * from account1";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 执行SQL
rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, pstmt, conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
}
3.3 使用方法2:使用配置文件
- 在src目录下创建c3p0-config.xml文件(点击查看官方示例代码)
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://x.x.x.x:3306/web_test4</property>
<property name="user">root</property>
<property name="password">xxx</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
<!-- This app is massive! -->
<named-config name="oracle">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://x.x.x.x:3306/web_test4</property>
<property name="user">root</property>
<property name="password">xxx</property>
</named-config>
</c3p0-config>
- 代码框架同3.2,这里只重写Demo2
@Test
/*
* 采用配置文件的方式
*/
public void demo2() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 创建C3P0连接池
/*
* 只要创建连接池,就会默认去类路径下查找c3p0-config.xml
*/
ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");
// 从连接池获得链接
conn = dataSource.getConnection();
// 编写SQL
String sql = "select * from account";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 执行SQL
rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, pstmt, conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
4. 改写工具类
连接池对象应该是一个应用只创建一次,不需要每次使用都创建一个新的连接池。
- 提取出
JDBCUtils2.java
不需要之前的注册驱动和获得链接了,直接创建C3P0连接池,给出获得链接的方法。
代码语言:javascript代码运行次数:0运行复制package com.itheima.jdbc.utils;
/*JDBC工具类*/
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils2 {
/**创建一个连接池:只创建一次*/
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
*获得链接的方法
* @throws SQLException
**/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 获得连接池
* */
public static DataSource getDataSource() {
return dataSource;
}
/**
*资源释放的方法
**/
public static void release(Statement stmt,Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
conn = null;
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
rs = null;
}
}
}
- 测试提取出的工具类
@Test
/**
* 使用新的工具类的测试
*/
public void demo1() {
// 记录一下插入数据使用的时间
// 开始时间
long begin = System.currentTimeMillis();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
/** 不用创建连接池了 */
// 从连接池获得链接
conn = JDBCUtils2.getConnection();
// 编写SQL
String sql = "select * from account";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 执行SQL
rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name") + " " + rs.getDouble("money"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, pstmt, conn);
}
long end = System.currentTimeMillis();
System.out.print("数据插入时间为(单位ms):");
System.out.println(end - begin);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-04-08 ,如有侵权请联系 cloudcommunity@tencent 删除入门数据后端连接内存本文标签: JavaWeb后端入门2连接池
版权声明:本文标题:JavaWeb后端入门2—连接池 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748000261a2239860.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论