数据连接池(c3p0+druid)及JDBC Template

Posted Henrik-Yao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据连接池(c3p0+druid)及JDBC Template相关的知识,希望对你有一定的参考价值。

数据库连接池的概念:
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

这里讲了两个常用的数据库连接池(可以理解为节约资源的容器,避免了重复申请数据库连接),以及Spring框架对JDBC简单封装后的JDBCTemplate对象(使得JDBC的操作大大简化)。

一.c3p0

c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。

1.从maven仓库导入依赖

这两个c3p0的依赖jar包:

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>mchange-commons-java</artifactId>
    <version>0.2.20</version>
</dependency>

最重要的是不能忘记导入驱动jar包:

 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.45</version>
</dependency>


2.设置配置文件c3p0-config.xml

这里注意修改成和自己匹配的项就行了。

<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/root</property>
    <property name="user">root</property>
    <property name="password">123456</property>

    <!-- 连接池参数 -->
    <!--初始化申请的连接数量-->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--超时时间-->
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="other_c3p0">
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/other_db</property>
    <property name="user">root</property>
    <property name="password">root</property>

    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>

3.获取连接

获取conn后,后续操作跟jdbc一样。

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Demo {
    public static void main(String[] args) {
        //创建数据库连接池对象
        DataSource ds = new ComboPooledDataSource();
        //获取连接对象
        Connection conn = null;
        try {
            conn = ds.getConnection();
        } catch (SQLException exception) {
            exception.printStackTrace();
        }
        //打印
        System.out.println(conn);
    }
}

4.注意

使用maven时候要注意把配置文件放在resources目录下。

二.druid

1.从maven仓库导入依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.2.3</version>
 </dependency>
  <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.45</version>
</dependency>

2.设置配置文件driud.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///root
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

3.获取连接

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class DruidDemo {
    public static void main(String[] args) {
        //加载配置文件
        Properties pro = new Properties();
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            pro.load(is);
            //获取连接池对象
            DataSource ds = DruidDataSourceFactory.createDataSource(pro);
            //获取连接
            Connection conn = ds.getConnection();
            System.out.println(conn);
        } catch (IOException exception) {
            exception.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三.定义druid工具类

定义一个JDBCUtils类,提供静态代码块加载配置文件,初始化连接池对象,提供以下方法:

  • 获取连接方法:通过数据库连接池获取连接
  • 释放资源
  • 获取连接池的方法

1.JDBCUtils.java

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    //定义成员变量
    private static DataSource ds;

    static {
        try {
            //加载配置文件
            Properties pro = new Properties();
            InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);
            //获取连接池对象
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (SQLException exception) {
            exception.printStackTrace();
        } catch (IOException exception) {
            exception.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     */
    public static Connection getConnection() throws SQLException {
        //获取连接
        return ds.getConnection();
    }

    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt,Connection conn){
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException exception) {
                exception.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException exception) {
                exception.printStackTrace();
            }
        }
    }

    /**
     * 重载
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs,Statement stmt, Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException exception) {
                exception.printStackTrace();
            }
        }
        close(stmt,conn);
    }

    public static DataSource getDataSource(){
        return ds;
    }

}


2.demo

一个简单的demo,演示了对JDBCUtils工具类的使用。

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

public class DruidDemo2 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        //获取连接
        try{
            //获取连接
            conn = JDBCUtils.getConnection();
            //定义sql
            String sql = "insert into user values (null ,?,?)";
            //获取pstmt对象
            pstmt = conn.prepareStatement(sql);
            //赋值
            pstmt.setString(1,"h");
            pstmt.setString(2,"yh");
            //执行sql
            int count = pstmt.executeUpdate();
            System.out.println(count);

        } catch (SQLException exception) {
            exception.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt,conn);
        }
    }
}

四.Spring JDBC

Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发。

使用JdbcTemplate的方法来完成增删改查:

  • update():执行DML语句。增、删、改语句
  • queryForMap():查询结果将结果集封装为map集合
  • queryForList():查询结果将结果集封装为list集合
  • query():查询结果,将结果封装为JavaBean对象
  • queryForObject:查询结果,将结果封装为对象

1.从maven仓库导入依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>mchange-commons-java</artifactId>
    <version>0.2.20</version>
</dependency>

2.demo

一个简单的demo,可以看出以及简化了很多代码并且不需要我们去手动释放资源,非常方便。

import org.springframework.jdbc.core.JdbcTemplate;

public class Demo {
    public static void main(String[] args) {
        //创建对象
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        //定义sql
        String sql = "update user set password = 'password' where id = ?";
        //调用方法
        int count = template.update(sql,3);
        System.out.println(count);
    }
}

以上是关于数据连接池(c3p0+druid)及JDBC Template的主要内容,如果未能解决你的问题,请参考以下文章

JDBC - 开源数据库连接池

数据库连接池优化配置(druid,dbcp,c3p0)

Alibaba-Druid 连接池使用

连接池(C3P0&DRUID)DBUtils-DRUID

连接池(C3P0&DRUID)DBUtils-DRUID

JCBC——各种连接池的使用