1.MySQL JDBC 编译添加 Maven 依赖支持
2.odbc和jdbc的添加区别是什么
3.源码详解系列(四) ------ DBCP2的使用和分析(包括JNDI和JTA支持)已停更
4.Flink深入浅出:JDBC Connector源码分析
5.深入源码分析下 HIVE JDBC 的超时机制及其如何配置 socketTimeOut
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官方能尽快采纳这些改进。
odbc和jdbc的区别是什么
odbc和jdbc的区别是JDBC比ODBC更容易理解;JDBC的移植性要比ODBC要好;JDBC数据库驱动程序是面向对象的。
1.JDBC比ODBC更容易理解。
在ODBC中一个的简单的查询,也需求分为好几块内容;而在ODBC驱动程序内部再去整合,做一些复杂的源码代写操作。这不仅降低了数据库启动程序的性能,而且也给程序开发者开发实际运用程序带来了确定的负面效果。而JDBC数据库启动程序在设计的时间就包含了大部份基本数据操作功能,为此在编写一些常规的数据库操作语句时,如查询、更新等等,其所需求的源代码比ODBC要少的多。故从这方面来说,JDBC数据库启动程序要比ODBC简易理解。
2.JDBC数据库驱动程序是面向对象的。
JDBC完全遵循Java语言的优良特性。通常情况下,只要有Java功能需设计基础的用户都能在最短时间内了解JDBC驱动程序的架构,较量简易上手,能轻而易举的开发出强悍的数据库实际运用程序。而ODBC的话,由于其内部功能复杂,源代码编写要求高。为此即使是一个的C语言的高手,仍然需求花费不少的时间去了解那个数据库启动程序;在编写源代码的时间,还离不开有关的参考书本。
3.JDBC的移植性要比ODBC要好。
通常情况下,安装完ODBC驱动程序之后,还需求经过确定的scratch 源码配置才能够应用。而不相同的配置在不相同数据库服务器之间不能够通用。也那是说,装一次需求配置一次。但是JDBC数据库驱动程序则不相同。假如采用JDBC数据库驱动程序的话,则只需要选取适当的 JDBC数据库驱动程序,就不需要额外的配置。在安装过程中,JDBC数据库驱动程序会自己完成有关的配置。为此JDBC的移植性要比ODBC要好。
源码详解系列(四) ------ DBCP2的使用和分析(包括JNDI和JTA支持)已停更
DBCP是一个用于创建和管理数据库连接的工具,通过连接池复用连接以减少资源消耗。它具备连接数控制、连接有效性检测、连接泄露控制和缓存语句等功能。Tomcat内置连接池、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项目,arptables源码打包方式为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中实际调用的数据源,用于管理连接。aircrack源码
ManagedDataSource:PoolingDataSource的子类,用于支持XA事务或JTA事务的连接。
使用DBCP连接池创建连接时,首先创建BasicDataSource对象,初始化配置参数。然后从连接池中获取连接。连接获取过程涉及到数据源和连接池的创建,连接对象的包装和回收。通过JNDI获取数据源对象需求
使用JNDI获取DBCP数据源对象,以PerUserPoolDataSource和SharedPoolDataSource为例。为了在tomcat容器中测试,需要配置JNDI上下文。引入依赖
引入JNDI相关的依赖。
编写context.xml文件,配置JNDI上下文。
在web.xml中配置资源引用,将JNDI对象与web应用绑定。
测试结果
打包项目并部署到tomcat上运行,通过访问指定的jsp页面,验证JNDI获取数据源对象的正确性。使用DBCP测试两阶段提交
介绍如何使用DBCP实现JTA事务的两阶段提交(2PC)。使用DBCP的BasicManagedDataSource类支持事务处理。通过测试代码验证了2PC的正确性。 以上内容涵盖了DBCP的使用、配置、源码分析、JNDI集成以及两阶段提交的实现,为开发者提供了全面的参考。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内容参考:
深入源码分析下 HIVE JDBC 的超时机制及其如何配置 socketTimeOut
深入源码分析下HIVE JDBC的超时机制及其配置方法,首先,从一个常见的问题出发,即当HIVE JDBC连接在操作过程中遇到SocketTimeoutException时,这通常意味着操作超时。接下来,让我们回顾JDBC超时机制的相关参数和接口。
在JDBC中,超时机制主要通过setStatementTimeout和setConnectionTimeout这两个方法实现。setStatementTimeout用于设置SQL语句的超时时间,而setConnectionTimeout用于设置整个连接的超时时间。它们的单位都是毫秒。
在HIVE JDBC中,由于其基于Thrift进行通信,因此对socket级别的超时管理更为复杂。HiveStatement中的thrift socket timeout是通过配置实现的,通过深入源码分析,可以发现thrift socket timeout的值被赋值给HiveStatement实例。当应用程序直接创建和管理HIVE JDBC连接时,需要在创建HiveStatement实例时设置这个属性,以确保socket级别操作的超时时间得到正确配置。
如果应用程序通过数据库连接池进行连接管理,那么配置HiveStatement中的thrift socket timeout的过程会更复杂。通常,需要在连接池的配置中,为HIVE JDBC连接指定socket级别的超时属性,然后在使用连接时确保HiveStatement实例正确引用了这些配置。
通过以上分析,我们可以总结出在不同场景下配置HIVE JDBC socket级别的超时机制的方法。对于直接管理连接的应用程序,需要在创建HiveStatement实例时直接设置socket timeout属性。而对于使用数据库连接池的应用程序,则需要在连接池的配置阶段为HIVE JDBC连接指定socket级别的超时属性,然后确保在使用连接时HiveStatement实例正确引用了这些配置。
总之,HIVE JDBC的超时机制及其配置方法涉及到多个层面的参数和接口,理解并正确配置它们对于确保应用程序的稳定性和响应速度至关重要。通过源码分析和实践操作,可以实现对HIVE JDBC socket级别的超时管理,从而优化应用程序性能。