如何从新版Vert.x的io.vertx.sqlclient.SqlConnection获取底层java.sql.Connection
新版Vert.x JDBC sql-client获取底层java.sql.Connection解决方案
核心思路
新版io.vertx.sqlclient.SqlConnection是Vert.x统一的异步数据库客户端接口,同时支持JDBC适配和原生异步数据库驱动(如PG、MySQL异步客户端),因此移除了通用接口上的unwrap方法。JDBC场景下返回的SqlConnection实际是io.vertx.jdbcclient.JDBCConnection接口的实现类,该专属接口仍保留了获取底层JDBC连接的能力。
实现步骤
- 确认项目引入了
vertx-jdbc-client依赖,非JDBC实现的异步数据库客户端无法获取java.sql.Connection实例。 - 对获取到的
SqlConnection实例做类型判断和转换,转为JDBCConnection后调用unwrap方法即可拿到底层连接。
代码示例
import io.vertx.jdbcclient.JDBCConnection; import io.vertx.sqlclient.SqlConnection; // 已通过连接池或事务获取到SqlConnection实例sqlConnection if (sqlConnection instanceof JDBCConnection) { JDBCConnection jdbcConn = (JDBCConnection) sqlConnection; java.sql.Connection underlyingJdbcConn = jdbcConn.unwrap(); // 此处执行基于原生JDBC API的操作 }
注意事项
- 不要手动关闭获取到的底层
java.sql.Connection,连接生命周期由Vert.x连接池统一管理,手动关闭会导致连接池状态异常。 - 对底层JDBC连接的操作属于阻塞操作,请勿在Vert.x EventLoop线程中执行长耗时操作,建议将阻塞逻辑提交到Vert.x工作线程池运行。
- 常规CRUD操作优先使用Vert.x SqlClient提供的异步API,仅在必须依赖原生JDBC能力的特殊场景下使用该方案,避免破坏异步编程模型。
内容的提问来源于stack exchange,提问作者Vishnu Kumar
相关产品推荐
相关产品推荐

