首页 课程 师资 教程 报名

dbcp连接池示例

  • 2022-11-30 10:17:54
  • 304次 星辉

为什么要使用连接池?

为了向用户呈现动态数据,应用程序通常连接到数据库并从那里获取数据。然而,每次都获取物理连接并关闭它们是一个耗时的过程。如果获取和释放的连接数随每个请求一起发生,则此延迟会被放大。为了解决这个问题,我们使用连接池。

连接池通过创建连接池并将它们存储在对象池中来解决这个问题。每当客户端请求某些数据时,就会从连接池中检索一个空闲连接对象,并根据此连接查询数据库。如果连接对象不可用且未达到最大池限制,则返回新的连接对象。如果没有可用的空闲连接对象并且已达到池的最大打开连接限制,则请求排队。一旦任何请求释放连接,队列中的请求就可以使用该对象。

这就是理论方面的全部内容,让我们从项目设置和实施开始。

项目设置

通过从新建 Maven 项目弹出窗口中选择跳过原型选择复选框,在 Eclipse IDE 中创建一个简单的 Maven 项目。我们正在使用以下pom.xml内容来管理 DBCP 和 JDBC 驱动程序的依赖关系。

<font></font>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<font></font>
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><font></font>
    <modelVersion>4.0.0</modelVersion><font></font>
    <groupId>com.jcg.examples.dbcpExample</groupId><font></font>
    <artifactId>DBCPConnectionPoolingExample</artifactId><font></font>
    <version>0.0.1-SNAPSHOT</version><font></font>
<font></font>
    <dependencies><font></font>
        <dependency><font></font>
            <groupId>org.apache.commons</groupId><font></font>
            <artifactId>commons-dbcp2</artifactId><font></font>
            <version>2.1</version><font></font>
        </dependency><font></font>
        <font></font>
        <dependency><font></font>
            <groupId>mysql</groupId><font></font>
            <artifactId>mysql-connector-java</artifactId><font></font>
            <version>5.1.37</version><font></font>
        </dependency><font></font>
<font></font>
    </dependencies><font></font>
    <font></font>
    <build><font></font>
        <finalName>Crossover-BackEnd</finalName><font></font>
        <plugins><font></font>
            <plugin><font></font>
                <groupId>org.apache.maven.plugins</groupId><font></font>
                <artifactId>maven-compiler-plugin</artifactId><font></font>
                <configuration><font></font>
                    <source>1.7</source><font></font>
                    <target>1.7</target><font></font>
                </configuration><font></font>
            </plugin><font></font>
        </plugins><font></font>
    </build>      <font></font>
<font></font>
</project><font></font>
<font></font>

在此pom.xml,我们使用 JDK 7 以便我们可以Automatic Resource Management用于 JDBC 连接。

下一步是创建一个表。正如您已经看到的,我们在此示例中使用 MySql 数据库服务器。这是我们将要使用的表的脚本。

