JDBC小记——连接池

news2024/11/23 9:07:27

目录

连接池介绍

常用连接池

DBCP连接池

硬编码方式

配置文件方式

C3P0连接池

C3P0和DBCP的区别

硬编码方式

配置文件方式

Druid连接池

硬编码方式

配置文件方式

DBUtils


连接池介绍

由于建立数据库连接是一种非常耗时、耗资源的行为,所以预先通过连接池创建一些连接,放在内存中,当程序需要建立数据库连接时,直接在连接池中申请一个,使用完毕再还回去。连接池就跟线程池一样,使用时申请,使用结束归还。数据库连接由连接池分配、管理、和释放,一个程序能重复使用一个连接池中的连接,而不用重复创建,还可以设置连接池的初始连接数,最大最小连接数等。

常用连接池

DBCP连接池

DBCP(DataBase Connextion Pool)——数据库连接池

由Apache开发,数据库连接池自动管理数据库连接的分配和释放。

硬编码方式

使用步骤:

1.导入DBCP的jar包

2.硬编码,自己创建连接池对象

BasicDataSource ds = new BasicDataSoue();

3.配置连接参数

BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/lianxi");
        ds.setUsername("root");
        ds.setPassword("123456");
        ds.setInitialSize(20);
        ds.setMaxWait(2000);

配置参数有很多,这里只写几个。

4.从连接池中获取连接对象

Connection conn = ds.getConnection();
        String sql="select * from user";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            int id = resultSet.getInt(1);
            String uname = resultSet.getString(2);
            String pwd = resultSet.getString(3);
            System.out.println(id+"==="+uname+"==="+pwd);
        }

完整代码:

package org.xingyun.demo2;

import org.apache.commons.dbcp.BasicDataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBCPdemo {
    public static void main(String[] args) throws SQLException {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/lianxi");
        ds.setUsername("root");
        ds.setPassword("123456");
        ds.setInitialSize(20);
        ds.setMaxWait(2000);
        Connection conn = ds.getConnection();
        String sql="select * from user";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            int id = resultSet.getInt(1);
            String uname = resultSet.getString(2);
            String pwd = resultSet.getString(3);
            System.out.println(id+"==="+uname+"==="+pwd);
        }

        conn.close();
        preparedStatement.close();
        resultSet.close();

    }
}

配置文件方式

建立配置文件dbcp.properties

#连接基本设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/lianxi
username=root
password=123456


#<!--扩展配置 了解-->
#初始化连接
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
package org.xingyun.demo2;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

public class DBCPdemo2 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        //读取配置文件
        properties.load(new FileInputStream("src/dbcp.properties"));
        //创建连接池对象
        DataSource ds = BasicDataSourceFactory.createDataSource(properties);
        //获取连接对象
        Connection conn = ds.getConnection();
        String sql="select * from user";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            int id = resultSet.getInt(1);
            String uname = resultSet.getString(2);
            String pwd = resultSet.getString(3);
            System.out.println(id+"==="+uname+"==="+pwd);
        }
    }
}

C3P0连接池

它是一个开源的连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。

C3P0和DBCP的区别

1.DBCP不能自动回收空闲的连接

2.C3P0可以自动回收空闲的连接

硬编码方式

1.导入C3P0的jar包

2.创建连接池对象

ComboPooledDataSource ds = new ComboPooledDataSource();

3.配置连接参数

ds.setDriverClass("com.mysql.jdbc.Driver");
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/lianxi");
        ds.setUser("root");
        ds.setPassword("123456");

4.获取连接对象以及之后的操作和之前一样

完整代码

package org.xingyun.demo2;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0demo {
    public static void main(String[] args) throws PropertyVetoException, SQLException {
        //创建连接池对象
        ComboPooledDataSource ds = new ComboPooledDataSource();
        //配置连接参数
        ds.setDriverClass("com.mysql.jdbc.Driver");
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/lianxi");
        ds.setUser("root");
        ds.setPassword("123456");
        //获取连接对象
        Connection conn = ds.getConnection();

        System.out.println(conn);




    }
}

配置文件方式

C3P0配置文件的方式,对配置文件有要求。

1.配置文件名是固定的——c3p0.properties

2.配置文件的位置也是固定的,放在src下

package org.xingyun.demo2;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.Connection;
import java.sql.SQLException;

public class C3P0demo2 {
    public static void main(String[] args) throws SQLException {
        ComboPooledDataSource ds = new ComboPooledDataSource();
        Connection conn = ds.getConnection();
        System.out.println(conn);
    }
}

在使用C3P0连接池时,配置文件不用我们自己读取,它会读取,并配置好连接参数。我们只需要直接用就可以了。

Druid连接池

Druid(德鲁伊)连接池是阿里巴巴开源的一个数据库连接池,结合了DBCP、C3P0等连接池的优点,同时加入了日志监控,可以很好地监控数据库连接和sql的执行情况,得优于监控,为监控而生。

硬编码方式

1.导入德鲁伊得jar包

 2.创建连接池

DruidDataSource dataSource = new DruidDataSource();

3.配置路径参数和获取连接对象和DBCP连接池一样

package org.xingyun.demo2;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;

import java.sql.SQLException;

public class Druiddemo {
    public static void main(String[] args) throws SQLException {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/lianxi");
        ds.setUsername("root");
        ds.setPassword("123456");
        DruidPooledConnection conn = ds.getConnection();
        System.out.println(conn);
    }
}

配置文件方式

druid.properties

#基本配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/crm
username=root
password=123456
#可选配置
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
package org.xingyun.demo2;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;

public class Druiddemo2 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource ds = DruidDataSourceFactory.createDataSource(properties);
        Connection conn = ds.getConnection();
        System.out.println(conn);

    }
}

DBUtils

Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,

使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。 

使用步骤:

1.导入jar包

2. 创建对象

Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource ds = DruidDataSourceFactory.createDataSource(properties);
        //把连接池对象传给QueryRunner
        QueryRunner queryRunner = new QueryRunner(ds);

 3.执行sql

查询:
 

 List<Bank> list = queryRunner.query("select * from bank", new BeanListHandler<Bank>(Bank.class));
        for (Bank bank : list) {
            System.out.println(bank);
        }

插入:

package org.xingyun.demo2;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.xingyun.bean.Bank;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;

public class DButilsdemo2 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource ds = DruidDataSourceFactory.createDataSource(properties);
        //把连接池对象传给QueryRunner
        QueryRunner queryRunner = new QueryRunner(ds);
        int i = queryRunner.update("insert into bank(username,money) values(?,?)","wangqi", 2000);
        System.out.println(i);
    }
}

更新:

package org.xingyun.demo2;

        import com.alibaba.druid.pool.DruidDataSourceFactory;
        import org.apache.commons.dbutils.QueryRunner;
        import org.apache.commons.dbutils.handlers.BeanListHandler;
        import org.xingyun.bean.Bank;

        import javax.sql.DataSource;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.util.Properties;

public class DButilsdemo2 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource ds = DruidDataSourceFactory.createDataSource(properties);
        //把连接池对象传给QueryRunner
        QueryRunner queryRunner = new QueryRunner(ds);
        int i = queryRunner.update("update bank set username=?,money=? where id=?", "zhangjie", 20000, 3);
        System.out.println(i);
    }
}


 

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

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

相关文章

在vite+vue3项目中配置使用css预处理器(less/sass)以及路径别名

一、在vite项目中使用css预处理器 vite已经将这些预处理器的loader内置了&#xff0c;我们不用再像在webpack项目中那样&#xff0c;需要下载和配置一堆相关的loader&#xff0c;我们只需要下载less&#xff0c;sass依赖&#xff0c;就能直接在项目中使用啦 使用npm或者yarn来…

Springboot-- 注解字段校验,并统一设置返回值

Springboot-- 注解字段校验&#xff0c;并统一设置返回值 引包&#xff1a;import org.springframework.validation.annotation.Validated; <!--web--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

配置鼠标右键菜单功能 :一键csv转excel

配置右键菜单功能 &#xff1a;一键csv转excel 无需点开文件&#xff0c;双击即可以生成新的excel文件 步骤&#xff1a; 1、配置Python&#xff0c;安装依赖库 pip install openpyxl pip install pandas2、创建Python文件 csv_to_excel.py # -*- coding:utf-8 -*- impor…

【计算机组成原理】函数栈帧

目录 一、源代码理论分析 二、主函数的创建 三、c语言代码的汇编 注&#xff1a;不同编译器环境的函数栈帧存在一定差异&#xff0c;本文使用VS2019 一、源代码理论分析 源代码&#xff1a; int Add(int x, int y) {int z 0;z x y;return z; }int main() {int a 10;…

u盘安装centos 7

1.下载 通过阿里云站点&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64/&#xff0c;下载iso文件。 2.制作启动u盘镜像 2.1 下载制作工具 下载u启动 http://uqidong.als98.cn/ 。 2.2 制作镜像 准备u盘&#xff0c;插入机器&#xff0c;运行u启动。 注意…

机器学习之基于PCA的人脸识别

目录 PCA人脸数据降维 matlab代码实现 思路分析 PCA人脸重构 matlab代码实现 思路分析 PCA人脸可视化 matlab代码实现 思路分析&#xff1a; PCA人脸识别 matlab代码实现 思路分析 PCA人脸数据降维 matlab代码实现 picturesdir(C:\Users\Yezi\Desktop\机…

