这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
前言:
本篇文章是我关于MySQL的第三篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。上篇MySQL逻辑结构的第一层就是本篇要展开讲的连接层。这个层级一般容易被忽视,之前都是简单的复制几个配置文件。最近才开始慢慢了解。
一. 连接规范
数据库客户端想连接服务器,一般都需要一套协议和相应的供调用的API。
拿Java举例,一般用JDBC驱动来连接MySQL
1. JDBC(Java DataBase Connectivity)
java数据库连接:是Java制定了的连接/访问不同的关系型数据库的规范,并提供了其用来执行SQL命令的接口。也可以称之为基准,开发人员可以在此基础上进行编写数据库应用和连接池配置。
2. ODBC(Open Database Connectivity)
开放性数据库连接:是为解决异构数据库间的数据共享而产生的,现已成为WOSA(The Windows Open System Architecture(Windows开放系统体系结构的主要部分和基于Windows环境的一种数据库访问接口标准。ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据;使应用程序直接操纵DB中的数据,免除随DB的改变而改变。
上文是百度百科对此的解释,翻译成人话就是:
ODBC是windows开放服务中的一个组成部分,它就是给访问数据库提供了一套标准的API,它是独立于具体的编程语言的。(ODBC后续被列为了SQL标准的一部分)。
像Python中的pyodbc是ODBC的一个python封装,它允许任何平台上的python具有使用ODBC API的能力。
3. JDBC-ODBC
JDBC-ODBC桥接:
如果数据库采用的是ODBC驱动来编程的,目前需要采用JDBC的话。则需要JDBC-ODBC桥接这种过渡方式。
这种方式实际上连接数据库用的是ODBC来驱动,然后经过JDBC来调用ODBC。虽然是实现了目的,但是相当于多了一个中间商来赚差价。这种方式只是在特定的时候使用。
二、连接池
通过上述连接驱动连接服务器时,每个连接都会拥有一个单独的线程。这个单独的线程会服务所有这个连接的查询/写入操作。服务器的CPU会随机运行该线程。
数据库连接池是MySQL5.5更新之后支持的功能,它可以通过少量的线程来服务大量的连接,并且不需要为每个新连接建立线程或者销毁线程。
常见的数据库线程池有 DBCP、c3p0、Druid。 前两位年龄加起来应该比各位看官的年龄还要大。
1. DBCP(Database Connection Pool)
DBCP是Apache一个开源项目,Tomcat的数据源使用的就是DBCP,其依赖于Jakarta commons-pool对象池机制的数据库连接池。与DBCP 1.x相比,DBCP 2 基于共享池 2,提供更出色的性能、JMX 支持以及许多其他新功能。 DBCP 从1.3到2.7 支持Java1.3到8.0的全部版本。
- dbcp不能自动回收空闲连接
- 提供了最大连接数配置,如果超过最大连接数将断开所有连接。
2. C3P0
c3p0是一个开放源代码的JDBC连接池,Spring、Hibernate等开源项目都用到了,也支持JDBC3规范和JDBC2的标准扩展。
- 提供了最大连接时间配置,如果超过了最大连接时间,将断开该连接。
3. Druid
Druid是淘宝支付宝专用数据库连接池的孵化产品,它除了是连接池外。更多的提供了很多的扩展功能。 包括但不限于:日志监控、ping检测、缓存内存优化、sql过滤。并且支持所有JDBC兼容的数据库。
三. 安全性
在应用通过驱动连接到MySQL服务器时,会对其进行一个验证。验证信息包括原始主机信息、密码等。 在通过SSL(安全套字)方式连接时,可以用X.509进行证书验证。 不要以为验证到这里就完了
当客户端连接成功,服务器会校验客户端是否有执行某些操作的权限。这些具体的配置可以在上面的数据库连接池中进行配置。当然过多的验证也会影响SQL的性能。
本文参考资料
- 《高性能MySQL》
- 开源中国介绍