Java实现数据库连接池简易教程

Java实现数据库连接池简易教程

在Java web开发中,经常会使用到数据库连接池技术,它可以缓存一定数量的数据库连接,通过再次请求时,优先从连接池中获取已有的连接,而不是重新创建连接,从而提高程序的性能和响应速度。在这里,我们将详细讲解如何使用Java语言来实现一个简单的数据库连接池。

步骤

第一步:创建连接池

首先,我们需要创建连接池,代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;

public class ConnectionPool {
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://localhost:3306/test";
    private static final String username = "root";
    private static final String password = "123456";
    private static final int initSize = 5;
    private static final int maxSize = 10;
    private ArrayList<Connection> pool = new ArrayList<>();

    public ConnectionPool() {
        for (int i = 0; i < initSize; i++) {
            try {
                Class.forName(driver);
                Connection conn = DriverManager.getConnection(url, username, password);
                pool.add(conn);
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized Connection getConnection() {
        Connection conn = null;
        if (pool.size() > 0) {
            conn = pool.remove(0);
        } else {
            if (pool.size() < maxSize) {
                try {
                    Class.forName(driver);
                    conn = DriverManager.getConnection(url, username, password);
                } catch (ClassNotFoundException | SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return conn;
    }

    public synchronized void release(Connection conn) {
        if (pool.size() < maxSize) {
            pool.add(conn);
        } else {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

以上代码中,我们使用了ArrayList集合来创建连接池pool,其中initSize为连接池的初始大小,maxSize为连接池的最大大小(即连接池最大可存储的连接数)。getConnection()方法用于从连接池中获取连接,如果连接池中有连接,则直接获取并返回,否则如果连接池未达到最大大小,则创建新的连接返回。release()方法用于将使用过的连接归还到连接池中。

第二步:测试

接下来,我们使用测试代码来验证我们的连接池是否正常工作,测试代码如下:

public class Test {
    public static void main(String[] args) {
        ConnectionPool pool = new ConnectionPool();
        for (int i = 0; i < 15; i++) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    Connection conn = pool.getConnection();
                    try {
                        // 这里执行对数据库的相关操作
                        Statement stmt = conn.createStatement();
                        ResultSet rs = stmt.executeQuery("SELECT * FROM user");
                        while(rs.next()){
                            String userName = rs.getString("name");
                            String userAge = rs.getString("age");
                            System.out.println("name: " + userName + " | age: " + userAge);
                        }
                        rs.close();
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    pool.release(conn);
                }
            });
            t.start();
        }
    }
}

运行测试代码后,我们可以看到输出结果中每个线程一次性获取多个连接进行数据库操作,证明连接池正常工作。

示例说明

示例1:使用连接池进行数据库操作

我们可以看到,在测试代码中,我们每次使用getConnection()方法来获取数据库连接,并使用release()方法将连接归还到连接池中。在获取到连接后,我们使用Statement来进行生成查询的SQL,并使用ResultSet来获取执行结果。

Connection conn = pool.getConnection();
try {
    // 这里执行对数据库的相关操作
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM user");
    while(rs.next()){
        String userName = rs.getString("name");
        String userAge = rs.getString("age");
        System.out.println("name: " + userName + " | age: " + userAge);
    }
    rs.close();
    stmt.close();
} catch (SQLException e) {
    e.printStackTrace();
}
pool.release(conn);

示例2:改变连接池大小

我们可以看到,在连接池构造函数中,我们将连接池的初始大小设置为5:

private static final int initSize = 5;

而在getConnection()方法中,我们使用了if语句判断当前连接池中连接的数量是否大于0,如果大于0,则取出最先加入到连接池中的连接,如果没有连接,则创建新的连接。而在release()方法中,我们使用了if语句判断连接池的大小是否达到最大值,如果没有,则将使用过的连接放回连接池中,否则关闭该连接。

如果将initSize改为10,则连接池初始化的时候,将会创建10个数据库连接:

private static final int initSize = 10;

如果将maxSize改为20,则连接池最大可存储的连接数将变为20,连接数可继续增加:

private static final int maxSize = 20;

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现数据库连接池简易教程 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java 实现使用Comparable按照我们指定的规则排序

    下面是详细讲解“Java 实现使用 Comparable 按照我们指定的规则排序”的攻略: 一、使用 Comparable 接口 Comparable 接口是 Java 中的一个接口,它有一个 compareTo 方法,用于指定对象排序的规则。如果一个类实现了 Comparable 接口,就可以使用 Collections.sort 或 Arrays.sor…

    Java 2023年5月27日
    00
  • Spring Boot + Mybatis-Plus实现多数据源的方法

    下面我将为你详细讲解 Spring Boot + Mybatis-Plus 实现多数据源的方法的完整攻略。 1. 概述 在实际开发中,可能会遇到需要同时连接多个数据源的情况。比如,我们需要从数据库A中获取数据,然后存储到数据库B中。或者,我们需要从两个不同的数据库中获取数据,进行一些关联查询和操作。这时候,就需要用到多数据源的技术。 在 Spring Boo…

    Java 2023年5月20日
    00
  • SpringMVC接收页面表单参数

    SpringMVC是一个非常流行的Java Web框架,它提供了很多方便的功能。其中之一就是接收页面表单参数。本文将详细讲解如何使用SpringMVC接收页面表单参数,并提供两个示例来说明如何实现这一过程。 示例一:接收单个参数 以下是一个示例演示如何使用SpringMVC接收单个参数: 创建一个名为myproject的Maven项目。 添加SpringMV…

    Java 2023年5月17日
    00
  • SpringMVC访问静态资源的方法

    以下是关于“SpringMVC访问静态资源的方法”的完整攻略,其中包含两个示例。 SpringMVC访问静态资源的方法 SpringMVC是一种基于Java的Web框架,它可以帮助我们快速开发Web应用程序。在本文中,我们将讲解如何在SpringMVC中访问静态资源。 方法一:使用标签 在src/main/webapp目录下创建一个名为static的文件夹。…

    Java 2023年5月17日
    00
  • Java收集的雪花算法代码详解

    Java收集的雪花算法代码详解 什么是雪花算法? 雪花算法是一种能够帮助我们生成唯一ID的算法,由Twitter公司开发并在2010年开源。该算法的特点是高并发下不重复,适合在分布式系统中作为唯一ID的生成器。使用雪花算法可以有效减少分布式系统中因ID冲突造成的问题。 雪花算法的实现方式 雪花算法的实现方式如下: 首先,雪花算法规定了一个64位的二进制数, …

    Java 2023年5月19日
    00
  • 利用Spring Data MongoDB持久化文档数据的方法教程

    当使用Spring Data MongoDB进行文档数据持久化时,首先需要创建一个实体类,该实体类中需要包含一些注释以告知Spring Data MongoDB如何将该实体类映射到MongoDB集合。 例如,考虑以下实体类: @Document(collection = "myCollection") public class MyEnt…

    Java 2023年5月20日
    00
  • SpringBoot整合FastDFS方法过程详解

    下面详细讲解SpringBoot整合FastDFS的方法。 简介 FastDFS是一个开源的轻量级分布式文件系统,它主要解决了海量图片、音视频等文件存储和访问的问题。Spring Boot是一种基于Spring框架的快速开发个性化应用的框架。本文将详细介绍Spring Boot如何整合FastDFS实现文件上传和下载功能。 步骤 1. 添加FastDFS依赖…

    Java 2023年5月19日
    00
  • PHP实现压缩图片尺寸并转为jpg格式的方法示例

    要实现压缩图片尺寸并转为jpg格式,可以使用PHP语言的GD库来实现。GD库提供了丰富的图像处理功能,可以帮助我们快速地处理图片。以下是步骤: 步骤一:安装GD库 在PHP安装中,GD库一般都是预装的,我们可以通过phpinfo()函数来确认是否已经开启GD库。如果没有开启,需要修改php.ini文件,把extension=gd.so前面的分号去掉即可。 步…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部