Java中JDBC的数据库连接池

第十章:数据库连接池与DBUtils 一、数据库连接池 1.1 什么是数据库连接池 在使用jdbc编程时,每次访问数据库都需要创建连接对象,访问完毕后也需要断开连接(销毁对象)。 比如说:网站的每日用户访问量是10万次,这时候就需要对数据库访问10万次,需要10万次创建和断开连接对象,频繁的创建和断开连接,这使访问数据库的效率非常低。 数据库连接池技术:管理连接对象。 1.应用程序就不需要创建和断开连接对象,而是交给数据库连接池管理 2.数据库连接池断开,不是销毁对象,而是把连接对象归还给连接池。 数据库连接池基本参数: 1. 阅读详情

数据库连接池

池参数(所有池参数都有默认值):

初始大小:10个

最小空闲连接数:3个

增量:一次创建的最小单位(5个)

最大空闲连接数:12个

最大连接数:20个

最大的等待时间:1000毫秒


四大连接参数

连接池也是使用四大连接参数来完成创建连接对象!


实现的接口

连接池必须实现:javax.sql.DataSource接口!

连接池返回的Connection对象,它的close()方法与众不同!调用它的close()不是关闭,而是把连接归还给池!代表该链接不被占用了。

 

数据库连接池

连接池的概念

用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。


JDBC数据库连接池接口(DataSource)

  Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商可以让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!


自定义连接池(CloudPool)

  分析:CloudPool需要有一个List,用来保存连接对象。在CloudPool的构造器中创建5个连接对象放到List中!当用人调用了CloudPool的getConnection()时,那么就从List拿出一个返回。当List中没有连接可用时,抛出异常。

  我们需要对Connection的close()方法进行增强,所以我们需要自定义CloudConnection类,对Connection进行装饰!即对close()方法进行增强。因为需要在调用close()方法时把连接“归还”给池,所以CloudPool类需要拥有池对象的引用,并且池类还要提供“归还”的方法。


CloudPool.java

public class CloudPool implements DataSource {

    private static Properties props = new Properties();

    private List<Connection> list = new ArrayList<Connection>();

    static {

       InputStream in = CloudPool.class.getClassLoader()

              .getResourceAsStream("dbconfig.properties");

       try {

           props.load(in);

           Class.forName(props.getProperty("driverClassName"));

       } catch (Exception e) {

           throw new RuntimeException(e);

       }

    }

 

    public CloudPool () throws SQLException {

       for (int i = 0; i < 5; i++) {

           Connection con = DriverManager.getConnection(

                  props.getProperty("url"), props.getProperty("username"),

                  props.getProperty("password"));

           CloudPool conWapper = new CloudConnection(con, this);

           list.add(conWapper);

       }

    }

   

    public void add(Connection con) {

       list.add(con);

    }

 

    public Connection getConnection() throws SQLException {

       if(list.size() > 0) {

           return list.remove(0);

       }

       throw new SQLException("没连接了");

    }}


CloudConnection.java

public class CloudConnection extends ConnectionWrapper {

    private ItcastPool pool;

   

    public CloudConnection(Connection con, CloudPool pool) {

       super(con);

       this.pool = pool;

    }

 

    @Override

    public void close() throws SQLException {

       pool.add(this);

    }

}

 

C3P0连接池

C3P0简介

  C3P0也是开源免费的连接池,现在做的大部分项目都是使用C3P0连接池。

C3P0的使用

  C3P0中池类是:ComboPooledDataSource。

    public void fun1() throws PropertyVetoException, SQLException {

       ComboPooledDataSource ds = new ComboPooledDataSource();

       ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");

       ds.setUser("root");

       ds.setPassword("123");

       ds.setDriverClass("com.mysql.jdbc.Driver");

      

       ds.setAcquireIncrement(5);

       ds.setInitialPoolSize(20);

       ds.setMinPoolSize(2);

       ds.setMaxPoolSize(50);

      

       Connection con = ds.getConnection();

       System.out.println(con);

       con.close();

    }

 

配置文件要求:

l  文件名称:必须叫c3p0-config.xml

l  文件位置:必须在src下


