JDBC数据库连接池技术

news/2025/2/23 22:11:14

在JDBC中,获得连接或释放资源是非常消耗系统资源的两个过程,为了解决此类性能问题,通常采用连接池技术,来共享连接。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。

用池的概念来管理Connection,这样可以重复使用Connection。有了连接池以后就不用自己亲自创建连接而是通过连接池来获得Connection对象。当使用完Connection之后,调用Connection的close()方法不是真的将连接关闭,而是把Connection归还给连接池。连接池就可以继续保留这个Connection给其他用户使用了。

Java为了数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池来实现这个接口,这样应用程序可以方便的切换不同厂商的连接池。有三个常用的连接池:DBCP、C3P0和druid

DBCP连接池

DBCP是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。

在使用DBCP之前,要引入2个包:commons-dbcp.jar和commons-pool.jar。

image

  1 package com.dbcp.demo;
  2 import java.sql.Connection;
  3 import java.sql.PreparedStatement;
  4 import java.sql.SQLException;
  5 import javax.sql.DataSource;
  6 import org.apache.commons.dbcp.BasicDataSource;
  7 
  8 public class DemoDBCP {
  9     // 连接数据库的参数
 10     public static final String DRIVER = "com.mysql.jdbc.Driver";
 11     public static final String URL = "jdbc:mysql://localhost:3306/mybatis";
 12     public static final String USERNAME = "root";
 13     public static final String PASSWORD = "123456";
 14 
 15     // 创建连接池
 16     public static BasicDataSource dataSource = new BasicDataSource();
 17 
 18     // 静态代码块
 19     static {
 20         // 对连接池对象进行基本的配置
 21         dataSource.setDriverClassName(DRIVER);     // 待连接的数据库的驱动
 22         dataSource.setUrl(URL);                 // 指定要连接的数据库的地址
 23         dataSource.setUsername(USERNAME);         // 指定要连接的用户名
 24         dataSource.setPassword(PASSWORD);          // 指定要连接数据库的密码
 25 
 26         // 这里应该还有设置连接数的语句
 27     }
 28 
 29     // 返回连接池对象
 30     public static DataSource getDataSource() {
 31         return dataSource;
 32     }
 33 
 34     // 测试连接池
 35     public static void main(String[] args) throws SQLException {
 36         // 获得连接池
 37         DataSource dataSource = DemoDBCP.getDataSource();
 38         // 从连接池中获得连接
 39         Connection conn = dataSource.getConnection();
 40         // 准备sql语句
 41         String sql = "insert into person (LastName, FirstName, Address, Age) values" +
 42                 " (?, ? ,?, ?)";
 43         // 获得PresparedStatement对象
 44         PreparedStatement pstmt = conn.prepareStatement(sql);
 45         // 设置参数
 46         pstmt.setString(1, "");
 47         pstmt.setString(2, "");
 48         pstmt.setString(3, "埃塞俄比亚");
 49         pstmt.setInt(4, 24);
 50         // 执行CRUD操作
 51         pstmt.execute();
 52         // 关闭连接
 53         conn.close();
 54     }
 55 }

DBCP常见的配置选项

必须的配置项
driverclassName 数据库驱动名称
url 数据库的地址
username 用户名
password 密码
基本项
maxActive 最大连接数
initialSize 连接池中初始化多少个Connection连接对象
扩展项
maxWait 超时等待时间以毫秒为单位

转载于:https://www.cnblogs.com/tuhooo/p/6224047.html


http://www.niftyadmin.cn/n/1701543.html

相关文章

Python - all()函数

all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False 外都算 True,输入参数为元组或列表,函数等价于: def all(iterable):for e…

【运维囧事】NTP服务器引发的一场血案

8月份,加入了一个新的项目组,电网项目组。到了项目第二天,便被要求做一个时间同步服务器,将集群内的服务器全都时间同步,因为集群内服务器总会差个几秒钟,影响数据的一致性。这个很简单,我们的使…

118.杨辉三角(简单)- LeetCode

题目描述 自己解法 运用动态规划思想,当前层下标0、-1的元素值为1,下标从1到len(res)-1的元素中,若下标为i,其值等于上一层下标[i]、[i-1]的元素之和,Python实现: class Solution:def generate(self, num…

QucikTest 测试对象的深入剖析

通过前面系列有关QuickTest博文的介绍及操作,已经对QuickTest有了一定的了解,本篇博文就通过实例图文并茂的对QuickTest下的对象进行深入的了解与剖析。1. QuickTest工作原理通过前面陆续blog文章中有关QuickTest文章中的学习,了解到 QuickT…

安装nodejs 后运行 npm 命令无响应处理方法

安装和卸载过nodejs, 也编辑过 C:\Users\{账户}\下的.npmrc文件。 再全新安装nodejs ,运行npm 命令,无响应。 处理方法,删除C:\Users\{账户}\下的.npmrc文件 再运行npm 命令,正常转载于:https://www.cnblogs.com/testw…

1266.访问所有点的最小时间(简单)- LeetCode

题目描述 自己解法 由题目可知,所要输出的是经过所有点的时间,所以路径方向并不是最关键的,最短时间应该是:两个相邻点x坐标之差的绝对值、y坐标之差的绝对值中较大的一方,Python代码实现: class Solutio…

graph image segment

http://cs.brown.edu/~pff/segment/ 转载于:https://www.cnblogs.com/guochen/p/6226558.html

Python - zip()函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。我们可以使用 list() 转换来输出列表。如果各个迭代器的元素个数不一致,则返回列表长…