JDBC实现连接池

简单上手

使用 JDBC 来执行 SQL 查询和更新操作

import java.sql.*;public class Main {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/your_database_name";String username = "your_username";String password = "your_password";Connection connection = null;try {connection = DriverManager.getConnection(url, username, password);System.out.println("成功连接到数据库");// 查询操作String query = "SELECT * FROM your_table_name";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(query);// 打印查询结果while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("ID: " + id + ", Name: " + name);}// 更新操作String update = "UPDATE your_table_name SET name = 'New Name' WHERE id = 1";int rowsAffected = statement.executeUpdate(update);System.out.println("更新操作影响的行数: " + rowsAffected);} catch (SQLException e) {System.out.println("数据库操作失败:" + e.getMessage());} finally {if (connection != null) {try {connection.close();System.out.println("成功关闭数据库连接");} catch (SQLException e) {System.out.println("关闭数据库连接失败:" + e.getMessage());}}}}
}

下面展示一些 内联代码片

// A code blockvar foo = 'bar';
// An highlighted blockvar foo = 'bar';

实现JDBC连接池

JDBC 数据库连接池的示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;public class ConnectionPool {private static final int MAX_CONNECTIONS = 10; // 最大连接数限制private static final long CONNECTION_TIMEOUT = 5000; // 连接超时时间,单位毫秒private Vector<Connection> availableConnections = new Vector<>();private Vector<Connection> usedConnections = new Vector<>();public ConnectionPool(String url, String username, String password) {initializeConnectionPool(url, username, password);}private void initializeConnectionPool(String url, String username, String password) {while (!checkIfConnectionPoolIsFull()) {availableConnections.add(createNewConnection(url, username, password));}System.out.println("数据库连接池初始化完成,当前连接数: " + availableConnections.size());}private synchronized boolean checkIfConnectionPoolIsFull() {return (availableConnections.size() + usedConnections.size()) >= MAX_CONNECTIONS;}private Connection createNewConnection(String url, String username, String password) {try {return DriverManager.getConnection(url, username, password);} catch (SQLException e) {e.printStackTrace();return null;}}public synchronized Connection getConnection() throws SQLException {long startTime = System.currentTimeMillis();while (availableConnections.isEmpty()) {try {wait(CONNECTION_TIMEOUT);} catch (InterruptedException e) {e.printStackTrace();}if ((System.currentTimeMillis() - startTime) >= CONNECTION_TIMEOUT) {throw new SQLException("获取数据库连接超时");}}Connection connection = availableConnections.remove(availableConnections.size() - 1);usedConnections.add(connection);System.out.println("获取数据库连接,当前连接数: " + availableConnections.size());return connection;}public synchronized void releaseConnection(Connection connection) {if (connection != null) {usedConnections.remove(connection);availableConnections.add(connection);notifyAll();System.out.println("释放数据库连接,当前连接数: " + availableConnections.size());}}
}

在上面的示例代码中,我们增加了最大连接数限制和连接超时处理机制。当连接池中的连接数达到最大值时,新请求会等待一段时间,如果超过连接超时时间仍未获取到连接,则会抛出 SQLException 异常表示获取连接超时。同时,我们还通过控制台输出连接池的状态信息,方便跟踪连接的获取和释放情况。

测试

测试数据库连接池的最大连接数限制和连接超时处理机制:

public class ConnectionPoolTest {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/your_database_name";String username = "your_username";String password = "your_password";ConnectionPool connectionPool = new ConnectionPool(url, username, password);// 模拟多个线程同时请求数据库连接for (int i = 0; i < 15; i++) {Thread thread = new Thread(new Worker(connectionPool, i));thread.start();}}static class Worker implements Runnable {private ConnectionPool connectionPool;private int workerId;public Worker(ConnectionPool connectionPool, int workerId) {this.connectionPool = connectionPool;this.workerId = workerId;}@Overridepublic void run() {try (Connection connection = connectionPool.getConnection()) {System.out.println("Worker " + workerId + " 获取到数据库连接");// 模拟操作持有连接的时间Thread.sleep(3000);System.out.println("Worker " + workerId + " 完成操作,释放数据库连接");} catch (SQLException | InterruptedException e) {e.printStackTrace();}}}
}

关于SQLException
SQLException 是 Java 中的一个异常类,用于表示与数据库相关的异常。当使用 JDBC 连接数据库时,很多操作都可能会抛出 SQLException 异常,比如连接数据库、执行查询、更新数据等过程中出现的错误。