c3p0也可以指定配置文件,而且配置文件可以是properties,也可骒xml的。当然xml的高级一些了。但是c3p0的配置文件名必须为c3p0-config.xml,并且必须放在类路径下。

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

    <default-config>

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="user">root</property>

       <property name="password">123</property>

       <property name="acquireIncrement">3</property>

       <property name="initialPoolSize">10</property>

       <property name="minPoolSize">2</property>

       <property name="maxPoolSize">10</property>

    </default-config>

    <named-config name="oracle-config">

       <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>

       <property name="driverClass">com.mysql.jdbc.Driver</property>

       <property name="user">root</property>

       <property name="password">123</property>

       <property name="acquireIncrement">3</property>

       <property name="initialPoolSize">10</property>

       <property name="minPoolSize">2</property>

       <property name="maxPoolSize">10</property>

    </named-config>

</c3p0-config>

 

  c3p0的配置文件中可以配置多个连接信息,可以给每个配置起个名字,这样可以方便的通过配置名称来切换配置信息。上面文件中默认配置为mysql的配置,名为oracle-config的配置也是mysql的配置

    public void fun2() throws PropertyVetoException, SQLException {

       ComboPooledDataSource ds = new ComboPooledDataSource();

       Connection con = ds.getConnection();

       System.out.println(con);

       con.close();

    }

    public void fun2() throws PropertyVetoException, SQLException {

       ComboPooledDataSource ds = new ComboPooledDataSource("orcale-config");

       Connection con = ds.getConnection();

       System.out.println(con);

       con.close();

    }

 

Tomcat配置连接池

Tomcat配置JNDI资源

JNDI(Java Naming and Directory Interface),Java命名和目录接口。JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源。

我们这里要配置的资源当然是连接池了,这样项目中就可以通过统一的方式来获取连接池对象了。

下图是Tomcat文档提供的:

 

配置JNDI资源需要到<Context>元素中配置<Resource>子元素:

l  name:指定资源的名称,这个名称可以随便给,在获取资源时需要这个名称;

l  factory:用来创建资源的工厂,这个值基本上是固定的,不用修改;

l  type:资源的类型,我们要给出的类型当然是我们连接池的类型了;

l  bar:表示资源的属性,如果资源存在名为bar的属性,那么就配置bar的值。对于DBCP连接池而言,你需要配置的不是bar,因为它没有bar这个属性,而是应该去配置url、username等属性。

 

<Context> 

  <Resource name="mydbcp"

                            type="org.apache.tomcat.dbcp.dbcp.BasicDataSource"

                            factory="org.apache.naming.factory.BeanFactory"

                            username="root"

                            password="123"

                            driverClassName="com.mysql.jdbc.Driver"   

                            url="jdbc:mysql://127.0.0.1/mydb1"

                            maxIdle="3"

                            maxWait="5000"

                            maxActive="5"

                            initialSize="3"/>

</Context> 

<Context> 

  <Resource name="myc3p0"

                            type="com.mchange.v2.c3p0.ComboPooledDataSource"

                            factory="org.apache.naming.factory.BeanFactory"

                            user="root"

                            password="123"

                            classDriver="com.mysql.jdbc.Driver"   

                            jdbcUrl="jdbc:mysql://127.0.0.1/mydb1"

                            maxPoolSize="20"

                            minPoolSize ="5"

                            initialPoolSize="10"

                            acquireIncrement="2"/>

</Context> 

获取资源

  配置资源的目的当然是为了获取资源了。只要你启动了Tomcat,那么就可以在项目中任何类中通过JNDI获取资源的方式来获取资源了。

下图是Tomcat文档提供的,与上面Tomcat文档提供的配置资源是对应的。

 

获取资源:

l Context:javax.naming.Context;

l InitialContext:javax.naming.InitialContext;

