JDBC数据库连接池

ゝ一世哀愁。 2024-03-17 20:10 250阅读 0赞

1、 数据库频繁连接的问题

JDBC技术操作数据库,每次和数据库连接成功,执行SQL语句,释放资源。数据库的连接过程比较消耗资源,消耗的是网络资源,和数据库连接都是TCP协议的,Java程序要和数据库进行三次握手才能确定连接成功。

大数据高并发时代,频繁的连接数据库,必然导致我们开发的软件在运行速度上会变慢。用户体验会非常的差。必须解决数据库频繁连接的问题,提供我们软件运行速度。

2 、数据库连接池的原理

数据库连接池:解决频繁连接带来的性能问题和网络资源消耗问题。

数据库连接池,数据库连接对象的缓冲池。实现原理就是将数据库的连接对象存储在一个容器中(池pool),需要操作数据库,就从池中取出连接对象来使用,数据库操作完成,要将连接对象放回到连接池中。连接对象永远不会被销毁,可以反复的使用,达到提供连接效率的问题。

3b858d247d034767b754b457559e80f5.png

3、Data Source接口

开发中必须要使用连接池,但是我们自己开发连接池很不现实。需要使用第三方的连接池技术。

常见的连接池:德鲁伊连接池,Apache的连接池DBCP,C3P0

连接池产品众多,我们开发人员选择用哪个连接池呢?

如果连接池不统一标准,开发人员将无法切换连接池!!

连接池的技术标准也必须要统一:Sun公司定义了连接池的标准接口:

  1. javax.sql包下的接口
  2. /**
  3. 是所有连接池标准
  4. 连接池就必须实现此接口
  5. 接口的名字是数据源,就是连接池
  6. */
  7. public interface DataSource{
  8. Connection getConnection();// 返回数据库的连接对象
  9. }

任何一个连接池,都必须实现接口:javax.sql.DataSource 重写方法getConnection()

4、德鲁伊连接池的使用

阿里巴巴的德鲁伊连接池:DruidDataSource类实现了Sun公司的接口DataSource

  • 德鲁伊连接池的配置参数

































参数配置 参数说明
driverClassName 数据库的驱动类
url 数据库服务器的连接地址
username 连接数据库的用户名
password 连接数据库的密码
initalSize 连接池中初始化的连接个数
maxIdIe 连接池中最大的连接个数

使用德鲁伊连接池,必须要添加jar包!

  • 自定义德鲁伊连接池工具类

    /*
    创建静态方法,返回数据库的连接对象
    数据库的连接对象,交给德鲁伊连接池管理
    从池中取出连接来使用
    /
    public static Connection getConnection(){

    1. // 创建连接池接口DataSource的实现类对象
    2. DruidDataSource dataSource=new DruidDataSource();
    3. // 配置数据库的驱动类,dataSource对象的set方法设置
    4. DruidDataSource dataSource=new DruidDataSource();
    5. dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); //数据库驱动类
    6. dataSource.setUrl("jdbc:mysql://localhost:3306/school");
    7. dataSource.setUsername("root"); //连接数据库的用户名
    8. dataSource.setUsername("renyanlei115"); // 连接数据库的密码
    9. dataSource.setInitialSize(10); // 连接池中,初始化的连接个数
    10. dataSource.setMaxActive(20); //连接池中,最大的连接个数
    11. // 调用对象的方法 getConnection()获取数据库连接对象
    12. return dataSource.getConnection();

    }

    1. // 测试代码
    2. public static void main(){
    3. Connection con=getConnection();
    4. System.out.println("con="+con);
    5. con.close();

    }

  • 德鲁伊连接池(properties)

    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/school
    username=root
    password=renyanlei115
    initialSize=10
    maxActive=20

  • 配置文件中的键名称不能乱写,因为德鲁伊连接池中的键是固定的。

  • 优化后的德鲁伊连接池工具

    package com.rocky.utils;

    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 DruidJDBCUtils {

    1. static DataSource dataSource;

    1. static {
    2. //1 :加载配置文件
    3. InputStream resourceAsStream =
    4. DruidJDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");

    1. Properties properties = new Properties();
    2. try {
    3. properties.load(resourceAsStream);

    1. // druid提供了一个工厂方法来生成dataSource对象
    2. dataSource = DruidDataSourceFactory.createDataSource(properties);


    1. } catch (Exception e) {
    2. throw new RuntimeException(e);
    3. }

    1. }
    2. public static DataSource getDataSource(){
    3. return dataSource;
    4. }


    1. public static Connection getConnection() throws SQLException {
    2. return dataSource.getConnection();
    3. }

    1. /**
    2. * 凡是使用了连接池的JDBC技术,执行Connection对象的close()方法,不是关闭连接,而是回收到连接池中
    3. *
    4. */

    1. public static void close(ResultSet resultSet, Statement statement,Connection connection) throws SQLException {
    2. if(resultSet!=null){
    3. resultSet.close();
    4. }

    1. if(statement!=null){
    2. statement.close();
    3. }

    1. if(connection!=null){
    2. connection.close();
    3. }

    1. }


    }

  • 数据库连接池中的资源释放问题(连接对象使用完毕要归还连接池)
  • 连接池中使用动态代理技术(改变方法的功能),close()方法的作用就是归还连接池

5、使用连接池使用数据表的查询功能

  1. package com.rocky.view;
  2. import com.rocky.utils.DataSourceUtils;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. public class DataSourceTest {
  8. public static void main(String[] args) throws SQLException {
  9. Connection connection=null;
  10. PreparedStatement preparedStatement=null;
  11. ResultSet resultSet=null;
  12. try {
  13. //德鲁伊连接池工具类,获得数据库的连接对象
  14. connection= DataSourceUtils.getConnection();
  15. //拼写SQL语句
  16. String sql="select * from userinfo";
  17. //sql语句中,没有问号,没有占位符,不需要设置参数
  18. preparedStatement=connection.prepareStatement(sql);
  19. resultSet=preparedStatement.executeQuery();
  20. while (resultSet.next()){
  21. int id=resultSet.getInt("id");
  22. String name=resultSet.getNString("name");
  23. String password=resultSet.getString("password");
  24. System.out.println("id="+id+"name="+name+"password="+password);
  25. }
  26. } catch (SQLException e) {
  27. throw new RuntimeException(e);
  28. }finally {
  29. DataSourceUtils.close(resultSet,preparedStatement,connection);
  30. }
  31. }
  32. }

发表评论

表情:
评论列表 (有 0 条评论,250人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JDBC数据库连接简介

    数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问

    相关 JDBC数据库连接

    1、 数据库频繁连接的问题 JDBC技术操作数据库,每次和数据库连接成功,执行SQL语句,释放资源。数据库的连接过程比较消耗资源,消耗的是网络资源,和数据库连接都是TCP