使用commons-pool2实现Hdfs连接池

Author Avatar
AF_ 04月 26,2020
  • 使用微信扫码分享

前面写过一篇java上传文件至hdfs的文章,实现方式上每次操作hdfs都会创建一个新的hdfs连接,这种方式极易产生奇奇怪怪的问题(内存泄漏等等),所以简单研究了一下commons-pool2实现了一个Hdfs连接池,记录一下。

先上github地址:https://github.com/AF-lmf/hdfs-pool 代码就不贴出来了,下面大致说一下整体的逻辑

image.png

  • 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,是底层的连接实例,所有增删改查的方法都要在这里实现,只不过获取/销毁连接交给池管理。