SQLExceptionjava.sql.SQLException 类的全名,它是 java.sql 包中的一个类,专门用于处理数据库操作可能出现的异常情况。该异常类提供了一系列方法,用于获取关于异常的详细信息,比如异常消息、SQL 状态码、引起异常的原因等,方便开发人员进行异常处理和调试。

在使用 JDBC 连接数据库时,通常会在代码中捕获 SQLException 异常,并根据具体情况进行异常处理,比如输出异常信息、回滚事务、关闭连接等操作,以确保程序的稳定性和可靠性。

下面是一个简单的示例,演示了如何捕获并处理 SQLException 异常:

import java.sql.*;public class Main {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/your_database_name";String username = "your_username";String password = "your_password";Connection connection = null;try {connection = DriverManager.getConnection(url, username, password);// 执行数据库操作...} catch (SQLException e) {System.out.println("数据库操作失败:" + e.getMessage());e.printStackTrace();} finally {if (connection != null) {try {connection.close();} catch (SQLException e) {System.out.println("关闭数据库连接失败:" + e.getMessage());e.printStackTrace();}}}}
}

在上面的示例中,我们在连接数据库和关闭数据库连接的过程中捕获了 SQLException 异常,并通过 e.getMessage() 方法获取异常信息进行输出。这样可以帮助我们更好地理解和处理与数据库交互过程中可能出现的异常情况。

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

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

相关文章

vs2015零基础编译zlib从失败到成功

本博文源于笔者不断尝试从0编译zlib到能够将文件打包成zip的一个简单过程&#xff0c;其中包含了如何下载zlib&#xff0c;如何编译zlib&#xff0c;如何使用zlib等。内容堪比教科书级别&#xff0c;可以收藏&#xff0c;可以自用&#xff0c;希望博文能帮助到读者。 1、下载z…

Protocol Buffers v21.12 安装 ( linux 系统 )

下载 Protocol Buffers v21.12 Protocol Buffers v21.12 解压 tar zxvf protobuf-cpp-3.21.12.tar.gz执行 进入解压目录&#xff0c;执行下面configure可执行程序&#xff0c;目的是监测安装环境&#xff0c;生成makefile ./configure执行完后可以检查是否生成makefile文件 构…

Unity单元测试

Unity单元测试是一个专门用于嵌入式单元测试的库, 现在简单讲下移植以及代码结构. 源码地址: GitHub - ThrowTheSwitch/Unity: Simple Unit Testing for C 1.我们只需要移植三个文件即可: unity.c, unity.h, unity_internals.h 2.然后添加需要测试的函数. 3.在main.c中添加…

Swift基础知识:23.Swift析构过程

在 Swift 中&#xff0c;析构过程是指在一个类的实例被释放之前进行的清理操作。通常&#xff0c;这些清理操作包括释放实例所持有的资源、取消订阅通知、关闭文件等。Swift 使用析构器&#xff08;deinitializer&#xff09;来实现析构过程&#xff0c;它类似于构造器&#xf…

公司文件防泄密管理系统

公司文件防泄密管理系统是一种综合性的解决方案&#xff0c;旨在确保企业文件的安全性和保密性&#xff0c;防止内部员工或外部攻击者非法获取、泄露或篡改敏感信息。 PC端&#xff1a;https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于…

【JavaEE】_form表单构造HTTP请求

目录 1. form表单的格式 1.1 form表单的常用属性 1.2 form表单的常用搭配标签&#xff1a;input 2. form表单构造GET请求实例 3. form表单构造POST请求实例 4. form表单构造法的缺陷 对于客户端浏览器&#xff0c;以下操作即构造了HTTP请求&#xff1a; 1. 直接在浏览器…

IDM下载器2024中文版主要功能、使用场景、优点、缺点介绍

软件分析师眼中的IDM&#xff08;Internet Download Manager&#xff09; IDM绿色下载如下: https://wm.makeding.com/iclk/?zoneid34275 一、主要功能 高速下载&#xff1a;利用多线程技术和文件分块下载策略&#xff0c;显著提高下载速度。断点续传&#xff1a;即使在下载…

【Linux】MySQL数据库的使用

【Linux】MySQL数据库的使用 一、访问MySQL数据库二、创建及删除库和表1、创建新的库2、创建新的表3、删除一个数据表4、删除一个数据库 三、管理表中的数据记录1、插入数据记录2、查询数据记录3、修改数据记录4、删除数据记录 四、数据库用户授权1、授予权限2、查看权限3、撤销…

db-gpt docker部署进坑

