mysql连接池DataSource,DruidDataSource的理解及其使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql连接池DataSource,DruidDataSource的理解及其使用

1.DataSource理论知识


什么是数据源-DataSource


简单理解为数据源头,提供了应用程序所需要数据的位置。数据源保证了应用程序与目标数据之间交互的规范和协议,它可以是数据库,文件系统等等。其中数据源定义了位置信息,用户验证信息和交互时所需的一些特性的配置,同时它封装了如何建立与数据源的连接,向外暴露获取连接的接口。应用程序连接数据库无需关注其底层是如何如何建立的,也就是说应用业务逻辑与连接数据库操作是松耦合的。

以下只讨论当数据源为数据库的情况,且为Java环境下JDBC规范下的如何建立与数据库的连接,其他情况类似。


JDBC2.0


提供了javax.sql.DataSource接口,它负责建立与数据库的连接,当在应用程序访问数据库时不必编写连接数据库的代码,直接引用DataSource获取数据库的连接对象即可。用于获取操作数据库Connection对象。


数据源与数据连接池的关系


数据源DataSource建立多个数据库连接池Connection Pool,这些数据库连接(Connection)会保存在数据连接池中,当需要访问数据库时,只需要你从数据库连接池中获取空闲的数据库的连接,当程序员访问数据库结束时,数据连接会放回数据库连接池中。


数据库连接池的优势


传统的JDBC访问数据库技术,每次访问数据库都需要通过数据库驱动器Driver和数据库名称以及密码等等资源建立数据库连接。这样的连接存在俩大问题:1.频繁的建立数据库连接与断开数据库,会消耗大量的资源和时间,降低效率。2,数据库的连接需要用户名和密码等等。这些需要一定的内存和cpu一定开销。


DataSource source = new DataSource();

我们进入到他的源码去看下


原版

/*
 * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package javax.sql;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;
/**
 * <p>A factory for connections to the physical data source that this
 * {@code DataSource} object represents.  An alternative to the
 * {@code DriverManager} facility, a {@code DataSource} object
 * is the preferred means of getting a connection. An object that implements
 * the {@code DataSource} interface will typically be
 * registered with a naming service based on the
 * Java&trade; Naming and Directory (JNDI) API.
 * <P>
 * The {@code DataSource} interface is implemented by a driver vendor.
 * There are three types of implementations:
 * <OL>
 *   <LI>Basic implementation -- produces a standard {@code Connection}
 *       object
 *   <LI>Connection pooling implementation -- produces a {@code Connection}
 *       object that will automatically participate in connection pooling.  This
 *       implementation works with a middle-tier connection pooling manager.
 *   <LI>Distributed transaction implementation -- produces a
 *       {@code Connection} object that may be used for distributed
 *       transactions and almost always participates in connection pooling.
 *       This implementation works with a middle-tier
 *       transaction manager and almost always with a connection
 *       pooling manager.
 * </OL>
 * <P>
 * A {@code DataSource} object has properties that can be modified
 * when necessary.  For example, if the data source is moved to a different
 * server, the property for the server can be changed.  The benefit is that
 * because the data source's properties can be changed, any code accessing
 * that data source does not need to be changed.
 * <P>
 * A driver that is accessed via a {@code DataSource} object does not
 * register itself with the {@code DriverManager}.  Rather, a
 * {@code DataSource} object is retrieved though a lookup operation
 * and then used to create a {@code Connection} object.  With a basic
 * implementation, the connection obtained through a {@code DataSource}
 * object is identical to a connection obtained through the
 * {@code DriverManager} facility.
 * <p>
 * An implementation of {@code DataSource} must include a public no-arg
 * constructor.
 *
 * @since 1.4
 */
