使用 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;
}
}
我们使用 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;
}
}