1.docker 不支持gpu&#xff0c;参考之前文章 2.docker 容器启动就关闭&#xff0c;docker ps -a 查看容器状态为exited 停止 定位问题&#xff1a; &#xff08;1&#xff09; 查看日志 docker logs dbgpt -f &#xff08;2&#xff09; 日志错误最后一行&#xff1a; V…

《图解HTTP》笔记1:http的诞生

1&#xff0c;http的诞生&#xff1a; 1.1 为共享知识而生 我们现在使用web&#xff08;World Wide Web的简称&#xff0c;即万维网&#xff09;浏览器&#xff0c;目前可以输入一个网址&#xff08;http://www.baidu.com)&#xff0c;就会有一个网页显示出来。 最开始设想出…

jenkins远程触发构建报:Error 403 No valid crumb was included in the request

最近在跨jenkins触发构建的时候发现不能触发相应的项目&#xff0c;报如下图错误 解决方案&#xff1a; 1、安装Build Authorization Token Root Plugin插件 安装完成后去配置API Token&#xff0c;用户列表&#xff0c;配置用户的API Token&#xff0c;生成后记得保存 2、项…

YOLOv9来啦!YOLO目标检测全新工作!性能表现SOTA!在各个方面都大大超过了RT-DETR、YOLOv8等

摘要 今天的深度学习方法侧重于如何设计最合适的目标函数&#xff0c;使模型的预测结果最接近实际情况。同时&#xff0c;必须设计一种适当的架构&#xff0c;该架构可以促进获取足够的信息用于预测。现有的方法忽略了一个事实&#xff0c;即当输入数据经过逐层特征提取和空间…

NXP实战笔记(五):S32K3xx基于RTD-SDK在S32DS上配置ADC的硬件触发同步采样与软件采样过程

目录 1、概述 1.1、软件触发 1.2、硬件触发 - BCTU 1.3、硬件触发 - TRGMUX 1.4、ADC的校准 1.5、ADC时钟配置 2、BTCU硬件触发ADC的SDK配置 3、软件触发ADC 3.1、选择相应Port作为ADC的输入 3.2、ADC配置 3.3、代码示例 1、概述 恩智浦 S32K3xx 系列汽车微控制器…

【Linux】再谈进程地址空间

目录 一、引入 二、物理内存和外设空间的交互 三、解决页表过大问题 一、引入 我们在往期的博客中有讲解过进程地址空间&#xff1a;【Linux】进程地址空间 但是在上述博客中我们只是对进程地址空间的左边部分详细进行了讲解&#xff0c;下面我们就来谈谈右边的部分&#…

第3.6章:StarRocks数据导入——DataX StarRocksWriter

一、Datax 1.1 DataX 3.0概述 DataX3.0是一个异构数据源离线同步工具&#xff0c;可以方便的对各种异构数据源进行高效的数据同步。 其github地址为&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.mdhttps://github.com/alibaba/DataX/blob/mast…

盘点那些世界名校计算机专业采用的教材

清华、北大、MIT、CMU、斯坦福的学霸们在新学期里要学什么&#xff1f;今天我们来盘点一下那些世界名校计算机专业采用的教材。 书单目录 1.《深入理解计算机系统》&#xff08;原书第3版&#xff09;2. 《算法导论》&#xff08;原书第3版&#xff09;3. 《计算机程序的构造和…

el-table增加/编辑打开el-dialog内嵌套el-form,解决编辑重置表单不成功等问题

需求&#xff1a;在做表格的增删改查&#xff0c;其中新增和编辑弹窗都是同一个弹窗&#xff0c;之后有个重置按钮&#xff0c;需要用户输入的时候可以重置清空等。本文章解决如下问题 1.就是在编辑数据回填后点击重置表单没有清空也没有报错 2.解决清空表单和表格数据相互影响…

10.docker exec -it /bin/bash报错解决、sh与bash区别

报错 进入容器时&#xff0c;报如下错误 dockeruserdell-PowerEdge-R740:~$ docker exec -it daf2 /bin/bash OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown…

常用的Web应用程序的自动测试工具有哪些

在Web应用程序的自动化测试领域&#xff0c;有许多流行的工具可供选择。以下是一些常用的Web自动化测试工具&#xff1a; 1. Selenium - Selenium是最流行的开源Web应用程序自动化测试套件之一。 - 它支持多种编程语言&#xff0c;如Java、C#、Python、Ruby等。 …

Python——multiprocessing报错:TypeError: cannot pickle ‘_thread.lock‘ object

多进程报错 Traceback (most recent call last):File "C:\Users\miaochangbin\PycharmProjects\eduCrawler\main.py", line 138, in <module>p.start()File "D:\Program Files\python\lib\multiprocessing\process.py", line 121, in startself._po…