<font></font>
CREATE TABLE `account` (<font></font>
  `Account_Number` bigint(20) NOT NULL,<font></font>
  `Account_Type` varchar(45) DEFAULT NULL,<font></font>
  `Person_name` varchar(50) DEFAULT NULL,<font></font>
  PRIMARY KEY (`Account_Number`)<font></font>
<font></font>

Eclipse 将下载所需的 JAR 文件并在项目类路径中添加依赖项。现在项目已设置并导入了依赖项,我们可以开始编写实际代码了。

实施

让我们为我们的应用程序实现一个基本的 DBCP Datasource。

<font></font>
package com.jcg.examples;<font></font>
<font></font>
<font></font>
import java.sql.Connection;<font></font>
import java.sql.PreparedStatement;<font></font>
import java.sql.ResultSet;<font></font>
import java.sql.SQLException;<font></font>
<font></font>
import org.apache.commons.dbcp2.BasicDataSource;<font></font>
<font></font>
<font></font>
public class DataBaseUtility<font></font>
{<font></font>
    private static BasicDataSource dataSource;<font></font>
<font></font>
    private static BasicDataSource getDataSource()<font></font>
    {<font></font>
<font></font>
        if (dataSource == null)<font></font>
        {<font></font>
            BasicDataSource ds = new BasicDataSource();<font></font>
            ds.setUrl("jdbc:mysql://localhost/test");<font></font>
            ds.setUsername("root");<font></font>
            ds.setPassword("password");<font></font>
<font></font>
<font></font>
            ds.setMinIdle(5);<font></font>
            ds.setMaxIdle(10);<font></font>
            ds.setMaxOpenPreparedStatements(100);<font></font>
<font></font>
            dataSource = ds;<font></font>
        }<font></font>
        return dataSource;<font></font>
    }<font></font>
<font></font>
    public static void main(String[] args) throws SQLException<font></font>
    {<font></font>
<font></font>
        try (BasicDataSource dataSource = DataBaseUtility.getDataSource(); <font></font>
                Connection connection = dataSource.getConnection();<font></font>
                PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM account");)<font></font>
        {<font></font>
System.out.println("The Connection Object is of Class: "+connection.getClass());<font></font>
            try (ResultSet resultSet = pstmt.executeQuery();)<font></font>
            {<font></font>
                while (resultSet.next())<font></font>
                {<font></font>
                    System.out.println(resultSet.getString(1) + "," + resultSet.getString(2) + "," + resultSet.getString(3));<font></font>
                }<font></font>
            }<font></font>
            catch (Exception e)<font></font>
            {<font></font>
                connection.rollback();<font></font>
                e.printStackTrace();<font></font>
            }<font></font>
        }<font></font>
    }<font></font>
<font></font>
}<font></font>
<font></font>

我们创建一个简单datasource的类型:org.apache.commons.dbcp2.BasicDataSource。URL、用户名和密码等连接参数是我们启动数据源时需要提供的必填字段。

除了这些字段之外,我们还有一些可选字段BasicDatasource,我们可以使用它们来更好地控制它。这是他们的简要说明:

minIdle:设置要在池中保持活动状态的最小连接对象数。

maxIdle:设置池中空闲连接的最大数量。如果池中的连接总数超过这个数量,多余的连接一返回连接池就被释放。

maxOpenPreparedStatementsjava.sql.PreparedStatement可以缓存的最大数量。PreparedStatement cache与每个连接对象相关联。当我们创建另一个类似PreparedStatement的对象时,会返回一个缓存的 preparedStatement 对象。这减少了数据库服务器再次解析新 SQL 查询所花费的时间,从而提高了整体应用程序吞吐量。preparedstatement 的相似性是由相同的查询决定的。如果我们通过字符串连接传递查询参数,那么每次查询都会不同,缓存几乎没有用。要使用此缓存的好处,我们需要使用参数化查询。

如您所见,我们正在使用 ARM 块,因此我们不需要显式关闭connection,PreparedStatement和ResultSet对象。但是,当 JVM 调用连接对象的 close 方法时,并没有关闭与数据库的实际连接。这是因为 返回的BasicDataSource连接对象是引用原始连接对象的代理 jdbc 连接对象。close 调用只是使代理对象无效并将其返回到连接池。现在下一个请求将简单地获取这个连接对象并执行查询,而不需要打开实际的数据库连接。

以下是上述程序的示例输出:

<font></font>
The Connection Object is of Class: class org.apache.commons.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper<font></font>
123456,Savings,ABC<font></font>
433445,Current,XYZ<font></font>
<font></font>

正如您在输出中看到的,它不是实际java.sql.Connection对象而是代理对象。

DBCP还可以与 Spring Container 顺利集成,因此可以在基于 Spring 的应用程序中无缝使用。这是数据源 bean 的基本配置:

<font></font>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"<font></font>
        destroy-method="close"><font></font>
        <property name="driverClassName" value="com.mysql.jdbc.Driver" /><font></font>
        <property name="url" value="jdbc:mysql://localhost:3306/test" /><font></font>
        <property name="username" value="root" /><font></font>
        <property name="password" value="password" /><font></font>
    </bean><font></font>
<font></font>

以上就是关于“dbcp连接池示例”的介绍,大家如果想了解更多相关知识,不妨来关注一下本站的Java星辉在线学习,里面的课程内容从入门到精通,细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交