27、jdbc操作数据库(4)

数据库连接池是什么?为什么使用连接池?

当使用jdbc去操作数据库时,需要先获取连接,然后进行具体的数据库操作,最后释放连接。这一系列操作在演示一个demo时还可以使用,但是当访问数据库次数多了的时候,就会显得很繁琐,除此之外还容易造成内存泄漏、数据库崩溃等复杂问题。所以为了解决这一问题,就出现了数据库连接池,顾名思义就是使用一个盛有数据库连接的池子来管理数据库连接,连接池负责分配、管理和释放数据库连接,可以控制数据库连接的个数,其基本思想就是预先将一定数量的数据库连接放到一个池子中,所谓的池子就是一块缓冲区,当使用连接时直接去连接池中获取即可,用完再放回到池子中,这样直接从内存中获取而不需要重复操作数据库,提高了效率和性能。

怎么使用连接池

java中提供了数据库连接池对应的接口:javax.sql.DataSource,对连接的管理都通过此接口对象实现,一般需要第三方实现或者服务器提供实现,这里介绍三种第三方提供的连接池,分别是:dbcp、c3p0、druid。连接池通常也被成为数据源,包含连接池和连接池管理两部分,接下来详细介绍一下怎么使用这三种连接池。

dbcp

首先需要添加第三方连接池的jar包:

commons-dbcp2-2.3.0.jar、commons-logging-1.2.jar、commons-pool2-2.5.0.jar

因为使用连接池管理连接,所以需要创建一个dbcp.properties用来配置连接数据库的信息,使用org.apache.commons.dbcp2.BasicDataSourceFactory工厂类来创建一个数据源,然后使用提供的Datasource实现类org.apache.commons.dbcp2.BasicDataSource来获取对应的连接即可。在配置dbcp.properties时一定要注意,键的名称必须和BasicDataSource类中定义的成员变量名称一致,否则报错。实例代码如下:

//--------------------------dbcp.properties---------------------//
driver=com.mysql.jdbc.Driver
#jdbc:database://host:port/dbName
url=jdbc:mysql://127.0.0.1:3306/fqx_webapp
username=root
password=123456
#这里只配置一下maxTotal参数作为实例,说明可以通过配置dbcp的参数来预定义连接池的各个属性,参数可以参照org.apache.commons.dbcp2.BasicDataSource类中的成员变量
maxTotal=16//--------------------------代码实现----------------------------//
public static void main(String[] args) {Properties properties = new Properties();InputStream inStream = ConnectionPoolTest.class.getClassLoader().getResourceAsStream("dbcp.properties");// BasicDataSource类是dbcp提供的类,实现了javax.sql.DataSource接口BasicDataSource basicDataSource = null;try {properties.load(inStream);basicDataSource = BasicDataSourceFactory.createDataSource(properties);System.out.println(basicDataSource);//可以获取和修改连接池的配置参数System.out.println(basicDataSource.getMaxTotal());//通过连接池获取连接,用完无需释放Connection connection = basicDataSource.getConnection();PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");ResultSet executeQuery = prepareStatement.executeQuery();while(executeQuery.next()){System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}
}

c3p0

首先需要添加第三方jar包:

c3p0-0.9.5.3.jar、mchange-commons-java-0.2.15.jar

需要创建一个c3p0-config.xml用来配置连接数据库的信息,然后使用提供的Datasource实现类com.mchange.v2.c3p0.ComboPooledDataSource来获取对应的连接池即可。

配置文件配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config><default-config><property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/fqx_webapp</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="user">root</property><property name="password">123456</property><property name="acquireIncrement">5</property><property name="initialPoolSize">30</property><property name="maxPoolSize">30</property><property name="minPoolSize">1</property></default-config>
</c3p0-config>

实现代码如下:

public static void main(String[] args) {try {//获取数据源对象ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");Connection connection;//通过数据源获取连接connection = dataSource.getConnection();System.out.println(connection);PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");ResultSet executeQuery = prepareStatement.executeQuery();while(executeQuery.next()){System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));}} catch (SQLException e) {e.printStackTrace();}
}

可通过c3p0 api 网址 https://www.mchange.com/projects/c3p0 进一步了解c3p0.

当连接获取失败时,c3p0具有重连机制,这一点比较诱人。

druid

首先需要添加第三方jar包:druid-1.1.10.jar

需要创建一个druid.properties用来配置连接数据库的信息,使用com.alibaba.druid.pool.DruidDataSourceFactory工厂类来创建一个数据源,然后使用提供的Datasource实现类com.alibaba.druid.pool.DruidDataSource来获取对应的连接即可。在配置druid.properties时一定要注意,键的名称必须和com.alibaba.druid.pool.DruidDataSourceFactory类中对应的常量值一致。实例代码如下:

//-------------druid.properties--------------------//
druid.driverClassName=com.mysql.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/fqx_webapp
druid.username=root
druid.password=123456//--------------实现代码----------------------//
public static void main(String[] args) {try {Properties properties = new Properties();InputStream inStream = ConnectionPoolTest.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(inStream);//获取数据源对象DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection;//通过数据源获取连接connection = dataSource.getConnection();System.out.println("druid-->"+connection);PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");ResultSet executeQuery = prepareStatement.executeQuery();while(executeQuery.next()){System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));}} catch (SQLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}
}

druid集合了众家所长,号称是当前最好的数据库连接池,对数据库连接和sql的执行可以进行最大程度上的监控,这一点比较诱人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

28、jdbc操作数据库(5)

介绍一个稍微封装了jdbc的工具类org.apache.commons.dbutils&#xff0c;使用dbutils可以简化对数据库操作程序的开发。 API介绍 接下来通过实例的方式说一下dbutils的具体使用 添加jar包&#xff1a;commons-dbutils-1.7.jar 增、删、改 进行增、删、改操作&#xff0c;在…

jzoj3910-Idiot的间谍网络【倍增,dfs】

正题 题目链接:https://jzoj.net/senior/#main/show/3910 题目大意 nnn个点的森林mmm个操作&#xff0c; 合并两棵树让xxx节点到根节点的路径标记上cntcntcnt。并让cntcntcnt查询一个节点xxx是否有标记yyy。 解题思路 这里考虑离线的算法。我们可以先将这个森林的最终状态构…

2017西安交大ACM小学期数论 [更新学号]

发布时间: 2017年6月24日 20:27 最后更新: 2017年7月3日 09:27 时间限制: 3000ms 内存限制: 128M 描述 某知名高校有n个学生&#xff0c;每个学生有一个唯一ID。但这些ID有7位数字&#xff0c;学生总是记不住&#xff0c;于是学校想了一个办法。它们将所有ID对m取模作为学…

jzoj4815-ksum【堆】

正题 题目链接:https://jzoj.net/senior/#main/show/4815 题目大意 nnn个数的序列&#xff0c;求前kkk大的子段。 解题思路 一个区间的答案肯定比他的所有子区间要大&#xff0c;所以我们先把(1,i)(1,i)(1,i)都丢进堆里&#xff0c;然后每次取出最大的再将(l1,r)(l1,r)(l1,r)…

2017西安交大ACM小学期数论 [等差数列]

等差数列 发布时间: 2017年6月25日 13:42 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数n&#xff0c;试问存在多少个和为n的等差数列&#xff1f; 当然&#xff0c;等差数列中每一项要为非负整数&#xff0c;且不考虑降序的等差数列。…

29、jdbc操作数据库(6)

通常真正实际开发时&#xff0c;dao层虽然会涉及很多实体&#xff0c;但是可以借助泛型、反射、一些简单工具类来封装一些通用的查询、更新等操作的方法&#xff0c;下面介绍两种方法 第一种&#xff1a;借助元数据类ResultSetMetaData来实现方法的封装&#xff0c;使用Map或者…

30、JAVA_WEB开发基础之servlet(1)

servlet是什么 Servlet 是一种独立的 web 开发标准&#xff0c;用来接受、处理、返回浏览器的访问请求&#xff0c;它不应和服务器耦合在一起&#xff0c;servlet和servlet容器之间相互独立又相互依存&#xff0c;自我感觉&#xff0c;servlet有了容器才得以实现自己的价值&am…

jzoj4817-square【区间RMQ,二分答案】

正题 题目链接:https://jzoj.net/senior/#contest/show/2956/2 题目大意 n∗mn*mn∗m的010101矩阵&#xff0c;每次询问(x1,y1,x2,y2)(x1,y1,x2,y2)(x1,y1,x2,y2)里的最大全111正方形。 解题思路 我们用fi,jf_{i,j}fi,j​表示以(i,j)(i,j)(i,j)为右下角的全1正方形大小&#…

2017上海金马五校赛 丢史蒂芬妮 博弈问题

丢史蒂芬妮 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M 描述 有一天&#xff0c;空和白很无聊&#xff0c;决定玩盛大游戏&#xff0c;考虑到两个人玩&#xff0c;他们随便掏了一个游戏出来&#xff1a;在一个n*m的棋盘…

2017上海金马五校 购买装备 贪心+二分Check

购买装备 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M 描述 最近盛大的一款游戏传奇世界极其火爆。游戏玩家John&#xff0c;想购买游戏中的装备。已知游戏的商店里有n件装备&#xff0c;第i件装备具有属性值ai&#xf…

31、JAVA_WEB开发基础之servlet(2)

使用servlet需要依赖jar包&#xff1a;servlet-api.jar&#xff0c;下边介绍一下关于servlet的一些api Servlet接口 package javax.servlet;import java.io.IOException;public interface Servlet {//在servlet被载入后和实施服务前由servlet引擎调用。如果init()//产生溢出U…

力扣(leetcode)第1题两数之和(Python)

1.两数之和 题目链接&#xff1a;1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素…

jzoj3809-设备塔【并查集】

正题 题目链接:https://jzoj.net/senior/#contest/show/2955/2 题目大意 n∗mn*mn∗m的矩阵&#xff0c;最左边和最右边是联通的&#xff0c;然后每次加入一个墙求能否有一条路径从最上方到最下方。如果有就加入否则不加入。 求最后有多少个墙。 解题思路 我们对于每个墙往八…

32、JAVA_WEB开发基础之jsp

是什么 是简化servlet的一种技术&#xff0c;将html语句和java代码混合在一个文件中进行编写&#xff0c;只对网页中动态产生的内容用java代码编写&#xff0c;静 态内容仍用html语句编写 运行原理 jsp本质上是一个servlet &#xff0c;每个jsp页面第一次被访问时&#xff…

上古时期(大雾)的数据结构pdf

分块点分治Treap byWYCby\ WYCby WYC Part1 分块 概念 就是将nnn个数分成若干个块&#xff0c;然后要处理的时候整块一起的加上局部的直接暴力。 如果将块的大小分配好一般每次都是O(n)O(\sqrt n)O(n​)的。 而且因为十分暴力&#xff0c;所以有很多优秀的性质。 实现方法 …

2017西安交大ACM小学期 刁钻的顾客[3进制+折半枚举]

刁钻的顾客 发布时间: 2017年7月3日 10:23 时间限制: 3000ms 内存限制: 128M 描述 XJTU校园内新开一家商店&#xff0c;可是来了一位刁钻的顾客要购买商品A和商品B。关于商品的质量&#xff0c;共有n个评分&#xff0c;每个评分即一个整数来表示该产品在某一方面的质量。商…

33、JAVA_WEB开发基础之会话机制

会话是什么 一个客户端浏览器与web服务器之间连续发生的一系列请求和响应过程就是会话&#xff0c;这些过程中产生的一系列信息就是会话信息&#xff0c;会话机制就是用于维护这些信息一致性的一种技术。通俗的说就是&#xff0c;一个A账号访问服务器&#xff0c;进行多次交互…

2017西安交大ACM小学期 刷墙[折半枚举+异或]

刷墙 发布时间: 2017年7月3日 12:17 最后更新: 2017年7月6日 22:29 时间限制: 3000ms 内存限制: 128M 描述 小明有一面黑白混搭的墙&#xff0c;他想给把墙重新粉刷一遍。他将任务分给了xx粉刷匠&#xff0c;但是xx粉刷匠提出要求&#xff0c;他要根据原来墙的颜色进行粉…

jzoj4216-[NOIP2015模拟9.12]平方和【Splay】

正题 题目链接:https://jzoj.net/senior/#main/show/4216 题目大意 一个序列要求支持操作 插入一个数区间加上一个数区间求平方和 解题思路 用线段树可以做到区间求平方和。 就是(ab)2a22abb2(ab)^2a^22abb^2(ab)2a22abb2也就是维护区间和平方和和区间个数即可。 但是因为…

34、JAVA_WEB开发基础之EL表达式和标签

EL表达式是什么 一种从域对象中获取数值的简化写法&#xff0c;el表达式语法格式为&#xff1a;${域对象.参数名} 使用方式 取出request范围内的参数&#xff1a;{pageContext.request.username} 或者是 ${requestScope.username} 取出session范围内的参数&#xff1a;{pag…