1.MySQL JDBC 编译添加 Maven 依赖支持
2.Mysql - com.mysql.jdbc.Driverä¸com.mysql.cj.jdbc.Driverçåºå«
3.源码详解系列(四) ------ DBCP2的驱动驱动使用和分析(包括JNDI和JTA支持)已停更
4.Apache Calcite系列(五):数据库驱动实现
5.Flink深入浅出:JDBC Connector源码分析
MySQL JDBC 编译添加 Maven 依赖支持
在当前的工作项目中,需要对MySQL JDBC进行编译,源码原理即集成mysql-connector-j包。驱动驱动进入年,源码原理我们依然面临着手动下载和安装JAR包的驱动驱动传统方式,这从MySQL官方文档的源码原理残月源码JDBC源码编译指南中可见一斑。Oracle的驱动驱动这一做法似乎有意为之,给MySQL开发者带来了不便。源码原理
为了解决这个问题,驱动驱动我决定将MySQL JDBC添加Maven依赖,源码原理以下是驱动驱动关键步骤:
首先,确保你的源码原理项目配置了JUnit 5进行单元测试,这时需要在pom.xml中加入maven-surefire-plugin插件:
xml
org.apache.maven.plugins
maven-surefire-plugin
如果你希望尽快使用,驱动驱动而不是源码原理等待官方更新,可以直接从我fork的驱动驱动库中获取,选择feat-maven-dep分支。
虽然这个过程略显繁琐,但通过这种方式,我们至少可以简化构建流程,提高开发效率。期待MySQL官方能尽快采纳这些改进。
Mysql - com.mysql.jdbc.Driverä¸com.mysql.cj.jdbc.Driverçåºå«
spring常ç¨dataSourceé ç½®å¦ä¸:è driver-class-name ç com.mysql.jdbc.Driver ä¸ com.mysql.cj.jdbc.Driver æä»ä¹åºå«å¢?
å½5ä¹åççæ¬éæ© com.mysql.jdbc.Driver çæ¶åï¼ä¼æè¦åæ示ï¼æ¿æ¢ä¸º com.mysql.cj.jdbc.Drive
æ¥çæºç å¯ç¥ï¼èçæ¬ç Driver 继æ¿äºæ°çæ¬ç Driver ï¼éè¿ç»§æ¿çæ¹å¼å ¼å®¹èçæ¬ï¼å¹¶æ·»å äºåè¦æ示ï¼å¦ä¸:
源码详解系列(四) ------ DBCP2的使用和分析(包括JNDI和JTA支持)已停更
DBCP是一个用于创建和管理数据库连接的工具,通过连接池复用连接以减少资源消耗。它具备连接数控制、连接有效性检测、连接泄露控制和缓存语句等功能。表白网源码iAppTomcat内置连接池、Spring团队推荐使用DBCP,阿里巴巴的druid也是基于DBCP开发的。 DBCP支持通过JNDI获取数据源,并且可以获取JTA或XA事务中的连接对象,用于两阶段提交(2PC)的事务处理。本篇文章将通过例子来解释如何使用DBCP。 以下是文章的详细内容:使用例子需求
本例将展示如何使用DBCP连接池获取连接对象,并进行基本的增删改查操作。工程环境
JDK:1.8.0_
maven:3.6.1
IDE:eclipse 4.
mysql-connector-java:8.0.
mysql:5.7.
DBCP:2.6.0
主要步骤
创建Maven项目,打包方式为war(war也可以是jar,这里选择war是为了测试JNDI功能)。
引入DBCP相关依赖。
在resources目录下创建dbcp.properties文件,配置数据库连接参数及连接池基本参数。
编写JDBCUtils类,实现初始化连接池、获取连接、管理事务和资源释放等功能。
创建测试类,实现基本的增删改查操作。
配置文件详解
dbcp.properties文件包含数据库连接参数和连接池基本参数,如数据库URL、用户名、密码、同城爱聊源码连接池大小等。其中,数据库URL后面添加了参数以避免乱码和时区问题。建议根据项目需求调整参数设置。基本连接属性
数据库URL
用户名
密码
连接池大小
缓存语句(在MySQL下建议关闭)
连接检查参数(建议开启testWhileIdle,避免性能影响)
事务相关参数(通常使用默认设置)
连接泄漏回收参数
其他参数(较少使用)
源码分析
DBCP主要涉及以下几个类:BasicDataSource:提供基本的数据库操作数据源。
BasicManagedDataSource:BasicDataSource的子类,用于创建支持XA事务或JTA事务的连接。
PoolingDataSource:BasicDataSource中实际调用的数据源,用于管理连接。
ManagedDataSource:PoolingDataSource的子类,用于支持XA事务或JTA事务的连接。
使用DBCP连接池创建连接时,首先创建BasicDataSource对象,初始化配置参数。然后从连接池中获取连接。连接获取过程涉及到数据源和连接池的创建,连接对象的包装和回收。通过JNDI获取数据源对象需求
使用JNDI获取DBCP数据源对象,以PerUserPoolDataSource和SharedPoolDataSource为例。为了在tomcat容器中测试,需要配置JNDI上下文。引入依赖
引入JNDI相关的依赖。
编写context.xml文件,配置JNDI上下文。Linux源码分析资料
在web.xml中配置资源引用,将JNDI对象与web应用绑定。
测试结果
打包项目并部署到tomcat上运行,通过访问指定的jsp页面,验证JNDI获取数据源对象的正确性。使用DBCP测试两阶段提交
介绍如何使用DBCP实现JTA事务的两阶段提交(2PC)。使用DBCP的BasicManagedDataSource类支持事务处理。通过测试代码验证了2PC的正确性。 以上内容涵盖了DBCP的使用、配置、源码分析、JNDI集成以及两阶段提交的实现,为开发者提供了全面的参考。Apache Calcite系列(五):数据库驱动实现
Avatica,作为Apache Calcite的子项目,提供了实现JDBC和ODBC标准数据库驱动的能力。通过这个项目,开发者可以构建自定义数据库的Java驱动,或代理非JDBC、ODBC标准的数据库,而无需修改上层服务代码。本文将探讨Avatica的实现原理。
在探讨Avatica实现细节之前,需要了解其架构。Avatica采用典型的英雄联盟的源码RPC架构,分为客户端和服务端两个部分。客户端将JDBC相关操作如建立连接、执行请求等通过RPC协议发送给服务端,服务端执行这些操作并返回结果。Avatica的核心概念有三个:连接、Statement和查询执行。
接下来,我们将通过一个DEMO展示Avatica的使用方法。DEMO中,我们将使用Avatica框架访问MySQL数据库。代码包括客户端测试代码和服务器端代码。客户端首先建立连接,创建Statement,然后执行查询,最后打印结果。
在建立连接的过程中,代码调用Driver的connect方法,实际上由AvaticaFactory创建连接,Avatica的Driver通过此方法创建AvaticaConnection。连接创建时,指定连接驱动、URL、元数据等信息。元数据使用RemoteMeta,它连接实际数据库并代理数据。
客户端发送建立连接请求后,服务端处理逻辑通过Jetty网络服务实现。Jetty收到请求后,将请求交给AbstractAvaticaHandler处理。Handler内部处理流程包括:调用LocalService,LocalService再调用Meta处理连接请求,Meta根据请求内容选择合适的数据库驱动建立连接。
创建Statement的过程与建立连接类似,通过远程请求实现。服务端创建Statement后,返回Statement ID给客户端,客户端通过ID执行后续操作。创建StatementHandle的过程也是远程请求,服务端创建Statement并返回。
执行查询的过程与创建Statement类似,服务端根据Statement ID查找Statement,执行查询并返回结果。
源码解读方面,主要关注几个关键目录:org.apache.calcite.avatica根目录下的JDBC框架代码,包括Connection、Statement、ResultSet等实现;org.apache.calcite.avatica.remote包下的Service定义、请求处理Handler以及RemoteMeta;Server端的org.apache.calcite.avatica.jdbc目录定义代理其他数据源的类,如JdbcMeta和JdbcResultSet;org.apache.calcite.avatica.server目录定义服务端Handler和启动服务。
核心类包括消息类Handler、Service接口、Meta接口和Driver类。Handler负责处理网络请求,Service接口处理请求和响应,Meta接口处理JDBC规范操作请求,Driver类提供了实现Avatica框架的Driver。
总结来说,Avatica通过构建RPC架构,实现JDBC和ODBC标准数据库驱动的自定义和代理,简化了数据库访问过程。通过理解和使用Avatica框架,开发者可以灵活地构建和管理数据库驱动,满足不同场景的需求。
Flink深入浅出:JDBC Connector源码分析
大数据开发中,数据分析与报表制作是日常工作中最常遇到的任务。通常,我们通过读取Hive数据来进行计算,并将结果保存到数据库中,然后通过前端读取数据库来进行报表展示。然而,使用FlinkSQL可以简化这一过程,通过一个SQL语句即可完成整个ETL流程。
在Flink中,读取Hive数据并将数据写入数据库是常见的需求。本文将重点讲解数据如何写入数据库的过程,包括刷写数据库的机制和原理。
以下是本文将讲解的几个部分,以解答在使用过程中可能产生的疑问:
1. 表的定义
2. 定义的表如何找到具体的实现类(如何自定义第三方sink)
3. 写入数据的机制原理
(本篇基于1..0源码整理而成)
1. 表的定义
Flink官网提供了SQL中定义表的示例,以下以oracle为例:
定义好这样的表后,就可以使用insert into student执行插入操作了。接下来,我们将探讨其中的技术细节。
2. 如何找到实现类
实际上,这一过程涉及到之前分享过的SPI(服务提供者接口),即DriverManager去寻找Driver的过程。在Flink SQL执行时,会通过translate方法将SQL语句转换为对应的Operation,例如insert into xxx中的xxx会转换为CatalogSinkModifyOperation。这个操作会获取表的信息,从而得到Table对象。如果这个Table对象是CatalogTable,则会进入TableFactoryService.find()方法找到对应的实现类。
寻找实现类的过程就是SPI的过程。即通过查找路径下所有TableFactory.class的实现类,加载到内存中。这个SPI的定义位于resources下面的META-INFO下,定义接口以及实现类。
加载到内存后,首先判断是否是TableFactory的实现类,然后检查必要的参数是否满足(如果不满足会抛出异常,很多人在第一次使用Flink SQL注册表时,都会遇到NoMatchingTableFactoryException异常,其实都是因为配置的属性不全或者Jar报不满足找不到对应的TableFactory实现类造成的)。
找到对应的实现类后,调用对应的createTableSink方法就能创建具体的实现类了。
3. 工厂模式+创建者模式,创建TableSink
JDBCTableSourceSinkFactory是JDBC表的具体实现工厂,它实现了stream的sinkfactory。在1..0版本中,它不能在batch模式下使用,但在1.版本中据说会支持。这个类使用了经典的工厂模式,其中createStreamTableSink负责创建真正的Table,基于创建者模式构建JDBCUpsertTableSink。
创建出TableSink之后,就可以使用Flink API,基于DataStream创建一个Sink,并配置对应的并行度。
4. 消费数据写入数据库
在消费数据的过程中,底层基于PreparedStatement进行批量提交。需要注意的是提交的时机和机制。
控制刷写触发的最大数量 'connector.write.flush.max-rows' = ''
控制定时刷写的时间 'connector.write.flush.interval' = '2s'
这两个条件先到先触发,这两个参数都是可以通过with()属性配置的。
JDBCUpsertFunction很简单,主要的工作是包装对应的Format,执行它的open和invoke方法。其中open负责开启连接,invoke方法负责消费每条数据提交。
接下来,我们来看看关键的format.open()方法:
接下来就是消费数据,执行提交了
AppendWriter很简单,只是对PreparedStatement的封装而已
5. 总结
通过研究代码,我们应该了解了以下关键问题:
1. JDBC Sink执行的机制,比如依赖哪些包?(flink-jdbc.jar,这个包提供了JDBCTableSinkFactory的实现)
2. 如何找到对应的实现?基于SPI服务发现,扫描接口实现类,通过属性过滤,最终确定对应的实现类。
3. 底层如何提交记录?目前只支持append模式,底层基于PreparedStatement的addbatch+executeBatch批量提交
4. 数据写入数据库的时机和机制?一方面定时任务定时刷新,另一方面数量超过限制也会触发刷新。
更多Flink内容参考: