前面写过一篇java上传文件至hdfs的文章,实现方式上每次操作hdfs都会创建一个新的hdfs连接,这种方式极易产生奇奇怪怪的问题(内存泄漏等等),所以简单研究了一下commons-pool2实现了一个Hdfs连接池,记录一下。
先上github地址:https://github.com/AF-lmf/hdfs-pool 代码就不贴出来了,下面大致说一下整体的逻辑
-
properties
目录下提供了一些外部配置,包括krb5认证和连接池参数的相关配置 -
@Configuration
注解加到Hdfsconfig
类上,作为一个配置类,springboot会扫描并注入它名下管理的类,其中@Bean(initMethod = "init", destroyMethod = "stop")
标签表示spring在初始化这个类时调用他的init
方法,销毁时调用他的stop
方法。 -
HdfsClient
是业务方法调用的类,spring在初始化这个类时,调用它的init
方法,这个方法会创建HdfsPool
(即Hdfs的连接池)。其他方法是对Hdfs中方法的二次封装,即先使用连接池获取实例,再调用实例方法。 -
HdfsPoolConfig
继承commons-pool2
包中的GenericObjectConfig
,受spring管理,作为线程池的配置类,创建HdfsPool
时作为参数传入。 -
HdfsFactory
继承commons-pool2
包中的GenericObjectFactory
,受spring管理,作为创建连接实例的工厂类,创建HdfsPool
时作为参数传入。实际上连接池就是通过它获取的连接实例。 -
HdfsPool
继承commons-pool2
包中的GenericObjectPool
,是连接池实例。 -
Hdfs
,是底层的连接实例,所有增删改查的方法都要在这里实现,只不过获取/销毁连接交给池管理。
评论区