多模块Java项目中JDBC访问需解耦、复用、可控、可维护:统一数据源与连接池管理,DAO层抽象与SQL分离,事务由service层统一控制,异常标准化并增强可观测性。

在多模块 Java 项目中,JDBC 的数据库访问不能简单复用单模块的直连写法。核心在于**解耦、复用、可控、可维护**——把连接管理、SQL 执行、事务控制、异常处理等职责分层隔离,避免各模块重复写 DriverManager.getConnection、手动 close、硬编码 URL 或 SQL。
统一数据源与连接池管理
不推荐每个模块自己 new Connection 或调用 DriverManager。应由基础模块(如 common-datasource 或 infra-jdbc)提供统一的数据源:
- 使用标准连接池(如 HikariCP、Druid),配置集中放在
application.yml或jdbc.properties中 - 通过 Spring 的
@Configuration或 Jakarta EE 的DataSourceJNDI 绑定暴露DataSourceBean - 其他业务模块只依赖该
DataSource,不直接接触驱动类或 URL 字符串 - 模块间不共享 Connection 实例;每次操作从池获取,用完归还
DAO 层抽象与 SQL 分离
每个业务模块(如 user-service、order-module)应定义自己的 DAO 接口,并在实现类中仅使用 DataSource 获取连接:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- DAO 接口定义方法签名(如
User findUserById(Long id)),不暴露 JDBC 类型 - 实现类使用
PreparedStatement防注入,SQL 语句建议外置到*.sql文件或常量类中,避免字符串拼接 - 禁止在 service 层手写
Connection.createStatement()或裸executeUpdate - 可封装轻量工具类(如
JdbcTemplate简化模板代码),但不引入完整 ORM 框架时需保持无状态、线程安全
事务边界由上层模块统一控制
事务不应在 DAO 层开启/提交,而应由调用方(通常是 service 层)声明式或编程式管理:
立即学习“Java免费学习笔记(深入)”;
- Spring 项目:在 service 方法上加
@Transactional,确保同一事务内多个 DAO 调用共享 Connection - 非 Spring 项目:通过
DataSourceUtils.getConnection()或自定义TransactionManager绑定线程上下文 Connection - 跨模块调用(如 order-service 调 user-service 的用户校验)需明确事务传播行为,避免嵌套事务或连接泄漏
错误处理与可观测性对齐规范
多模块协作时,数据库异常必须标准化,便于统一日志、监控和告警:
- 将
SQLException映射为项目级业务异常(如DataAccessException),隐藏底层驱动细节 - 所有 DAO 方法抛出受检异常或运行时异常,且异常信息包含模块名、SQL 标识符(如
user_dao_find_by_id)、影响行数(DML 场景) - 关键 SQL 执行前后记录 trace ID 和耗时,接入统一链路追踪(如 SkyWalking)
- 连接池指标(活跃连接数、等待时间、超时次数)应在 infra 模块暴露为 Prometheus metrics

















