Java JDBC连接池

目录

1.连接池了解

2.C3P0连接池

2.1 什么是C3P0

2.2 使用C3P0

第一步:导入jar

第二步:添加配置文件

第三步:创建DataSource

第四步:获取Connection

第五步:获取PreparedStatement执行SQL

第六步:遍历结果集

第七步:释放资源

完整代码

2.3 ComboPooedDataSource介绍

3.Druid连接池

3.1 Druid介绍

3.2  使用Druid

第一步:导入jar

第二步:添加配置文件

第三步:加载配置文件

第四步:获取DataSource

第五步:获取Connection

第六步:操作数据库

第七步:关闭资源

完整代码

3.3 使用工具类

1.连接池了解

        连接池就是存储我们数据库连接对象的容器,系统初始化后,会去申请一些连接对象,用户访问数据库时,回去容器中获取数据库连接对象,使用完毕后会归还给容器

好处

        1. 提高资源利用率
        2. 提高访问速度

DataSource

        java提供的接口, DataSource接口由框架编写者实现

        方法

​            Connection getConnection()

​                获取连接

​            close()  Connection类中

​                归还连接对象,如果调用的是连接池中的Connection 对象的close()方法,就不会关闭连接,会将该连接归还给连接池

实现DataSource

        一般情况下不需要我们实现此接口,一下两种连接池会帮我们连接:

                1. C3P0
                2. Druid   (由阿里巴巴提供)

2.C3P0连接池

2.1 什么是C3P0

        C3P0是目前较为流行的开源数据库连接池,支持JDBC2和JDBC3规的标准规范,易于扩展并且性能优越,目前被Hibernate、Spring等框架使用。

2.2 使用C3P0

第一步:导入jar

使用C3P0需要导入的包(2个)

        c3p0-0.9.5.2.jar

        mchange-commons-java-0.2.11.jar

注意别忘记导入mysql驱动

        mysql-connector-java-5.1.8.jar

第二步:添加配置文件

        在使用C3P0时,可以将数据库配置写到配置文件中,C3P0默认会到src根目录下加载名称为c3p0-config.xml的xml文件,配置文件内容如下

配置文件中添加了默认节点和自定义节点(myApp)

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
   <!--配置默认节点-->
   <default-config>
      <property name="driverClass">com.mysql.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql://localhost/test2</property>
      <property name="user">root</property>
      <property name="password">root</property>
   </default-config>
   <!--配置自定义节点-->
   <named-config name="myApp">
      <property name="user">root</property>
      <property name="password">root</property>
      <property name="driverClass">com.mysql.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql://localhost:3306/test2</property>
      <!--初始化连接个数-->
      <property name="initialPoolSize">10</property>
      <!--最大空闲时间 单位秒-->
      <property name="maxIdleTime">30</property>
      <!--初始化连接个数-->
      <property name="maxPoolSize">100</property>
   </named-config>
</c3p0-config>

第三步:创建DataSource

读取默认节点(<default-config>节点配置的信息)

        DataSource cpds = new ComboPooledDataSource();

读取指节点

        DataSource cpds = new ComboPooledDataSource("myApp");

第四步:获取Connection

获取数据库连接对象

        Connection conn = cpds.getConnection();

第五步:获取PreparedStatement执行SQL

获取PreparedStatement执行sql语句

        String sql = "SELECT * FROM user";
        PreparedStatement ps = conn.prepareStatement(sql);

        ResultSet rs = ps.executeQuery();

第六步:遍历结果集

while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("username");
    String password = rs.getString("password");
    System.out.println(id + name + password);
}

第七步:释放资源

rs.close();

ps.close();
conn.close();

完整代码

import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Demo01 {
    public static void main(String[] args) throws SQLException {
        // 3.创建DataSource
        // 读取默认节点的配置
        DataSource ds = new ComboPooledDataSource();
        // 4.获取Connection对象
        Connection conn = ds.getConnection();
        // 5.执行SQL
        String sql = "select * from user ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        // 6.遍历结果集
        System.out.println("id    username    password    email");
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            System.out.println(id + "   " + username + "   " + password + "   " + email);
        }
        // 7.释放资源
        rs.close();
        ps.close();
        conn.close();
    }
}