public interface DataSource  extends CommonDataSource, Wrapper {
  /**
   * <p>Attempts to establish a connection with the data source that
   * this {@code DataSource} object represents.
   *
   * @return  a connection to the data source
   * @exception SQLException if a database access error occurs
   * @throws java.sql.SQLTimeoutException  when the driver has determined that the
   * timeout value specified by the {@code setLoginTimeout} method
   * has been exceeded and has at least tried to cancel the
   * current database connection attempt
   */
  Connection getConnection() throws SQLException;
  /**
   * <p>Attempts to establish a connection with the data source that
   * this {@code DataSource} object represents.
   *
   * @param username the database user on whose behalf the connection is
   *  being made
   * @param password the user's password
   * @return  a connection to the data source
   * @exception SQLException if a database access error occurs
   * @throws java.sql.SQLTimeoutException  when the driver has determined that the
   * timeout value specified by the {@code setLoginTimeout} method
   * has been exceeded and has at least tried to cancel the
   * current database connection attempt
   * @since 1.4
   */
  Connection getConnection(String username, String password)
    throws SQLException;
}


翻译版本

/*
版权所有(c) 2000年,2013年,甲骨文和/或其附属公司。保留所有权利。
* ORACLE专有/保密。使用受许可条款的约束。
 */
package javax.sql;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;
/**
<p>连接到此物理数据源的工厂
* {@code DataSource}对象表示。的替代方案
* {@code DriverManager}工具,一个{@code DataSource}对象
*是获得连接的首选方式。一个对象,它实现
{@code DataSource}接口通常是
注册了一个命名服务
* Java&trade;命名和目录(JNDI) API。
* < P >
{@code DataSource}接口由驱动程序供应商实现。
*有三种实现类型:
* < OL >
基本实现——生成一个标准的{@code连接}
*对象
* <LI>连接池实现——产生一个{@code连接}
*将自动参与连接池的对象。这
*实现与中间层连接池管理器一起工作。
* <LI>分布式事务实现——生成一个
*可用于分布式的{@code Connection}对象
*事务和几乎总是参与连接池。
这个实现与中间层一起工作
*事务管理器,几乎总是与连接
*池经理。
* < / OL >
* < P >
一个{@code DataSource}对象具有可以修改的属性
*在必要的时候。例如,如果数据源被移动到不同的
* server,服务器的属性可以更改。好处是
*因为数据源的属性可以修改,任何代码都可以访问
*该数据源不需要更改。
* < P >
通过{@code DataSource}对象访问的驱动程序不会
*注册自己的{@code DriverManager}。相反,一个
*通过查找操作检索{@code DataSource}对象
*,然后用来创建一个{@code Connection}对象。一个基本
通过{@code DataSource}获得的连接
对象与通过
* {@code DriverManager}设施。
* < p >
{@code DataSource}的实现必须包含一个公共的无参数
*构造函数。
以上翻译结果来自有道神经网络翻译(YNMT)
逐句对照
 *
 * @since 1.4
 */
public interface DataSource  extends CommonDataSource, Wrapper {
  /**
 * <p>尝试建立与数据源的连接
{@code DataSource}对象表示。
返回到数据源的连接
如果数据库访问错误发生,@exception SQLException
当驱动程序确定java.sql.SQLTimeoutException时
*由{@code setLoginTimeout}方法指定的超时值
*已超过,并至少试图取消
当前的数据库连接尝试
以上翻译结果来自有道神经网络翻译(YNMT)
   */
  Connection getConnection() throws SQLException;
  /**
  * <p>尝试建立与数据源的连接
{@code DataSource}对象表示。
@param用户名代表连接的数据库用户
*由
@param password用户的密码
返回到数据源的连接
如果数据库访问错误发生,@exception SQLException
当驱动程序确定java.sql.SQLTimeoutException时
*由{@code setLoginTimeout}方法指定的超时值
*已超过,并至少试图取消
当前的数据库连接尝试
* @since 1.4
以上翻译结果来自有道神经网络翻译(YNMT)
   */
  Connection getConn* <p>尝试建立与数据源的连接
{@code DataSource}对象表示。
@param用户名代表连接的数据库用户
*由
@param password用户的密码
返回到数据源的连接
如果数据库访问错误发生,@exception SQLException
当驱动程序确定java.sql.SQLTimeoutException时
*由{@code setLoginTimeout}方法指定的超时值
*已超过,并至少试图取消
当前的数据库连接尝试
* @since 1.4
  */
以上翻译结果来自有道神经网络翻译(YNMT)
ection(String username, String password)
    throws SQLException;
}


