Java和MySQL的连接池Druid

Java和MySQL的连接池是为了提高Java应用程序访问MySQL数据库的性能而设计的,它可以在应用程序和MySQL数据库之间建立一组预先初始化的连接,使应用程序可以快速地从池中获取连接并执行SQL查询。在本篇博客中,我们将介绍如何使用Java中的连接池来连接MySQL数据库

连接池和Connection对象有关。

Java中连接池的实现主要分为两种:第一种是使用Java平台提供的JDBC API来实现连接池,第二种是使用第三方库来实现连接池。常见连接池:1.C3P0 2.DBCP 3.Druid (德鲁伊)

实现连接池的步骤如下:

  1. 创建一个连接池对象,该对象需要初始化连接池的一些参数,如最大连接数、最小连接数、连接超时时间等。
  2. 创建连接池中的连接,将连接放入连接池中。连接池中的连接可以重复利用,连接池中连接数量达到最大连接数时,新的连接请求将被阻塞,直到有连接被归还给连接池。
  3. 当应用程序需要连接数据库时,它可以从连接池中获取连接。获取连接时需要注意连接池中连接的可用性。
  4. 应用程序完成了对数据库的操作后,需要将连接归还给连接池,以便其他应用程序可以继续使用该连接。

Druid

Alibaba的Druid是一款开源的高性能JDBC连接池和监控工具,它不仅仅具有连接池的基本功能,还提供了强大的监控、统计和SQL调优功能,使得开发人员可以更好地管理和优化数据库连接和SQL查询。

Druid连接池的特点

Druid连接池的特点包括:

  1. 可以监控数据库访问性能,包括SQL执行时间、并发数等,可以根据监控数据进行优化。
  2. 支持基于过滤器的配置方式,可以灵活配置连接池参数,如最大连接数、最小连接数、连接超时时间等。
  3. 支持统计SQL的执行情况,包括执行次数、耗时、错误次数等,可以用来发现SQL性能问题和优化SQL。
  4. 支持SQL防火墙功能,可以对SQL进行监控和过滤,防止SQL注入攻击。
  5. 支持JDBC规范和MySQL协议,可以兼容大部分的JDBC驱动和MySQL客户端程序。
  6. 具有很高的性能和可伸缩性,支持多线程、多数据源、分布式部署等,适用于高并发、大数据量的应用场景。
Druid连接池的使用

下面是一个使用Druid连接池的示例:

// 创建Druid连接池对象
DruidDataSource dataSource = new DruidDataSource();
// 设置连接池参数
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("password");
dataSource.setInitialSize(5);
dataSource.setMaxActive(20);
dataSource.setMinIdle(5);
dataSource.setMaxWait(60000);

// 获取连接
Connection conn = dataSource.getConnection();

// 使用连接进行数据库操作
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table");

// 关闭连接
rs.close();
stmt.close();
conn.close();

或者把参数写入properties文件,每次修改只需要修改properties文件里的参数

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java2304?useSSL=false
username=root
password=123456
initialSize=5
maxActive=10
maxWait=2000
//1.读取druid.properties
Properties properties = new Properties();
//2.以流的形式进行操作
properties.load(new FileInputStream("src/druid.properties"));
//3.创建Druid的核心类
//druid数据源的工厂 
//dataSource 数据源中干了获取配置文件的的数据并赋值给数据源
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//4.获取连接数据库的对象
Connection connection = dataSource.getConnection();
//5.使用连接进行数据库操作
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table");
// 关闭连接
rs.close();
stmt.close();
conn.close();

DruidDataSource是Druid连接池的核心类,它提供了一系列方法和参数用于配置和管理连接池。下面对其中比较常用的方法和参数进行详解。

方法:
  • setUrl(String url):设置数据库URL,格式为jdbc:xxx://host:端口号/database?connection_properties。
  • setUsername(String username):设置数据库用户名。
  • setPassword(String password):设置数据库密码。
  • setInitialSize(int initialSize):设置连接池初始大小。
  • setMaxActive(int maxActive):设置连接池最大连接数。
  • setMinIdle(int minIdle):设置连接池最小空闲连接数。
  • setMaxWait(long maxWait):设置获取连接的最大等待时间,单位毫秒。
  • setTestWhileIdle(boolean testWhileIdle):设置连接空闲时是否进行检测。
  • setValidationQuery(String validationQuery):设置用于检测连接是否有效的SQL语句。
  • setTestOnBorrow(boolean testOnBorrow):设置获取连接时是否进行检测。
  • setTestOnReturn(boolean testOnReturn):设置归还连接时是否进行检测。
  • setPoolPreparedStatements(boolean poolPreparedStatements):是否缓存PreparedStatement。
  • setMaxOpenPreparedStatements(int maxOpenPreparedStatements):缓存的PreparedStatement的最大数量。
  • setFilters(String filters):设置拦截器,用于防止SQL注入等问题。
  • getConnection():获取连接。