运行结果:

 红色部分为日志

2.3 ComboPooedDataSource介绍

ComboPooedDataSource是DataSource接口的实现类,主要包含设置数据源对象的方法

方法名

功能

setDriverClass()

设置连接数据库的驱动名称

setJdbcUrl

设置连接数据库的路径

setUser()

设置数据库的登陆账号

setPassword()

设置数据库的登陆密码

setMaxPoolSize()

设置数据库连接池最大的连接数目

setMinPoolSize()

设置数据库连接池最小的连接数目

setInitialPoolSize()

设置数据库连接池初始化的连接数目

getConnection()

从连接池中获取一个数据库连接

        想要使用C3P0,首先需要创建数据源对象,创建数据源对象使用ComboPooledDataSource类

3.Druid连接池

3.1 Druid介绍

        阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好,Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息全部配置给DataSource对象。

好处:

  1. 替代C3P0、DBCP数据库连接池(因为它的性能更好)
  2. 自带监控页面,实时监控应用的连接池情况

3.2  使用Druid

第一步:导入jar

        导入jar包:druid-1.0.9.jar(或者其他版本的)

        导入数据库驱动:mysql-connector-java-xxx.jar

第二步:添加配置文件

定义配置文件,后缀名properties,名称随意,可以放到任意目录,一般在src根目录下

配置文件内容为

druid.properties

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

第三步:加载配置文件

使用Properties加载配置文件

Properties pro = new Properties();
pro.load(Demo.class.getClassLoader().getResourceAsStream("druid.properties"));

第四步:获取DataSource

获取DataSource对象

DataSource ds = DruidDataSourceFactory.createDataSource(pro);

第五步:获取Connection

获取Connection对象

Connection conn = ds.getConnection();

第六步:操作数据库

通过Connection 对象操作数据库

String sql = "select * from user";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
System.out.println("id    username    password    email");
while (rs.next()) {
    int id = rs.getInt("id");
    String username = rs.getString("username");
    String password = rs.getString("password");
    String email = rs.getString("email");
    System.out.println(id + "   " + username + "   " + password + "   " + email);
}

第七步:关闭资源

rs.close();
ps.close();
conn.close();

完整代码

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

public class Demo {
    public static void main(String[] args) throws Exception {
        // 3.加载配置文件
        Properties pro = new Properties();
        pro.load(Demo.class.getClassLoader().getResourceAsStream("druid.properties"));
        // 4.获取DataSource
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        // 5.获取Connection
        Connection conn = ds.getConnection();
        // 6.操作数据库
        String sql = "select * from user";
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        System.out.println("id    username    password    email");
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            System.out.println(id + "   " + username + "   " + password + "   " + email);
        }
        // 7.关闭资源
        rs.close();
        ps.close();
        conn.close();

    }
}

运行结果:

 

3.3 使用工具类

  1. 加载配置文件
  2. 添加获取连接池的方法
  3. 添加获取连接的方法
  4. 添加关闭资源的方法

编写工具类:

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
    // 加载配置文件
    static DataSource ds;

    static {
        Properties pro = new Properties();
        try {
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接池的方法
     */
    public static DataSource getDataSource() {
        return ds;
    }

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

    /**
     * 关闭资源的方法
     */
    public static void close(ResultSet rs, Statement st, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使用工具类

@Test
    public void t1() throws SQLException {
        Connection conn = JDBCUtils.getConnection();
        String sql = "select * from user";
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        System.out.println("id    username    password    email");
        while (rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String email = rs.getString("email");
            System.out.println(id + "   " + username + "   " + password + "   " + email);
        }
        JDBCUtils.close(rs,ps,conn);

    }

运行结果:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值