能否将javax.sql.DataSource对象缓存到Redis中?
Redis是否支持缓存javax.sql.DataSource对象?
结论先行
不支持,也完全不建议尝试缓存该类型对象,核心原因如下:
- Redis本身仅支持二进制、字符串、列表等内置数据类型的存储,Java对象要存入Redis必须经过序列化处理。而
javax.sql.DataSource作为数据库连接池的顶层抽象,其所有主流实现(如HikariCP、Druid、DBCP2的DataSource实现)都持有大量非可序列化运行时资源:包括活跃的数据库TCP连接、连接状态标记、池化调度器等,且大多未实现Serializable接口,根本无法完成正常序列化。 - 哪怕你通过特殊手段强制完成序列化,反序列化后得到的DataSource实例也是无效的:其内部持有的数据库连接、网络套接字在序列化阶段就已经断开,反序列化后也不会自动重建,完全无法正常执行数据库操作。
- 从业务价值角度看,缓存DataSource没有任何意义:DataSource的核心作用是复用本地运行的数据库连接,序列化存储再反序列化的开销远高于直接用配置新建一个DataSource实例。
替代方案
如果你需要复用连接池相关配置,可以将JDBC地址、用户名密码、连接池核心参数这类可序列化的配置信息存入Redis,取出后用这些参数重新初始化新的DataSource实例即可。
内容的提问来源于stack exchange,提问作者ysn
相关产品推荐
相关产品推荐

