上头要求要实现一个通用的数据库访问服务,其他业务系统所有的数据库访问都会通过该服务来执行,但是又不希望在开发阶段拆分出来(是的,我也很纳闷为什么非要这样,已经提出过其他方案都被打回了),因此,想到如下的实现方案:
- 实现一个执行服务,该服务中维护连接池(
HikariCP),及池内 Connection 等的状态 - 实现一个 DataSource 模块,代理 Connection、Statement、PreparedStatement、CallableStatement、ResultSet 的所有方法,将调用转发到执行服务,可采用 RPC 的方式,并需要带上一个唯一标识符,假设是 UUID
- 执行服务收到调用后,根据 UUID 找到对应的 Connection,如果没有的话就从连接池中获取一个 Connection,并标记该 Connection 处于使用中的状态,不允许被其他调用使用
- 业务系统按照正常的方式(
JPA)进行开发,但是需要修改数据库连接的数据源,改由 DataSource 模块提供 - 对于使用中的 Connection,都要维护其打开的 Statement、PreparedStatement、CallableStatement、ResultSet,直到调用 close,调用 close 后除 Connection 外其他释放资源,将 Connection 归还到连接池
该方案目前想到的一个问题比较不好处理的问题:ResultSet 有可能是懒加载的,也就意味着一条查询可能会需要多次从执行服务中获取结果集,对于插入和更新同理
个人觉得该方案理论上是可行的,且不算是特别复杂,但是又担心有哪些隐形的坑,所以想请教各位帮忙分析下,万分感谢!