l lookup(String):获取资源的方法,其中”java:comp/env”是资源的入口(这是固定的名称),获取过来的还是一个Context,这说明需要在获取到的Context上进一步进行获取。”bean/MyBeanFactory”对应<Resource>中配置的name值,这回获取的就是资源对象了。

 

            Context cxt = new InitialContext();

            DataSource ds = (DataSource)cxt.lookup("java:/comp/env/mydbcp");

            Connection con = ds.getConnection();

            System.out.println(con);

            con.close();

            Context cxt = new InitialContext();

            Context envCxt = (Context)cxt.lookup("java:/comp/env");

            DataSource ds = (DataSource)env.lookup("mydbcp");

            Connection con = ds.getConnection();

            System.out.println(con);

            con.close();

 

  上面两种方式是相同的效果。

 

修改JdbcUtils

因为已经学习了连接池,那么JdbcUtils的获取连接对象的方法也要修改一下了。

JdbcUtils.java

public class JdbcUtils {

    private static DataSource dataSource = new ComboPooledDataSource();

 

    public static DataSource getDataSource() {

       return dataSource;

    }

 

    public static Connection getConnection() {

       try {

           return dataSource.getConnection();

       } catch (Exception e) {

           throw new RuntimeException(e);

       }

    }

}

Java-JDBC【之】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发,CPU磁盘占用情况 Java-JDBC【之】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发,CPU磁盘占用情况 1.数据库连接池 2.Durid介绍(官方文档) 3.编码,问题,常规并发操作 3.1.JDBCUtil.class 3.2.多线程模拟并发 3.3.测试类 3.4.结果(并发 1千、2千、3千、5千),报错信息 4.编码,解决,使用Durid连接池 4.1.JDBCUtil.class 4.2.多线程模拟并发 4.3.测试类 4.4.结果((20-200)不同连接 阅读详情

相关推荐

java通过jdbc连接Oracle通过数据库连接池实现增删改查

java通过jdbc连接Oracle通过数据库连接池实现增删改查

sunsiyuan521的博客 7669

JDBC 连接池 详解(通俗易懂)

JDBC 第五节 详解连接池 通俗易懂!

优快云 / 稀土掘金/ B站 / GitHub: Cyan_RA9 9385

重温JDBC(Java Database Connectivity) Java数据库连接 : JDBC快速入门、核心API讲解、Druid连接池、JDBC工具类封装

准备数据库。官网下载数据库连接驱动jar包。创建Java项目,在项目下创建lib文件夹,将下载的驱动jar包复制到文件夹里。选中lib文件夹右键->Add as Library,与项目集成。编写代码贾琏欲执事 (加载驱动-建立连接-编写SQL语句-执行SQL-释放连接资源)注册驱动【依赖的驱动类,进行安装】获取连接【Connection建立连接】创建发送SQL语句对象【Connection创建发送SQL语句的Statement】

Guizy 591

JDBC连接池

1.线程池 线程池是类似于操作系统中缓冲区的概念 先启动若干数量的线程并使其进入睡眠状态,当客户端发送一个请求时,线程池中就会唤醒一个线程进行处理 ,处理结束后该线程又会再次进入休眠状态。 线程池有什么用 当处理小规模应用时,为每一个请求单独创建一个线程是很方便的,因为并发量并不大。 当处理大规模应用时,为每一个请求单独创建一个线程将会变得非常耗费CPU内存和时间,甚至会带来难以预料的后果,这时使用线程池就能有效地解决此类问题,保证每个请求都能够有一个线程来处理的同时也能保证CPU的高性能。 2

qq_49608243的博客 895

JAVA——> 数据库连接池(c3p0和druid)以及Spring JDBC : JDBC Template

今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template Ps:本节内容需要导入jar包 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 2. 好处: 1. 节约资源 2. 用...

JAVA求生之路——博主406766467 297

从零开始:手把手教你理解UBOOT的BL0、BL1、BL2启动流程

本文详细解析了嵌入式系统中UBOOT启动流程的核心三阶段:BL0、BL1和BL2。BL0作为芯片固化的ROM代码,负责最基础的硬件初始化和加载BL1;BL1(SPL)作为二级程序加载器,在SRAM中运行并初始化DRAM,为加载BL2铺路;BL2则是完整的UBOOT主体,运行于DRAM,负责最终的外设初始化和操作系统引导。文章通过代码示例和流程图,手把手教你理解从芯片上电到系统就绪的完整接力过程。

qsc901234567的博客 1142

jdbc数据源配置最大连接数 mysql_请教高手设置数据库最大连接数如何设置?

2018-11-22 回答importjava.sql.*;importjava.sql.datasource;importorg.apache.commons.dbcp.basicdatasource;publicclassconnectionpool{privatestaticbasicdatasourcedbs=null;publicstaticdatasour...

weixin_31209173的博客 2594

单波束与多波束声呐:从原理到应用场景的全面解析

本文全面解析了单波束与多波束声呐的工作原理、核心特点及应用场景。单波束声呐如精准的狙击手,适合高精度需求;多波束声呐则像高效的散弹枪,适用于快速测绘和大面积覆盖。文章还提供了选型指南和前沿发展趋势,帮助用户根据预算和需求选择最适合的声呐技术。

weixin_30872157的博客 220

Java 的JDBC 数据库连接池实现方法

Java 的JDBC 数据库连接池实现方法 关键字: Java, JDBC, Connection Pool, Database, 数据库连接池, sourcecode  虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池,不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时,我们可用的JDBC 数据库连接池并不

jacklondon的专栏 1967

FreeRTOS OTA实战:从Bootloader设计到安全升级的完整流程(附MQTT示例代码)

本文详细介绍了在FreeRTOS系统中实现安全OTA固件升级的完整流程。内容涵盖从Bootloader设计、存储分区规划到与MQTT协议集成的OTA Agent任务开发,并重点解析了固件签名验证、防回滚等关键安全机制,为嵌入式物联网设备提供了一套高可靠性的远程升级解决方案。

weixin_29248653的博客 159

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 847

Java—JDBC 和数据库连接池

介绍了JDBC的基本原理、模拟实现及其优势,展示了Java通过JDBC API连接数据库、执行增删改查操作的具体步骤

2401_88623584的博客 1178

高通Camx功能feature分析之十:高通NCS服务之注册和启动

本文介绍了高通NCS(非相机传感器)服务的注册与启动流程。NCS通过QMI接口访问陀螺仪等传感器,为相机EIS/AEC等功能提供辅助数据。文章详细解析了服务注册时的QueryCapabilites能力查询、RegisterService注册流程,以及通过StartNCSService启动服务线程的过程。重点包括:1)AF/EIS等节点通过NCSService创建传感器对象;2)注册时需校验传感器类型和接口;3)首次注册成功后会启动NCS服务线程;4)采样率变化时需重新配置会话。通过线程池管理实现传感器数据的

