在 Hibernate Reactive 中使用 JDBC THIN Driver 时,需要对 JDBC 连接 URL 进行特殊处理。以下是一份示例代码:
import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import org.hibernate.reactive.pool.impl.PoolConfiguration;
import org.hibernate.reactive.provider.Settings;
import org.hibernate.reactive.provider.jdbc.JdbcResourceLocalTransactionCoordinatorBuilderImpl;
import org.hibernate.reactive.provider.jdbc.JdbcService;
import org.hibernate.reactive.provider.jdbc.JdbcServiceImpl;
import java.util.Properties;
public class CustomJdbcService extends JdbcServiceImpl {
@Override
protected Settings.SettingsBuilder<?, ?> configureSettings(Settings.SettingsBuilder<?, ?> settingsBuilder, Properties properties) {
// 添加 url 参数:
// - 将协议头替换为 jdbc:oracle:thin
// - 将端口号后面的 uri 编码部分替换为 connectString 参数的值
final String url = properties.getProperty("hibernate.connection.url");
if (url == null) {
throw new IllegalArgumentException("hibernate.connection.url not specified");
}
final String[] urlParts = url.split(":");
String newUrl = "jdbc:oracle:thin:@" + properties.getProperty("connectString", "") +
(urlParts.length > 3 ? ":" + urlParts[3] : "") +
(urlParts.length > 4 ? ":" + urlParts[4] : "");
settingsBuilder.applyJdbcUrl(newUrl);
// 进行正常的 Hibernate Reactive 配置:
return super.configureSettings(settingsBuilder, properties);
}
@Override
public JdbcResourceLocalTransactionCoordinatorBuilderImpl getTransactionCoordinatorBuilder() {
return new JdbcResourceLocalTransactionCoordinatorBuilderImpl(null) {
@Override
protected ConnectionFactory createConnectionFactory(PoolConfiguration configuration) {
// 建立 R2DBC 的连接工厂并转换为 JDBC 连接工厂
ConnectionFactory r2dbcConnectionFactory = ConnectionFactories.get(configuration.getUrl());
return new ReactiveJdbcConnectionFactory(
new io.r2dbc.spi.ConnectionFactory() {
@Override
public Connection create() { return r2dbcConnectionFactory.create().block