# 1. JDBC 驱动类型,Type 1(JDBC-ODBC)、Type 2(Native)、Type 3(Net)、Type 4(Pure Java)? A Type 4(Pure Java)直接实现数据库协议,无需本地库与中间件,是当前主流 ✓ 正确答案 B Type 1 是纯 Java 实现,性能最好 C Type 2 无需本地库,纯 Java D Type 3 不需要中间件
# 2. MySQL JDBC 驱动的 mysql-connector-j 与 prepareStatement 的优化? A 默认使用服务端预编译,无需配置 B 服务端预编译没有任何额外开销 C 它不支持预编译 D 默认客户端预编译,需 useServerPrepStmts=true 启用服务端预编译,配合 cachePrepStmts 缓存 ✓ 正确答案
# 3. PostgreSQL JDBC 驱动的 pgjdbc 与 PgBouncer 兼容模式? A pgjdbc 默认开启服务端预编译,与池模式无关 B pgjdbc 用 prepareThreshold 控制切换服务端预编译,PgBouncer 的 transaction 池会破坏 prepared statement 状态,需注意兼容 ✓ 正确答案 C PgBouncer 与预编译语句完全无关 D PgBouncer 只支持 session 池模式
# 4. 连接串(Connection URL)的常见参数,useSSL、serverTimezone、characterEncoding? A characterEncoding 只在 mongo 中有意义 B serverTimezone 只影响性能,不影响数据 C useSSL 控制加密连接,serverTimezone 指定时区,characterEncoding 指定字符集,配置不当会导致乱码或日期错乱 ✓ 正确答案 D useSSL 与安全无关,只是性能开关
# 5. 数据库网络协议(PostgreSQL 前后端协议、MySQL 客户端/服务器协议)? A PostgreSQL 与 MySQL 都是纯文本协议,无二进制 B 数据库协议只用于认证,不用于查询 C 协议与驱动无关,驱动不实现协议 D 两者都有认证、SQL 发送与结果返回的消息交换,PostgreSQL 用扩展查询协议、MySQL 有文本与二进制协议 ✓ 正确答案
# 6. MySQL 8 caching_sha2_password 认证的完整流程(快速路径/完整路径)与 JDBC 兼容 A 它只有一条认证路径,无缓存 B 它不需要密码交换,直接放行 C 快速路径命中服务器缓存直接验证,完整路径需 RSA 或 TLS 传输密码,JDBC 可能需 allowPublicKeyRetrieval=true ✓ 正确答案 D JDBC 8 完全不支持该认证
# 7. MySQL 的文本协议与预处理语句的二进制协议在结果集传输与类型安全上有何差异?为什么二进制协议更高效? A 文本协议结果集以原生二进制传输,类型安全 B 文本协议比二进制协议更高效 C 两者传输方式完全相同 D 二进制协议结果集按原生类型编码,传输紧凑、类型安全,比文本协议更高效 ✓ 正确答案
# 8. JDBC 如何实现查询取消?PostgreSQL 的 CancelRequest 与 MySQL 的 KILL QUERY 在协议层如何配合驱动超时? A 查询取消只是客户端丢弃结果,服务端继续执行 B Statement.cancel 通过服务端执行取消,PostgreSQL 用 CancelRequest、MySQL 用 KILL QUERY,配合驱动超时中断查询 ✓ 正确答案 C 驱动超时无法真正取消服务端查询 D 取消请求走阻塞的查询连接
# 9. MySQL caching_sha2_password 认证的快速路径与完整路径(RSA 交换)流程?JDBC 8+ 需要配置哪些参数才能兼容? A 完整路径无需任何密码传输,直接放行 B 快速路径命中缓存直接验证,完整路径需 RSA 或 TLS 传输密码,非 TLS 下 JDBC 需 allowPublicKeyRetrieval=true ✓ 正确答案 C JDBC 8+ 无法配置 RSA 公钥检索 D 快速路径也需要 RSA 交换
# 10. PgBouncer 的事务级与语句级池模式对 prepared statement、临时表与 LISTEN/NOTIFY 的影响? A transaction 池模式在事务结束后归还连接,prepared statement、临时表、LISTEN/NOTIFY 等会话状态会失效 ✓ 正确答案 B transaction 池模式保留所有会话状态,与 session 池模式相同 C statement 池模式最保守,保留临时表 D 所有池模式都保留 prepared statement
# 11. 数据库驱动连接参数(connectTimeout、socketTimeout)与数据库端 wait_timeout、interactive_timeout 如何配合,避免空闲连接被服务端提前断开? A connectTimeout 管建立连接,socketTimeout 管读写,保活周期小于 wait_timeout 才能避免空闲连接被服务端提前断开 ✓ 正确答案 B socketTimeout 越大连接越容易断开 C wait_timeout 与驱动无关 D connectTimeout 是读写超时
# 12. 数据库协议的身份认证流程,MySQL caching_sha2_password 与 PostgreSQL SCRAM-SHA-256 在握手消息交换上的差异? A SCRAM-SHA-256 是标准挑战-响应、密码不直接传输,caching_sha2_password 用哈希+可选 RSA/TLS,两者流程不同 ✓ 正确答案 B 两者都直接明文传输密码 C 两者握手流程完全相同 D PostgreSQL 也用 caching_sha2_password
# 13. MySQL 驱动的 rewriteBatchedStatements 与 useServerPrepStmts 组合对批量 INSERT 的网络往返与解析开销有何影响? A 两者组合时 rewriteBatchedStatements 减少往返,但重写多值语句可能影响服务端预编译的复用,需权衡 ✓ 正确答案 B 两者完全独立,互不影响 C 组合必定禁用服务端预编译 D rewriteBatchedStatements 只影响解析,不影响往返
# 14. PostgreSQL 扩展查询协议(Parse/Bind/Execute)与预编译语句的对应关系 A Parse 阶段就执行查询 B 扩展查询协议没有预编译能力 C Parse 解析生成预编译语句,Bind 绑定参数,Execute 执行,三者分离使预编译语句可复用 ✓ 正确答案 D 预编译语句无法在协议层复用
# 15. JDBC 的 setFetchSize 与游标模式(useCursorFetch)如何避免大结果集 OOM?与数据库端游标资源释放的关系是什么? A setFetchSize 不改变内存占用,只影响网络 B useCursorFetch 配合 setFetchSize 分批拉取避免 OOM,游标资源需遍历完或关闭连接释放 ✓ 正确答案 C 游标模式无需关闭 ResultSet D 游标资源永远不会占用数据库
# 16. 驱动连接参数,useSSL、verifyServerCertificate 与服务器 TLS 配置的配合,以及 profileSQL/logSlowQueries 日志开关的用途? A profileSQL 用于关闭 SQL 日志 B useSSL 与证书验证无关 C verifyServerCertificate 需配合 trustStore 验证服务器证书,profileSQL/logSlowQueries 用于 SQL 与慢查询诊断 ✓ 正确答案 D verifyServerCertificate 与 SSL 安全性无关
# 17. 连接池与驱动的配合,getConnection 的超时与校验? A 校验只发生在归还时 B getConnection 没有超时,会无限等待 C 驱动超时与连接池无关 D 池的 maxWait/connectionTimeout 控制获取等待,驱动 ConnectTimeout 控制建连,test-on-borrow 校验连接有效性 ✓ 正确答案
# 18. 驱动连接串的故障转移参数(loadBalance/failover)与只读路由(readOnly) A 连接串无法配置多个主机 B failover 保证切换后事务完全一致 C readOnly 只影响性能,不影响路由 D failover/loadBalance 提供主机切换与负载均衡,readOnly 标记只读便于路由到从库,但 failover 切换可能不保证事务一致性 ✓ 正确答案
# 19. JDBC DatabaseMetaData 的元数据查询会访问 information_schema,为什么高并发初始化场景下会成为性能瓶颈?如何缓存? A information_schema 查询从不加锁 B 元数据查询总是免费的,无性能问题 C 元数据查询访问 information_schema 开销大,高并发初始化时成瓶颈,应启动时查一次并缓存减少重复访问 ✓ 正确答案 D 元数据无法缓存,只能每次查询