数字逻辑与模拟电子技术-部分知识点(2)——模电部分-半导体三极管、基本线性运放电路、正弦波振荡电路

目录 半导体三极管 三极管的放大的条件 基本放大电路计算 基本线性运放电路 同相放大电路 反相放大电路 加法器放大电路 正弦波振荡电路 正弦波振荡的条件 半导体三极管 三极管的放大的条件 主要是依靠它的发射极电流能够通过基区传输&#xff0c;然后到达集电极而实现…

【KMP算法】时间复杂度O(N)的字符串匹配算法

目录 案例&#xff1a;假定我们给出字符串 ”ababcabcdabcde”作为主串&#xff0c; 然后给出子串&#xff1a; ”abcd”,现在我们需要查找子串是否在主串中 出现&#xff0c;出现返回主串中的第一个匹配的下标&#xff0c;失败返回-1 ; 1.BF算法&#xff08;暴力算法&#x…

java8新特性之--强大的Stream API详细讲解

强大的Stream API Stream API说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则 是 Stream API。Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中。 这是目前为止对Java类库最好的补充&#xff0c;因为Stream API可以极…

CVPR 23 | 高分辨率缺陷异常定位新范式:PyramidFlow

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2303.02595 论文代码&#xff1a;暂未发布 0. 背景 由于复杂的工业制造过程中的不可控因素&#xff0c;不可避免地会给产品带来不可预见的缺陷。由于人类视觉系…

使用亮数据Bright Data解决出境电商问题

目录 一、出境电商的困境和问题1、困境一&#xff1a;获取准确的市场数据&#xff08;1&#xff09;数据的时效性和可靠性&#xff08;2&#xff09;数据的全面性和多样性&#xff08;3&#xff09;数据的实时更新和持续监测 2、困境二&#xff1a;克服地域限制和语言障碍&…

scratch数星星 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch数星星 一、题目要求 1、准备工作 2、功能实现 二、案例分析

基于Java学生信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

vue中js实现点击复制文本到剪贴板-三种方案

vue中js实现点击复制文本到剪贴板-三种方案 因为在网上找了一些很杂乱 不适用 所以自己写一篇记录分享一下 vue中js实现点击复制文本到剪贴板-三种方案 效果&#xff1a; 方案一&#xff1a;使用原生API&#xff08;clipboard&#xff09; 首先&#xff0c;我们需要安装clip…

【嵌入式5】电源相关芯片驱动

文章目录 1.读MPS5023芯片&#xff1a;0x03ff即将前6位屏蔽2.读PXE1410CDM电压和电流&#xff1a;一个数&0x7ff&#xff0c;将这个数前5位全变为0&#xff0c;其余位不变2.1 1ine11&#xff1a;先看第15和10位&#xff0c;e9b6是上面读出的值2.2 1ine16&#xff1a;PMBUS协…

产品的0到1概念篇

一、产品是什么&#xff1f; 产品是指被人们使用和消费&#xff0c;并能满足人们某种需求的任何东西&#xff0c;包括有形的物品、无形的服务、组织、观念或它们的组合。 产品本质是什么&#xff0c;产品的本质就是解决⽤户的痛点/满⾜⽤户的需求&#xff0c;这种满⾜的需求&…

KingbaseES的学习心得和知识总结(二)|Kingbase数据库闪回功能及插件kdb_flashback的使用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、KingbaseES V8产品文档首页&#xff0c;点击前往 2、Kingbase 文档库&#xff0c;点击前往 3、北京人大金仓信息技术股份有限公司 官网首页&#xff0c;点击前往…

详解服务器端渲染 页面(SSR)

&#x1f48c;目录 &#x1f525;先了解服务器端渲染 (SSR)&#xff1f;&#x1f525;服务器端渲染的优点是什么呢&#xff1f;&#x1f525;有优点就有缺点&#xff1f;&#x1f525;根据Express来简单的建立一个服务端渲染 &#x1f525;先了解服务器端渲染 (SSR)&#xff1f…

Qt6.2教程——7.QT常用控件QTextEdit

一&#xff0c;QTextEdit简介 QTextEdit 是 Qt 的一个用于编辑和显示纯文本和富文本的控件。它是功能强大且高度灵活的&#xff0c;可以用于实现多种任务&#xff0c;如文本编辑&#xff0c;数据表示&#xff0c;以及HTML的显示和编辑等。QTextEdit 支持富文本功能&#xff0c…

Over 函数的使用

序言 其实也很少使用这个Over函数,毕竟mysql在5.7版本之前都是不支持的,但是over()的窗口概念被Flink中的窗口中借鉴了. 所以了解下,网上的Over()的使用有在Mysql中的例子,但是我的Mysql5.7 不支持,所以在Oracle中实验.但是语法都是一样的.cuiyaonan2000163.com 众所周知如果S…