使用 Hibernate Spatial 时无法获得连接

Unable to get Connection while using Hibernate Spatial

我们使用 Weblogic、Hibernate 4.2.7、Hibernate Spatial 4.0 和 Oracle 作为数据库。

在执行保存操作时,有时我们观察到无法获得连接

您能否建议我们遗漏的 Spatial 配置?

    Stack Trace :
    Caused by: org.hibernate.spatial.helper.FinderException: Tried retrieving OracleConnection from weblogic.jdbc.wrapper.JTSConnection_weblogic_jdbc_wrapper_PooledConnection_oracle_jdbc_driver_LogicalConnection using method getConnectionCacheCallbackPrivObj, but received null.
    at org.hibernate.spatial.dialect.oracle.DefaultConnectionFinder.find(DefaultConnectionFinder.java:75)
    at org.hibernate.spatial.dialect.oracle.DefaultConnectionFinder.find(DefaultConnectionFinder.java:44)
    at org.hibernate.spatial.dialect.oracle.OracleJDBCTypeFactory.createStruct(OracleJDBCTypeFactory.java:119)
    ... 79 more

Hibernate Spatial for Oracle DB 需要本机 oracle 连接(take a look to documentation 部分 ConnectionFinder 接口 )。您必须调整 weblogic 配置或实施您自己的 ConnectionFinder 以提供与 Hib-Spa 的 Oracle 连接。

例如,如果您使用 DBCP 连接轮询,则只需将 accessToUnderlyingConnectionAllowed 属性 设置为 true

祝你好运!

如果您使用的是 DBCP 连接轮询,则只需将 accessToUnderlyingConnectionAllowed 属性 设置为 true`@Bean public BasicDataSource 数据源() {

    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(oracleDriver);
    dataSource.setUrl(oracleUrl);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setInitialSize(initSize);
    dataSource.setMaxIdle(maxIdle);
    dataSource.setMaxActive(maxActive);
    dataSource.setMinIdle(minIdle);
    dataSource.setAccessToUnderlyingConnectionAllowed(true);
    return dataSource;
}

`

如果您正在使用 Spring(引导)JPA,请尝试

spring.jpa.properties.hibernate.spatial.connection_finder=yourpackage.CustomConnectionFinder

使用连接查找器:

public class CustomConnectionFinder implements ConnectionFinder {
    private static final Logger logger = LoggerFactory.getLogger(CustomConnectionFinder.class);

    @Override
    public Connection find(Connection connection) {
        try {
            return ((HikariProxyConnection) connection).unwrap(OracleConnection.class);
        } catch (SQLException e) {
            logger.error("CustomConnectionFinder: error={}", e.getMessage(), e);
        }
        return null;
    }
}