通常 Java 应用中和数据库相关的常用组件有:
- JDBC API 及实现:Java 应用通常使用 JDBC (Java Database Connectivity) 来访问数据库。JDBC 定义了访问数据库 API,而 JDBC 实现完成标准 API 到 MySQL 协议的转换,常见的 JDBC 实现是 MySQL Connector/J,此外有些用户可能使用 MariaDB Connector/J。
- 数据库连接池:为了避免每次创建连接,通常应用会选择使用数据库连接池来复用连接,JDBC DataSource 定义了连接池 API,开发者可根据实际需求选择使用某种开源连接池实现。
- 数据访问框架:应用通常选择通过数据访问框架 (MyBatis, Hibernate) 的封装来进一步简化和管理数据库访问操作。
JDBC
- 为避免重复解析和生成 SQL 执行计划的开销,注意选择使用 Prepare API,并且需要在 JDBC 连接参数中配置 useServerPrepStmts = true。
- 对于批量插入更新,如果插入记录较多,可以选择使用 addBatch/executeBatch API。通过 addBatch 的方式将多条 SQL 的插入更新记录先缓存在客户端,然后在 executeBatch 时一起发送到数据库服务器,如果希望 Batch 网络发送,需要在 JDBC 连接参数中配置 rewriteBatchedStatements = true。
- 在查询返回超大结果集的场景中,推荐设置 FetchSize为Integer.MIN_VALUE让客户端不缓存,客户端通过 StreamingResult 的方式从网络连接上流式读取执行结果。使用流式读取数据时,需要将resultset读取完成或 close 后,才能继续使用该语句进行下次查询,否则会报错。如果需要在resultset读取完成或 close 前进行查询避免报错,可在 URL 中添加配置参数clobberStreamingResults=true,这样会自动 close resultset,但之前流式查询未被读取的结果集会丢失。
连接池
- 应用侧可以通过 maximumPoolSize配置连接池最大连接数,可以通过minimumIdle配置连接池最小空闲连接数,需要根据自身情况配置合适的连接池大小。
- 分布式数据库HTAP 默认不会主动关闭客户端连接(除非报错),但是也需要探活连接,可以在每次使用连接前检查连接是否可用,或者定期发送 test query 保活连接等方式进行探活。
数据库访问框架
- 可以使用目前比较流行MyBatis数据访问框架管理 SQL 并完成结果集和 Java 对象的来回映射工作。
- 如果希望从MyBatis中读取超大结果集合时可以使用带 ResultHandler的查询接口来避免一次获取整个结果集,或者使用Cursor 类来进行流式读取等。