从JDBC连接到C3P0数据库连接池

在Java开发中,使用JDBC操作数据库的四个步骤如下:

      ①加载数据库驱动程序(Class.forName("数据库驱动类");)
      ②连接数据库(Connection con  = DriverManager.getConnection();)
      ③操作数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
      ④关闭数据库,释放连接(con.close();)

  也就是说,所有的用户都需要经过此四步进行操作,但是这四步之中有三步(①加载数据库驱动程序、②连接数据库、④关闭数据库,释放连接)对所有人都是一样的,而所有人只有在操作数据库上是不一样,那么这就造成了性能的损耗。

  那么最好的做法是,准备出一个空间,此空间里专门保存着全部的数据库连接,以后用户用数据库操作的时候不用再重新加载驱动、连接数据库之类的,而直接从此空间中取走连接,关闭的时候直接把连接放回到此空间之中。
      那么此空间就可以称为连接池(保存所有的数据库连接)
什么是连接池:   
   连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用;简单理解为,当一辆汽车搬运东西,如果使用jdbc连接,(jdbc连接:与数据库建立连接、发送操作数据库的语句并处理结果)那么每一次都要去打开数据库,获得连接,关闭数据库。假设汽车搬运的东西是连接,那么我可不可以每一次将连接搬运多个呢?而不是jdbc那样,一次只搬运一个连接,然后就把汽车扔掉?这时候,使用连接池。
原理:
  连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 为什么要用到连接池     数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。连接池主要由三部分组成:连接池的建立、连接池中连接的使用管理、连接池的关闭。数据库连接池的最小连接数和最大连接数的设置要考虑到以下几个因素:

  1. 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
  2. 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
  3. 如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接.不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放

下面这是c3p0数据库连接池的运行机制  

(1)  程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源

我用的开发工具是IDEA,创建的是Maven项目,要使用c3p0需要配置相关模块,如图所示

<!-- mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.0.5</version></dependency><!-- c3p0 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency>

  

db.properties  文件名不能改, 必须放在src下  ,配置文件中的key名称不能变

好,完成这些后开始连接数据库

package jdbc;import com.mchange.v2.c3p0.ComboPooledDataSource;import java.beans.PropertyVetoException;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;public class JDBCUtils {public void setConnection() throws SQLException, PropertyVetoException, IOException {//创建连接池ComboPooledDataSource dataSource = new ComboPooledDataSource();//加载配置文件Properties properties = new Properties();properties.load(new FileInputStream("src/main/java/db.properties"));String driver = properties.getProperty("driver");String url = properties.getProperty("url");String username = properties.getProperty("username");String password = properties.getProperty("password");//获得连接Connection conn = null;PreparedStatement ps = null;ResultSet res = null;dataSource.setDriverClass(driver);dataSource.setJdbcUrl(url);dataSource.setUser(username);dataSource.setPassword(password);conn = dataSource.getConnection();String sql = "select * from user";ps = conn.prepareStatement(sql);res = ps.executeQuery();while (res.next()){System.out.println(res.getInt("id")+" "+res.getString("username")+" "+res.getString("password"));}}}class text{public static void main(String[] args) throws PropertyVetoException, SQLException, IOException {JDBCUtils jdbcUtils = new JDBCUtils();jdbcUtils.setConnection();}
}

  

转载于:https://www.cnblogs.com/zyx110/p/11276476.html

JDBC秒变C3P0连接池——再加连接解耦相关推荐

  1. c3p0和jdbctemplate配置oracle集群rac,C3P0连接池、DRUID连接池和JdbcTemplate

    目录 一.C3P0连接池 1.C3P0连接池简介 2.常用的配置参数 3.C3P0连接池基本使用 (1)C3P0配置文件 (2)API介绍 4.使用步骤 二.DRUID连接池 1. DRUID简介 2 ...

  2. C3P0连接池、DRUID连接池和JdbcTemplate

    目录 一.C3P0连接池 1.C3P0连接池简介 2.常用的配置参数 3.C3P0连接池基本使用 (1)C3P0配置文件 (2)API介绍 4.使用步骤 二.DRUID连接池 1. DRUID简介 2 ...

  3. jdbc 连接池 java_JDBC自定义连接池过程详解

    这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 开发中,"获得连接"和" ...

  4. JDBC、封装JDBC连接池、第三方连接池工具

    主要内容: JDBC简介 JDBC来源 通过代码实现JDBC JDBC的改进需求 JDBC改进的代码实现 JDBC使用的设计模式 封装连接池 封装JDBC连接池 ThreadLoacl的使用 Thre ...

  5. C3P0连接池和Druid连接池

    连接池 以往的JDBC使用的方式,每次运行sql都需要从底层注册驱动获取连接,这样非常耗时,浪费资源,sql执行完毕后又需要释放资源,有点类似于开了一家饭店,有客人来,招聘了几个服务员,客人走后,开除 ...

  6. c3p0连接池与dbcp连接池的区别

    c3p0连接池与dbcp连接池的区别: c3p0有自动回收空闲连接的功能: dbcp没有自动回收空闲连接的功能: c3p0提供最大空闲时间,超时则断开当前连接: dbcp提供最大连接数,超过最大连接数 ...

  7. mysql odbc连接池_Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  8. java dbcp连接池_Java——DBCP连接池

    连接池 实际开发中"获得连接"或"释放资源"是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection.这样 ...

  9. mysql连接池失效_连接池隔天失效之异常处理

    一.    开发环境     测试平台:Linux     开发工具:Eclipse 3.x     搭配环境:Struts2.x / Ibatis 2.0 / MySql / Tomcat6. ...

最新文章

  1. C++11中头文件thread的使用
  2. 基础: 一、Android环境搭建
  3. 【收藏】k8s使用如下配置给pod固定ip
  4. matlab_simulink笔记01——模块属性的设置以及模块参数的设置
  5. Linux下使用socket传输文件的C语言简单实现
  6. 【ElasticSearch】Es 源码之 PersistedClusterStateService 源码解读
  7. .net开发中常用的第三方组件
  8. 主成分分析(PCA)——matlab程序及函数详解
  9. 开课吧:分享C++代码的整洁之道!
  10. php laravel设置创建目录的权限,在Laravel5中正确设置文件权限的方法
  11. JavaScript高级程序
  12. CATIA软件有限元分析功能详解及使用教程
  13. Mybatis官方文档:简介和入门
  14. 长链接转化成短链接java,长链接转短链接(短网址)
  15. angular 中如何实现多态与继承
  16. 工资管理系统的需求概述的资料收集与分析:
  17. Android Audio常用音频工具和分析方法
  18. [HEOI2013]ALO-题解
  19. python3一键上网认证的图形化exe程序(下篇)
  20. 生成小分子力场TOP

热门文章

  1. 【luogu1816】忠(RMQ问题、线段树)
  2. 【操作系统】Mac环境配置
  3. mysql 8.0 yum_CentOS7使用yum安装MySQL8.0
  4. 测试操作数据库mysql数据库吗_软件测试-MySQL(六:数据库函数)
  5. mysql的分页如何操作_Mysql有关分页的操作
  6. nacos 服务日志_如何屏蔽Nacos日志输出?
  7. java tostring的用处_java中的toString什么意思?toString有什么用?
  8. 2018蓝桥杯B组:猴子分香蕉(C++/JAVA)
  9. 超级卡特兰数(bzoj 4706: B君的多边形)
  10. C++vector基础容器3.0