思考,如何实现 mybatis动态数据源,带限速的批量执行组件?
当前的痛点:
存在一批动态数据库列表,经常需要在这批数据库上执行各种不同的SQL,实现数据的采集。当前的项目中,普遍是自行实现的组装jdbc的url,执行进行connection连接,获得连接,组装sql,然后组装task(利用connection执行sql)放在线程池执行,再自行解析ResultSet。
这里存在几个问题:
- 重复代码的问题:人肉连接connection、释放connection,根据不同业务拼装sql,解析返回的ResultSet之类。
- 可能有资源泄漏的问题:代码模板基本都是copy出来的,稍微一个不小心,忘记关闭connection,就会泄漏连接。
- 频繁的打开和关闭connection:因为connection是手动维护的,封装成函数后,一旦存在循环调用这块的调用,就频繁打开和关闭同一个连接。
- 缺乏统一的监控异常处理能力:一批数据库执行动态拼接的SQL,执行过程中可能出现各种错误,copy版本的代码,虽然有嵌套的try,但是不能完善处理。
- 容易造成目标的连接耗尽:获取完connection,拼接完SQL,直接丢入线程池运行。线程池corePoolSize很大的情况下,容易消耗大量的数据库连接。
需要解决的问题:
- 自动化管理connection:让用户不需要操心connection的创建和释放。
- 采用mybatis的管理:避免用户人肉拼接SQL,人肉处理返回的ResultSet。
- connection自动池化管理:避免同一个数据库,在循环调用内部,频繁的打开和关闭connection。
- 数据库限速保护:在connection池化的基础上,增加限速保护,避免同时大量启动线程连接同一个数据库,耗尽数据库连接。
路线:
- 调研现有的动态数据源的实现方式。
- 调研connection池化技术。
- 结合自身的具体情况,实现自定义的动态数据源:当用户使用某个数据库进行connection的时候,自动创建池化连接,如果连接池一直不活跃一段时间,自动释放整个连接池。同时配合mybatis,动态替换mybatis的数据源为自己的连接池。在mybatis+自定义动态数据源的基础上,增加批量执行的功能,sql执行速度自适应。