参数:
  • url数据库URL,格式为jdbc:xxx://host:port/database?connection_properties。
  • username数据库用户名。
  • password数据库密码。
  • initialSize:连接池初始大小,默认为0。
  • maxActive:连接池最大连接数,默认为8。
  • minIdle:连接池最小空闲连接数,默认为0。
  • maxWait:获取连接的最大等待时间,单位毫秒,默认为-1,表示永不超时。
  • testWhileIdle:连接空闲时是否进行检测,默认为false。
  • validationQuery:用于检测连接是否有效的SQL语句,默认为SELECT 1。
  • testOnBorrow:获取连接时是否进行检测,默认为false。
  • testOnReturn:归还连接时是否进行检测,默认为false。
  • poolPreparedStatements:是否缓存PreparedStatement,默认为false。
  • maxOpenPreparedStatements:缓存的PreparedStatement的最大数量,默认为-1,表示不限制。
  • filters:拦截器,用于防止SQL注入等问题,默认为空。

综上所述,Druid连接池的方法和参数丰富,可以根据实际需求进行配置和管理,以提高数据库连接和查询的性能和可靠性。

setMaxWait(long maxWait)

setMaxWait(long maxWait)是Druid连接池中一个比较重要的方法,它用于设置获取连接的最大等待时间,单位为毫秒。当连接池中的连接已经全部被占用,而此时需要获取连接时,如果等待时间超过了设置的最大等待时间,将会抛出SQLException异常。

在实际应用中,如果没有设置最大等待时间,那么连接池会一直等待直到有可用的连接,这样可能会导致系统的响应时间过长,影响用户的体验。因此,设置最大等待时间是一个比较好的实践,可以在一定程度上控制系统的响应时间。

需要注意的是,设置的最大等待时间并不是连接的最长生命周期,连接池中的连接可能会被定时清理,这取决于连接池的配置。另外,在高并发的情况下,如果连接池中的连接过少,而最大等待时间过长,可能会导致请求堆积、系统负载过高等问题。因此,在实际使用中,需要根据应用的实际情况进行设置。

filters

filters是Druid连接池中的一个参数,用于设置连接池的拦截器。拦截器是Druid连接池提供的一种可插拔的机制,用于对SQL进行统一的处理,比如防止SQL注入、SQL性能监控等。Druid连接池内置了一些常用的拦截器,可以直接使用,也可以根据自己的需求进行扩展。

常用的拦截器包括:

  • WallFilter:用于防止SQL注入。
  • StatFilter:用于统计SQL的执行时间、执行次数等信息。
  • Log4jFilter:用于将SQL的执行结果输出到Log4j日志中。

使用拦截器可以提高数据库连接和查询的安全性、可靠性和性能,避免一些常见的问题和漏洞。设置拦截器可以使用以下代码:

dataSource.setFilters("stat,wall,log4j");

上述代码表示启用了StatFilter、WallFilter和Log4jFilter三个拦截器。多个拦截器之间用逗号分隔。

需要注意的是,拦截器的使用可能会影响到系统的性能,尤其是在高并发的情况下,因此需要根据应用的实际情况进行选择和配置。另外,Druid连接池中的拦截器还支持自定义拦截器,可以根据需要进行扩展。

connection_properties

<connection_properties>是连接数据库时的一些附加参数,一般包括一些数据库连接配置信息,比如用户名、密码、字符集、超时时间等。JDBC规范规定了一些标准的连接参数,不同的数据库也会支持一些特定的连接参数。

常用的JDBC连接参数包括:

  • user:连接数据库的用户名。
  • password:连接数据库的密码。
  • characterEncoding:设置数据库字符集,比如UTF-8、GBK等。
  • useSSL:是否启用SSL加密连接,默认为false。
  • autoReconnect:是否自动重连数据库,默认为false。
  • connectTimeout:连接数据库的超时时间,单位为毫秒。

在JDBCUrl中,连接参数以问号(?)开头,多个参数之间以&符号分隔。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