Defensively handle DatabaseMetaData.getConnection() returning null

Issue: SPR-16495

(cherry picked from commit 766e602)
This commit is contained in:
Juergen Hoeller
2018-02-14 14:40:52 +01:00
parent 3b0eca921c
commit f2dc075335

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -64,23 +64,26 @@ public class OracleTableMetaDataProvider extends GenericTableMetaDataProvider {
super(databaseMetaData);
this.includeSynonyms = includeSynonyms;
lookupDefaultSchema(databaseMetaData);
this.defaultSchema = lookupDefaultSchema(databaseMetaData);
}
/*
* Oracle-based implementation for detecting the current schema.
*/
private void lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
private static String lookupDefaultSchema(DatabaseMetaData databaseMetaData) {
try {
CallableStatement cstmt = null;
try {
cstmt = databaseMetaData.getConnection().prepareCall(
"{? = call sys_context('USERENV', 'CURRENT_SCHEMA')}");
Connection con = databaseMetaData.getConnection();
if (con == null) {
logger.debug("Cannot check default schema - no Connection from DatabaseMetaData");
return null;
}
cstmt = con.prepareCall("{? = call sys_context('USERENV', 'CURRENT_SCHEMA')}");
cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.execute();
this.defaultSchema = cstmt.getString(1);
return cstmt.getString(1);
}
finally {
if (cstmt != null) {
@@ -89,7 +92,8 @@ public class OracleTableMetaDataProvider extends GenericTableMetaDataProvider {
}
}
catch (SQLException ex) {
logger.debug("Encountered exception during default schema lookup", ex);
logger.debug("Exception encountered during default schema lookup", ex);
return null;
}
}
@@ -113,6 +117,12 @@ public class OracleTableMetaDataProvider extends GenericTableMetaDataProvider {
}
Connection con = databaseMetaData.getConnection();
if (con == null) {
logger.warn("Unable to include synonyms in table metadata lookup - no Connection from DatabaseMetaData");
super.initializeWithTableColumnMetaData(databaseMetaData, catalogName, schemaName, tableName);
return;
}
NativeJdbcExtractor nativeJdbcExtractor = getNativeJdbcExtractor();
if (nativeJdbcExtractor != null) {
con = nativeJdbcExtractor.getNativeConnection(con);
@@ -149,7 +159,7 @@ public class OracleTableMetaDataProvider extends GenericTableMetaDataProvider {
Boolean originalValueForIncludeSynonyms;
try {
Method getIncludeSynonyms = con.getClass().getMethod("getIncludeSynonyms", (Class[]) null);
Method getIncludeSynonyms = con.getClass().getMethod("getIncludeSynonyms");
ReflectionUtils.makeAccessible(getIncludeSynonyms);
originalValueForIncludeSynonyms = (Boolean) getIncludeSynonyms.invoke(con);