1261

java 读取db3 数据库_JDBC java数据连接 读取properties 数据库连接池 预编译

1.创建连接,下载MySQL驱动(JDBC接口的实现类,就是一个jar包)public classDemo01 {public static voidmain(String[] args)throwsClassNotFoundException, SQLException {//1. 注册驱动 告诉虚拟机使用的是哪个数据库软件Class.forName("com.mysql.jdbc.Drive...

weixin_42518709的博客 683

fanuc机器人KAREL中 函数的应用

本次课程讲解编程的思路。很多的同学都玩过积木,一个一个的模块逐渐累积起来,通过彼此之间的相互联系,最终形成一个完整的整体。其实编程也是这样。 将一个对象根据其特点进行模块化拆分,尤其是一些特点非常相似的内容,将其变成一个模块。然后通过传递参数,实现不同的功能,这就是模块化编程。

haier123888的博客 2744

第1章 大数据概述

三次信息化浪潮 信息化浪潮 发生时间 标志 解决的问题 代表企业 第一次 1980年前后 个人计算机 信息处理 Intel、AMD、IBM、苹果、微软、联想、戴尔、惠普等 第二次 1995年前后 互联网 信息传输

wyz191的专栏 7088

【JAVA】Java高级:数据库监控与调优:如何监控JDBC连接池性能与数据库负载

通过上述示例,我们了解了如何使用Apache DBCP连接池来监控JDBC连接池的性能以及数据库的负载。监控连接池和数据库的性能对于确保应用程序的稳定性和高效性至关重要。通过合理配置连接池参数、定期监控连接池状态和数据库负载,可以有效提升系统的性能,避免潜在的性能瓶颈。在实际应用中,监控工具(如Prometheus、Grafana等)可以与JMX结合使用,提供更直观的监控界面和报警机制,帮助开发人员及时发现并解决性能问题。

thinking_chou的专栏 1762

智启古文字新章:AI、ML与大数据驱动的知识图谱构建

摘要:本文聚焦AI、ML与大数据驱动的古文字知识图谱构建。开篇点明古文字研究困境,凸显技术革新迫切性。随后阐释AI、ML、大数据基础概念,详解其在图谱构建里的数据采集、知识抽取、关系挖掘运作流程,穿插线性代数、概率论等数学原理。实战展示殷商甲骨文图谱搭建全程,含数据处理、模型训练。还探讨跨模态融合等前沿挑战应对,兼述技术融合衍生的教育科普革新、伦理文化责任、国际合作交流,勾勒古文字数字永生的长远愿景。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1614

Java数据库连接—JDBC(JDBC详解、JDBC控制事务、C3P0连接池、Druid连接池、Spring JDBC-JDBC Template)

reparedStatement可以在传入sql后,执行语句前,给参数赋值,避免了因普通的拼接sql字符串语句所带来的安全问题,而且准备sql和执行sql是在两个语句里面完成的,也提高了语句执行的效率 比如单引号会给你加一个转义,加个斜杠。为 false 表示禁用自动提交模式(在执行SQL语句之前开始事务)2、提交事务 void commit() 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁 (当所有事务中的SQL执行完就提交事务)

2401_84098033的博客 1025

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java--JDBC数据库连接池

Java--JDBC数据库连接池 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 概念 其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 好处 节约资源 用户访问高效 实现 标准接口:DataSource javax.sql包下的 获取连接:getConnection() 归还连接:Co

归子莫的博客 828

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java的JDBC数据库连接池实现方法

虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库连接池,不过对于开发一般的Java Application、 Applet或者JSP、velocity时,我们可用的JDBC数据库连接池并不多,并且一般性能都不好。 AD: 51CTO云计算架构师峰会 抢票进行中! ...

chunhuanlong7105的博客 136

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java jdbc数据库连接池总结

Java jdbc数据库连接池总结1. 引言   近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机  应用程序已从传统的桌面应用转到Web应用。基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早

wangaffection的专栏 874

IPTVnator Stalker Portal 开发指南:门户模式、会话认证、系列契约与代码归属

IPTVnator 的 Stalker Portal 支持覆盖 Live TV(`itv`)、Radio(`radio`)、VOD、Series 以及收藏/最近观看等完整流程。本文以 `.codex/skills/stalker-portal/SKILL.md` 为骨架,结合 [Stalker Portal 架构文档](https://link.gitcode.com/i/80d3246a162d

gitblog_00034的博客 615

java jdbc 连接池_用java实现JDBC数据库连接池

1 packagecn.com.css.cas.jdbc;23 importjava.sql.Connection;4 importjava.sql.Driver;5 importjava.sql.DriverManager;6 importjava.sql.SQLException;7 importjava.util.HashSet;8 importjava.util.Iterator;9 im...

weixin_39616339的博客 118

Java中如何优化JDBC数据库连接池性能?

数据库连接池负责创建、管理和释放数据库连接,以减少创建和关闭连接的开销,从而提高应用程序的性能。综上所述,优化JDBC数据库连接池性能需要从选择合适的连接池、合理配置参数以及注意使用细节等多个方面入手。合理的参数配置能够使连接池更加高效地管理和复用数据库连接,从而提高应用程序的性能。在Java中,有多个流行的数据库连接池可供选择,如HikariCP、C3P0、DBCP等。本文将深入探讨在Java中如何优化JDBC数据库连接池的性能,包括连接池的选择、配置以及使用中的注意事项。一、选择合适的数据库连接池。

AntonioMargery的博客 1043
上一篇: Java中JDBC的事务问题
下一篇: Java中IO流常见的几种流
午-夜
博客等级 码龄12年 95粉丝 133原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值