我们可以根据上面的内容得出


DataSource 是作为为数据源,它是 jdk 提供的一个接口,然后只提供了两个 getConnection 方法,分别是无参数构造(无需参数)和有参构造(需要传入用户名和密码)。所以说它是跟数据库连接有关的东西,可以通过它来获取数据库连接。


datasource的实现方式


基本数据源(不支持连接池和分布式

连接池的数据源(支持连接池的处理连接,连接能够重复利用)

分布式的数据源(支持分布式的事务,一个事务能够访问更多数据库服务)

但是这只是一个接口,具体怎么获取到数据库连接,还是由实现它的子类来决定。本文就是来讲一下 DruidDataSource,


未完;…

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
SQL 关系型数据库 MySQL
池式组件-Mysql连接池的原理与实现
池式组件-Mysql连接池的原理与实现
133 0
|
8月前
|
SQL 关系型数据库 MySQL
Spring_jdbc数据连接池(mysql实现增、删、改、查)
Spring_jdbc数据连接池(mysql实现增、删、改、查)
57 0
|
6月前
|
SQL 监控 druid
MySQL连接池DataSource怎样使用?
**摘要:** 本文深入讨论了数据库连接池的重要性,特别是DruidDataSource,它是阿里巴巴的高性能Java数据库连接池。DruidDataSource不仅提供连接管理,还包括SQL监控和性能优化功能。文中通过代码示例展示了如何配置和使用DruidDataSource,包括在Java应用和Spring Boot中的集成,并提到了SQL执行监控和连接池参数的合理设置,强调了定期监控和使用内置监控工具以优化应用性能。
MySQL连接池DataSource怎样使用?
|
6月前
|
SQL 监控 druid
MySQL连接池DataSource是什么?
**摘要:** 本文探讨了数据库连接池在高并发Web应用中的重要性,聚焦于DruidDataSource,一个高效的Java数据库连接池组件。DruidDataSource提供连接池管理、SQL监控及性能优化功能。文中通过代码示例展示了如何配置和使用DruidDataSource,包括在Java应用中的直接配置和在Spring Boot中的集成。此外,还提到了使用技巧,如合理设置连接池参数、定期监控调整以及利用Druid的内置监控工具优化性能。
165 3
|
6月前
|
SQL 监控 druid
MySQL连接池DataSource怎么使用?
**摘要:** 本文探讨了数据库连接池在高并发Web应用中的重要性,特别聚焦于阿里巴巴的DruidDataSource。DruidDataSource是一个高效的Java数据库连接池,包含监控、SQL防护和日志功能。文中通过示例展示了如何配置和使用DruidDataSource,包括在Java应用中的直接配置和在Spring Boot中的集成,并提到了启用SQL监控。此外,还分享了设置连接池参数的技巧,如合理设定初始、最大和最小连接数,并强调了定期监控和使用内置监控工具优化性能的重要性。
286 0
|
7月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之无法创建mysql的连接池什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
7月前
|
SQL 网络协议 关系型数据库
mysql连接池的实现
mysql连接池的实现
43 0
|
8月前
|
数据可视化 关系型数据库 MySQL
PolarDB常见问题之无法创建mysql的连接池如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
8月前
|
网络协议 关系型数据库 MySQL
[mysql 基于C++实现数据库连接池 连接池的使用] 持续更新中
[mysql 基于C++实现数据库连接池 连接池的使用] 持续更新中
|
14天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3