博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
后台(20)——数据库连接池
阅读量:5824 次
发布时间:2019-06-18

本文共 6651 字,大约阅读时间需要 22 分钟。




版权声明

  • 本文原创作者:
  • 作者博客地址:

数据库连接池简介

在前面的文章中我们已经介绍了Web开发和数据库。现在来想这么一个问题:在同一时间段有大量用户访问我们的服务端,那么此时的服务器数据库它忙得过来么?诚然,它是需要一个好帮手的——数据库连接池

数据库连接池负责分配、管理和释放数据库连接。它允许程序重复使用一个现有的数据库连接,而不是再重新建立一个。数据库连接池可自动释放闲置时间超过最大空闲时间的数据库连接从而避免因为没有释放数据库连接而引起的数据库连接遗漏。这些技术均能明显提高数据库操作性能。目前,常见的数据库连接池有DBCP、C3P0等,现分别介绍他们。


DBCP

DBCP(DataBase Connection Pool)由Apache研发,而且Tomcat的连接池也正是采用DBCP实现的,该数据库连接池既可与应用服务器整合使用,也可由应用程序独立使用。

在此,以完整示例介绍DBCP的使用

第一步:添加jar包

  • commons-dbcp.jar
  • commons-pool.jar
  • mysql-connector-java-5.0.8-bin.jar

第二步:编写DBCP的配置文件dbcpconfig.properties

#
driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/db1username=rootpassword=root#
initialSize=10#
maxActive=50#
maxIdle=20#
minIdle=5#
maxWait=50000#
connectionProperties=useUnicode=true;characterEncoding=utf8##
defaultAutoCommit=true#
defaultTransactionIsolation=REPEATABLE_READ

第三步:编写操作DBCP的工具类DBCPUtil

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class DBCPUtil {
private static DataSource dataSource = null; //创建数据库连接池 static{ Properties properties = new Properties(); try { ClassLoader classLoader=DBCPUtil.class.getClassLoader(); properties.load(classLoader.getResourceAsStream("dbcpconfig.properties")); dataSource = BasicDataSourceFactory.createDataSource(properties); } catch (Exception e) { throw new ExceptionInInitializerError("DBCP始化错误,请检查配置文件"); } } //创建连接 public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { throw new RuntimeException("数据库连接错误"); } } //释放连接 public static void releaseConnection(Connection conn, Statement stmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (Exception e) { e.printStackTrace(); } rs = null; } if (stmt != null) { try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } stmt = null; } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } conn = null; } }}

第四步:测试DBCP的使用

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.junit.Test;public class TestDBCP {
@Test public void testDBCP(){ Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet=null; try { connection = DBCPUtil.getConnection(); preparedStatement = connection.prepareStatement("select * from student"); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { Student student = new Student(); int id = resultSet.getInt("studentid"); String name = resultSet.getString("studentname"); student.setStudentID(id); student.setStudentName(name); System.out.println(student); } } catch (SQLException e) { e.printStackTrace(); }finally{ DBCPUtil.releaseConnection(connection, preparedStatement, resultSet); } }}

运行结果如下图所示:

这里写图片描述


C3P0

C3P0是一个开源的JDBC连接池,目前有Hibernate,Spring等框架也使用该数据库连接池。

在此,以完整示例介绍C3P0的使用

第一步:添加jar包

  • c3p0-0.9.1.2.jar
  • mysql-connector-java-5.0.8-bin.jar

第二步:编写C3P0的配置文件c3p0-config.xml

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/db1
root
root
15
40
150
20

第三步:编写操作C3P0的工具类C3P0Util

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;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 C3P0Util {
//创建数据库连接池 private static DataSource dataSource = new ComboPooledDataSource(); //创建连接 public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { throw new RuntimeException("获取数据库连接失败"); } } //释放连接 public static void releaseConnection(Connection conn, Statement stmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (Exception e) { e.printStackTrace(); } rs = null; } if (stmt != null) { try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } stmt = null; } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } conn = null; } }}

第四步:测试C3P0的使用

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */package cn.com;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.junit.Test;public class TestC3P0 {
@Test public void testC3P0(){ Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet=null; try { connection = C3P0Util.getConnection(); preparedStatement = connection.prepareStatement("select * from student"); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { Student student = new Student(); int id = resultSet.getInt("studentid"); String name = resultSet.getString("studentname"); student.setStudentID(id); student.setStudentName(name); System.out.println(student); } } catch (SQLException e) { e.printStackTrace(); }finally{ C3P0Util.releaseConnection(connection, preparedStatement, resultSet); } }}

运行结果如下图所示:

这里写图片描述

你可能感兴趣的文章
Java设计模式
查看>>
一文读懂 AOP | 你想要的最全面 AOP 方法探讨
查看>>
Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
查看>>
ORM数据库框架 SQLite 常用数据库框架比较 MD
查看>>
华为OJ 名字美丽度
查看>>
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
BIEE Demo(RPD创建 + 分析 +仪表盘 )
查看>>
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>