Skip to content

Commit 92ffe6d

Browse files
committed
Use the JDBC metadata to display more info about the datasource
Not convinced I like how this turned out
1 parent 67fe589 commit 92ffe6d

File tree

5 files changed

+92
-48
lines changed

5 files changed

+92
-48
lines changed

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatabaseConnectionInfoImpl.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,27 @@ public Integer getPoolMaxSize() {
112112

113113
@Override
114114
public String toInfoString() {
115-
return "\tDatabase JDBC URL [" + handleEmpty( jdbcUrl ) + ']' +
116-
"\n\tDatabase driver: " + handleEmpty( jdbcDriver ) +
117-
"\n\tDatabase version: " + handleEmpty( dialectVersion ) +
118-
"\n\tAutocommit mode: " + handleEmpty( autoCommitMode ) +
119-
"\n\tIsolation level: " + handleEmpty( isolationLevel ) +
120-
"\n\tPool: " + handleEmpty( connectionProviderClass ) +
121-
"\n\tMinimum pool size: " + handleEmpty( poolMinSize ) +
122-
"\n\tMaximum pool size: " + handleEmpty( poolMaxSize );
123-
}
124-
125-
private static String handleEmpty(String value) {
115+
return """
116+
\tDatabase JDBC URL [%s]
117+
\tDatabase driver: %s
118+
\tDialect version: %s
119+
\tAutocommit mode: %s
120+
\tIsolation level: %s
121+
\tPool: %s
122+
\t\tMinimum size: %s
123+
\t\tMaximum size: %s"""
124+
.formatted(
125+
handleEmpty( jdbcUrl ),
126+
handleEmpty( jdbcDriver ),
127+
handleEmpty( dialectVersion ),
128+
handleEmpty( autoCommitMode ),
129+
handleEmpty( isolationLevel ),
130+
handleEmpty( connectionProviderClass ),
131+
handleEmpty( poolMinSize ),
132+
handleEmpty( poolMaxSize ) );
133+
}
134+
135+
static String handleEmpty(String value) {
126136
return isNotEmpty( value ) ? value : DEFAULT;
127137
}
128138

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -157,36 +157,42 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) {
157157

158158
@Override
159159
public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect, ExtractedDatabaseMetaData metaData) {
160-
final String url;
161-
final String driver;
162-
final String isolationLevel;
163-
if ( metaData != null ) {
164-
url = metaData.getUrl();
165-
driver = metaData.getDriver();
166-
isolationLevel = toIsolationNiceName( metaData.getTransactionIsolation() )
167-
+ " [default " + toIsolationNiceName( metaData.getDefaultTransactionIsolation() ) + "]";
168-
}
169-
else {
170-
url = null;
171-
driver = null;
172-
isolationLevel = null;
173-
}
174-
175160
return new DatabaseConnectionInfoImpl(
176161
DatasourceConnectionProviderImpl.class,
177-
url,
178-
driver,
162+
metaData == null ? null : metaData.getUrl(),
163+
metaData == null ? null : metaData.getDriver(),
179164
dialect.getVersion(),
180165
null,
181-
isolationLevel,
166+
metaData == null
167+
? null
168+
: toIsolationNiceName( metaData.getTransactionIsolation() )
169+
+ " [default " + toIsolationNiceName( metaData.getDefaultTransactionIsolation() ) + "]",
182170
null,
183171
null
184172
) {
185173
@Override
186174
public String toInfoString() {
187-
return dataSourceJndiName != null
188-
? "\tDataSource JNDI name [" + dataSourceJndiName + "]\n" + super.toInfoString()
189-
: super.toInfoString();
175+
var infoString = new StringBuilder();
176+
if ( dataSourceJndiName != null ) {
177+
infoString
178+
.append( "\tDataSource JNDI name [" )
179+
.append( dataSourceJndiName )
180+
.append( "]\n" );
181+
}
182+
if ( metaData != null ) {
183+
infoString
184+
.append( "\tDatabase: ")
185+
.append( handleEmpty( metaData.getDatabaseProductName() ) )
186+
.append( " " )
187+
.append( handleEmpty( metaData.getDatabaseProductVersion() ) )
188+
.append( "\n\t\tCatalog: ")
189+
.append( handleEmpty( metaData.getConnectionCatalogName() ) )
190+
.append( "\n\t\tSchema: ")
191+
.append( handleEmpty( metaData.getConnectionSchemaName() ) )
192+
.append( "\n" );
193+
}
194+
infoString.append( super.toInfoString() );
195+
return infoString.toString();
190196
}
191197
};
192198
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/ExtractedDatabaseMetaDataImpl.java

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public class ExtractedDatabaseMetaDataImpl implements ExtractedDatabaseMetaData
3333
private final JdbcEnvironment jdbcEnvironment;
3434
private final JdbcConnectionAccess connectionAccess;
3535

36+
private final String databaseProductName;
37+
private final String databaseProductVersion;
38+
3639
private final String connectionCatalogName;
3740
private final String connectionSchemaName;
3841

@@ -61,6 +64,8 @@ private ExtractedDatabaseMetaDataImpl(
6164
JdbcConnectionAccess connectionAccess,
6265
String connectionCatalogName,
6366
String connectionSchemaName,
67+
String databaseProductName,
68+
String databaseProductVersion,
6469
boolean supportsRefCursors,
6570
boolean supportsNamedParameters,
6671
boolean supportsScrollableResults,
@@ -78,6 +83,8 @@ private ExtractedDatabaseMetaDataImpl(
7883
this.connectionAccess = connectionAccess;
7984
this.connectionCatalogName = connectionCatalogName;
8085
this.connectionSchemaName = connectionSchemaName;
86+
this.databaseProductName = databaseProductName;
87+
this.databaseProductVersion = databaseProductVersion;
8188
this.supportsRefCursors = supportsRefCursors;
8289
this.supportsNamedParameters = supportsNamedParameters;
8390
this.supportsScrollableResults = supportsScrollableResults;
@@ -138,6 +145,16 @@ public SQLStateType getSqlStateType() {
138145
return sqlStateType;
139146
}
140147

148+
@Override
149+
public String getDatabaseProductName() {
150+
return databaseProductName;
151+
}
152+
153+
@Override
154+
public String getDatabaseProductVersion() {
155+
return databaseProductVersion;
156+
}
157+
141158
@Override
142159
public String getConnectionCatalogName() {
143160
return connectionCatalogName;
@@ -195,22 +212,24 @@ public static class Builder {
195212
private final boolean jdbcMetadataIsAccessible;
196213
private final JdbcConnectionAccess connectionAccess;
197214

198-
private String connectionSchemaName;
199-
private String connectionCatalogName;
200-
201-
private boolean supportsRefCursors;
202-
private boolean supportsNamedParameters;
203-
private boolean supportsScrollableResults;
204-
private boolean supportsGetGeneratedKeys;
205-
// In absence of DatabaseMetaData batching updates is assumed to be supported
206-
private boolean supportsBatchUpdates = true;
207-
private boolean supportsDataDefinitionInTransaction;
208-
private boolean doesDataDefinitionCauseTransactionCommit;
209-
private SQLStateType sqlStateType;
210-
private String url;
211-
private String driver;
212-
private int defaultTransactionIsolation;
213-
private int transactionIsolation;
215+
private String connectionSchemaName;
216+
private String connectionCatalogName;
217+
private String databaseProductName;
218+
private String databaseProductVersion;
219+
220+
private boolean supportsRefCursors;
221+
private boolean supportsNamedParameters;
222+
private boolean supportsScrollableResults;
223+
private boolean supportsGetGeneratedKeys;
224+
// In absence of DatabaseMetaData batching updates is assumed to be supported
225+
private boolean supportsBatchUpdates = true;
226+
private boolean supportsDataDefinitionInTransaction;
227+
private boolean doesDataDefinitionCauseTransactionCommit;
228+
private SQLStateType sqlStateType;
229+
private String url;
230+
private String driver;
231+
private int defaultTransactionIsolation;
232+
private int transactionIsolation;
214233

215234
public Builder(JdbcEnvironment jdbcEnvironment, boolean jdbcMetadataIsAccessible, JdbcConnectionAccess connectionAccess) {
216235
this.jdbcEnvironment = jdbcEnvironment;
@@ -221,6 +240,8 @@ public Builder(JdbcEnvironment jdbcEnvironment, boolean jdbcMetadataIsAccessible
221240
public Builder apply(DatabaseMetaData databaseMetaData) throws SQLException {
222241
connectionCatalogName = databaseMetaData.getConnection().getCatalog();
223242
// NOTE : databaseMetaData.getConnection().getSchema() would require java 1.7 as baseline
243+
databaseProductName = databaseMetaData.getDatabaseProductName();
244+
databaseProductVersion = databaseMetaData.getDatabaseProductVersion();
224245
supportsRefCursors = StandardRefCursorSupport.supportsRefCursors( databaseMetaData );
225246
supportsNamedParameters = databaseMetaData.supportsNamedParameters();
226247
supportsScrollableResults = databaseMetaData.supportsResultSetType( ResultSet.TYPE_SCROLL_INSENSITIVE );
@@ -292,6 +313,8 @@ public ExtractedDatabaseMetaDataImpl build() {
292313
connectionAccess,
293314
connectionCatalogName,
294315
connectionSchemaName,
316+
databaseProductName,
317+
databaseProductVersion,
295318
supportsRefCursors,
296319
supportsNamedParameters,
297320
supportsScrollableResults,

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/ExtractedDatabaseMetaData.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ public interface ExtractedDatabaseMetaData {
2525
*/
2626
JdbcEnvironment getJdbcEnvironment();
2727

28+
String getDatabaseProductName();
29+
30+
String getDatabaseProductVersion();
31+
2832
/**
2933
* Retrieve the name of the catalog in effect when we connected to the database.
3034
*

hibernate-core/src/test/java/org/hibernate/orm/test/datasource/TestDataSourceConnectionProvider.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.Map;
1818
import java.util.logging.Logger;
1919

20+
@SuppressWarnings( "unused" ) // used by DatasourceTest in this package
2021
public class TestDataSourceConnectionProvider
2122
extends DatasourceConnectionProviderImpl
2223
implements ServiceRegistryAwareService {

0 commit comments

Comments
 (0)