JDBC Part5 DataSource 连接池操作

- javax.sql.DataSource 接口,通常由服务器实现

- DBCP  Tomcat自带相对C3P0速度较快,但存在BUG,已经不更新了

- Proxool  没听过、能监控连接池状态,稳定性差

- C3P0  速度较慢,但是稳定

- Druid  阿里巴巴提供,集成上面的所有优点,

- Hikari  目前最快的连接池依赖,据说有安全问题。。。

DataSource被称为数据源,包含连接池和连接池管理2部分


C3P0实现

官方文档:  https://blog.csdn.net/wangwei_cq/article/details/8930667

Maven依赖

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>

第一种,硬编码的连接池

package connector;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test; import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException; /**
* @author ArkD42
* @file Jdbc
* @create 2020 - 04 - 24 - 17:49
*/
public class C3P0Test { @Test
public void dataSourceByC3p0() throws PropertyVetoException, SQLException {
// 获取池对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 配置连接信息
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc_db?serverTimezone=Asia/Shanghai");
dataSource.setUser("root");
dataSource.setPassword("123456");
//设置初始的连接数
dataSource.setInitialPoolSize(10);
//获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}

测试结果

第二种 XML配置文件

配置XML配置文件的信息

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<!-- 自定义的配置命名-->
<named-config name="c3p0 XML config"> <!-- 四个基本信息 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!-- 默认本地可以省略 jdbc:mysql:///jdbc_db?serverTimezone=Asia/Shanghai -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_db?serverTimezone=Asia/Shanghai</property>
<property name="user">root</property>
<property name="password">123456</property> <!-- 连接池管理信息 --> <!-- 连接对象数不够时,每次申请 迭增的连接数 -->
<property name="acquireIncrement">5</property>
<!-- 初始池大小存放的连接对象数 -->
<property name="initialPoolSize">10</property>
<!-- 最小连接对象数 -->
<property name="minPoolSize">10</property>
<!-- 最大连接对象数,不可超出的范围 -->
<property name="maxPoolSize">100</property>
<!-- 最多维护的SQL编译对象个数-->
<property name="maxStatements">50</property>
<!-- 每个连接对象最多可使用的SQL编译对象的个数 -->
<property name="maxStatementsPerConnection">2</property>
</named-config>
</c3p0-config>

注意获取配置名

如果密码错误,其他配置问题,连接池运行一段时间获取不到连接自动超时退出,报异常


封装JdbcForC3P0Util工具类

import java.sql.*;
import java.util.ArrayList;
import java.util.List; /**
* @author ArkD42
* @file Jdbc
* @create 2020 - 04 - 24 - 18:23
*/
public class JdbcForC3p0Util { // 池对象只需要一个即可
private static final ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("c3p0 XML config"); // 获取连接对象,从池对象获取的对象可允许多个
public static Connection getConnection(){
try {
return comboPooledDataSource.getConnection();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return null;
} // 释放资源 对象没有的情况直接null注入
public static void releaseResource(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
try{
if (resultSet != null) resultSet.close();
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException sqlException){
sqlException.printStackTrace();
}
} // 增删改
public static int update(String sql,Object[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = getConnection();
preparedStatement = connection.prepareStatement(sql);
if (args != null ) for (int i = 0; i < args.length; i++) preparedStatement.setObject(i+1,args[i]);
int i = preparedStatement.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
} finally {
releaseResource(connection,preparedStatement,null);
}
return 0;
} // 查询
public static <T> List<T> queryList(Class<T> tClass, String sql, Object[] args){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try{
connection = getConnection();
preparedStatement = connection.prepareStatement(sql);
if (args != null) for (int i = 0; i < args.length; i++) preparedStatement.setObject(i+1,args[i]);
resultSet = preparedStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
List<T> tList = new ArrayList<T>();
while(resultSet.next()){
T t = tClass.newInstance();
for (int i = 0; i < columnCount; i++) {
Object columnValue = resultSet.getObject(i + 1);
String columnLabel = metaData.getColumnLabel(i + 1);
Field field = tClass.getDeclaredField(columnLabel);
field.setAccessible( true );
field.set(t,columnValue);
}
tList.add(t);
}
return tList;
} catch (Exception e){
e.printStackTrace();
} finally {
releaseResource(connection,preparedStatement,resultSet);
}
return null;
}
}

测试,Blob不可封装为实体类对象,所以大文件的字段我删除了


DBCP 连接池操作

Maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp2</artifactId>
  <version>2.7.0</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
  <version>2.8.0</version>
</dependency>

连接实现一,硬编码连接

public class DBCP {

    @Test
public void dbcp() throws Exception{
// 创建连接池
BasicDataSource dataSource = new BasicDataSource(); // 配置信息
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///jdbc_db?serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("123456"); // 连接池管理设置
//dataSource.setInitialSize(10); // 初始化池种的连接对象个数
//dataSource.setMaxIdle(10); // 最大空闲连接对象个数
//dataSource.setMinIdle(2); // 最小空闲连接对象个数 // 获取连接对象
Connection connection = dataSource.getConnection(); System.out.println(connection);
connection.close();
}
}

测试结果


连接实现二,读取配置文件

dbcp.properties配置文件的信息

# 注意这个driverClassName
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql:///jdbc_db?serverTimezone=Asia/Shanghai
# 注意这个username
username = root
password = 123456

测试单元

    @Test
public void dbcp2() throws Exception{
InputStream inputStream = DBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties properties = new Properties();
properties.load(inputStream);
BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}

第一种获取方式【通用】

InputStream inputStream = DBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");

第二种获取方式

// Maven工程的读取路径
InputStream inputStream = new FileInputStream(new File("src/main/resources/dbcp.properties")); // 普通工程的读取路径
InputStream inputStream = new FileInputStream(new File("src/dbcp.properties"));

第三种获取方式【通用,防空格中文编码不读取】

String file = DBCP.class.getClassLoader().getResource("dbcp.properties").getFile();
String decode = URLDecoder.decode(file, "utf-8"); //System.out.println(file);
//System.out.println(decode); InputStream inputStream = new FileInputStream(decode);

测试结果

JdbcDbcpUtil 工具类封装

public class JdbcDbcpUtil {

    private static DataSource dataSource = null;

    static {
String path = JdbcDbcpUtil.class.getClassLoader().getResource("dbcp.properties").getFile();
System.out.println(path);
try {
String decode = URLDecoder.decode(path, "utf-8");
InputStream inputStream = new FileInputStream(decode);
Properties properties = new Properties();
properties.load(inputStream);
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
} public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return null;
} }

测试结果


Druid连接池实现

Maven依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>

硬编码连接

    @Test
public void dt1() throws SQLException {
DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///jdbc_db?serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("123456"); DruidPooledConnection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}

读取配置文件,读取方式跟DBCP几乎一样,配置文件都不需要改

    @Test
public void dt2() throws Exception {
String path = DruidTest.class.getClassLoader().getResource("dbcp.properties").getFile();
String decode = URLDecoder.decode(path, "utf-8");
FileInputStream inputStream = new FileInputStream(decode);
Properties properties = new Properties();
properties.load(inputStream);
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}

JdbcDruidUtils 工具类封装

【对着DBCP的直接改连接池工厂就完事了】

public class JdbcDruidUtil {

    private static DataSource dataSource = null;

    static {
String path = JdbcDbcpUtil.class.getClassLoader().getResource("druid.properties").getFile();
System.out.println(path);
try {
String decode = URLDecoder.decode(path, "utf-8");
InputStream inputStream = new FileInputStream(decode);
Properties properties = new Properties();
properties.load(inputStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
} public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
return null;
}
}

【Java】JDBC Part5 DataSource 连接池操作的更多相关文章

  1. Java java jdbc thin远程连接并操作Oracle数据库

    JAVA jdbc thin远程连接并操作Oracle数据库 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 编码工具:Eclipse 编码平台:W ...

  2. eclipse下jdbc数据源与连接池的配置及功能简介

    今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急 ...

  3. CP30 ---DataSource连接池的创建过程

    1.参看CP30文档quickStart 如下具体创建步骤 public DataSource getDs() throws Exception { //创建连接池对象 ComboPooledData ...

  4. Java自己动手写连接池四

    Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...

  5. Java自己动手写连接池三

    Java自己动手写连接池三,核心代码; package com.kama.cn; import java.sql.Connection;import java.util.ArrayList;impor ...

  6. Java 使用 DBCP mysql 连接池 做数据库操作

    需要的jar包有 commons-dbutils , commons-dbcp , commons-pool , mysql-connector-java 本地database.propertties ...

  7. jdbc事务处理和连接池

    JDBC: * JDBC概念:Java DataBase Connectivity(Java数据库连接) SUN公司提供的一组连接数据库API. * JDBC开发步骤: * 1.注册驱动. * 2.获 ...

  8. jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

    一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数 ...

  9. JAVA中事物以及连接池

    一.事物 什么是事物? 事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元.这些单元要么全都成功,要么全都不成功. 做一件事情,这个一件事情中有多个 ...

  10. Spring整合JDBC和Druid连接池

    我的博客名为黑客之谜,喜欢我的,或者喜欢未来的大神,点一波关注吧!顺便说一下,双十二快到了,祝大家双十二快乐,尽情的买买买~ 如果转载我的文章请标明出处和著名,谢谢配合. 我的博客地址为: https ...

随机推荐

  1. k8s核心组件详解和分层架构

    k8s核心组件 master中的核心组件 api-server(接口服务,基于rest风格开放k8s接口的服务) kube-controller-manager(管理各个类型的控制器,针对k8s中的各 ...

  2. zookeeper:Unexpected exception, exiting abnormally ::java.io.EOFException

    转载请注明出处: 服务器中断,重启服务器在重启kafka服务时,遇到如下报错: 2024-06-05 13:52:56,251 [myid:] - ERROR [main:ZooKeeperServe ...

  3. react的反向代理

    在配置在src文件夹中setupProxy.js文件,并通过npm安装http-proxy-middleware,代理中间件模块 npm i -S http-proxy-middleware 配置反向 ...

  4. webpack代码分割

    在做一些单页应用中,若不做任何处理,所有项目文件会打包为一个文件,这个文件非常的大,造成网页在首次进入时比较缓慢.做了代码分割后,会将代码分离到不同的chunk中,然后进行按需加载这些文件,能够提高页 ...

  5. vue局部注册

    只能在当前注册它的vue实例中使用,通过某个 Vue 实例/组件的实例选项 components 注册仅在其作用域中可用的组件 var Child = { template: '<div> ...

  6. OpenAI正式发布第一个官方.NET版本库的测试版

    尽管 Microsoft 和 OpenAI 长期以来一直是紧密相连的合作伙伴,但他们现在才开始为 .NET 开发人员发布官方 OpenAI 库,加入现有的社区库.这项工作的第一个测试版是支持 .NET ...

  7. 夜莺监控发布 v6.7 版本,推送部分商业版功能

    熟悉夜莺的小伙伴都知道夜莺分为开源版.专业版.企业版,三个版本良性发展.近期夜莺团队发布了 v6.7 版本,把机器Metadata管理功能推送到了开源版,下面是该功能的简单介绍. 如上图,机器列表页面 ...

  8. 如何将 iPhone 的照片同步到 windows 电脑上

    首先在电脑上,新建一个文件夹,并把共享权限打开. 文件夹 右键 属性,共享,添加 Everyone. 然后,让手机和电脑连接到同一个局域网,手机热点即可. 在手机端看 文件 app,找到电脑的共享文件 ...

  9. Sealos 5.0 正式发布,云本应该是操作系统

    把所有资源抽象成一个整体,一切皆应用,这才是云应该有的样子. 2018 年 8 月 15 日 Sealos 提交了第一行代码. 随后开源社区以每年翻倍的速度高速增长. 2022 年我们正式创业,经历一 ...

  10. TrustZone与高通

    改编自:https://blog.csdn.net/guyongqiangx/article/details/78020257 介绍 导读 Q:什么是Trust Zone A:Trust Zone:是 ...