java标准数据源接口javax.sql.datasource不实现连接池,仅定义契约;第三方池(如druid、hikaricp)实现该接口后,业务代码只需依赖接口,更换池时无需修改逻辑,仅需替换datasource实例即可。

用标准接口屏蔽具体实现
所有主流连接池(Druid、HikariCP、C3P0)都实现了`DataSource`接口。这意味着你写业务时只需依赖接口:
- DAO层或Service中只声明
private DataSource dataSource; - 调用
dataSource.getConnection()获取连接,conn.close()归还(实际归还给池) - 完全不 import 任何连接池专属类(比如
DruidDataSource或HikariConfig)
这样,哪怕后期从C3P0换成HikariCP,只要注入的是新池的DataSource实例,原有数据库操作代码一行都不用动。
三种主流集成方式
根据项目环境选择合适路径,核心都是把第三方池的DataSource实例交给应用使用:
-
纯Java SE项目:手动创建池对象并赋值给全局或Spring管理的
DataSourceBean。例如:new DruidDataSource()或new HikariDataSource(config) -
Spring Boot项目:通过
spring.datasource.type指定全限定类名(如com.alibaba.druid.pool.DruidDataSource),Boot自动用该类型构造Bean;也可自定义@Bean方法返回池实例 -
Web容器(如Tomcat):在
context.xml中配置JNDI资源,类型设为第三方池类,应用通过InitialContext.lookup("java:comp/env/jdbc/xxx")获取标准DataSource
注意配置与驱动兼容性
无缝的前提是配置正确,否则会抛SQLException或连接泄漏:
- 确保引入对应连接池的JAR包(如Druid需
druid-spring-boot-starter)和数据库驱动(如mysql-connector-java) - URL、用户名、密码等基础参数必须匹配目标数据库;部分池有专属参数(如Druid的
filters=stat,wall、Hikari的connection-timeout),这些不影响接口调用,但影响运行表现 - 连接测试逻辑(如
testOnBorrow或connection-test-query)要适配数据库方言(MySQL用SELECT 1,Oracle用SELECT 1 FROM DUAL)
MyBatis等框架也遵循同一原则
像MyBatis这类ORM框架,其<datasource type="POOLED"></datasource>本质也是自己实现了一个简易池;但只要你把type改成UNPOOLED,再把第三方池的DataSource对象传进去(通过setDataSource()或Spring注入),它就自动用你的高性能池,无需修改SQL映射或Mapper接口。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











