Skip to content

Commit f556ba9

Browse files
jrenaatsebersole
authored andcommitted
HHH-18224 - standardize logging of database connection
HHH-18224 - add database logging info support also to MultiTenantConnectionProvider. Log output through subsystem logging. HHH-18224 - remove duplicated database info logging HHH-18224 - complete refactor of DatabaseConnectionInfo and add more info HHH-18224 - add standard database info logging to the proxool connection provider HHH-18224 - add min/max pool sizes to standard db logging Signed-off-by: Jan Schatteman <[email protected]>
1 parent e33bcfc commit f556ba9

File tree

19 files changed

+418
-64
lines changed

19 files changed

+418
-64
lines changed

hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import io.agroal.api.AgroalDataSource;
1111
import io.agroal.api.configuration.AgroalConnectionFactoryConfiguration;
12+
import io.agroal.api.configuration.AgroalConnectionPoolConfiguration;
1213
import io.agroal.api.configuration.supplier.AgroalConnectionFactoryConfigurationSupplier;
1314
import io.agroal.api.configuration.supplier.AgroalPropertiesReader;
1415
import io.agroal.api.security.NamePrincipal;
@@ -17,11 +18,12 @@
1718
import org.hibernate.cfg.AgroalSettings;
1819
import org.hibernate.cfg.AvailableSettings;
1920
import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator;
21+
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
2022
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
23+
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
2124
import org.hibernate.service.UnknownUnwrapTypeException;
2225
import org.hibernate.service.spi.Configurable;
2326
import org.hibernate.service.spi.Stoppable;
24-
import org.jboss.logging.Logger;
2527

2628
import javax.sql.DataSource;
2729
import java.sql.Connection;
@@ -30,6 +32,10 @@
3032
import java.util.function.Consumer;
3133
import java.util.function.Function;
3234

35+
import org.jboss.logging.Logger;
36+
37+
import static org.hibernate.cfg.AgroalSettings.AGROAL_CONFIG_PREFIX;
38+
3339
/**
3440
* ConnectionProvider based on Agroal connection pool
3541
* To use this ConnectionProvider set: <pre> hibernate.connection.provider_class AgroalConnectionProvider </pre>
@@ -54,18 +60,26 @@
5460
*/
5561
public class AgroalConnectionProvider implements ConnectionProvider, Configurable, Stoppable {
5662

57-
public static final String CONFIG_PREFIX = AgroalSettings.AGROAL_CONFIG_PREFIX + ".";
63+
public static final String CONFIG_PREFIX = AGROAL_CONFIG_PREFIX + ".";
5864
private static final long serialVersionUID = 1L;
5965
private static final Logger LOGGER = Logger.getLogger( AgroalConnectionProvider.class );
6066
private AgroalDataSource agroalDataSource = null;
67+
private DatabaseConnectionInfo dbInfo;
6168

6269
// --- Configurable
6370

64-
private static void resolveIsolationSetting(Map<String, Object> properties, AgroalConnectionFactoryConfigurationSupplier cf) {
71+
private static String extractIsolationAsString(Map<String, Object> properties) {
6572
Integer isolation = ConnectionProviderInitiator.extractIsolation( properties );
6673
if ( isolation != null ) {
6774
// Agroal resolves transaction isolation from the 'nice' name
68-
String isolationString = ConnectionProviderInitiator.toIsolationNiceName( isolation );
75+
return ConnectionProviderInitiator.toIsolationNiceName( isolation );
76+
}
77+
return null;
78+
}
79+
80+
private static void resolveIsolationSetting(Map<String, Object> properties, AgroalConnectionFactoryConfigurationSupplier cf) {
81+
String isolationString = extractIsolationAsString( properties );
82+
if ( isolationString != null ) {
6983
cf.jdbcTransactionIsolation( AgroalConnectionFactoryConfiguration.TransactionIsolation.valueOf( isolationString ) );
7084
}
7185
}
@@ -94,6 +108,18 @@ public void configure(Map<String, Object> props) throws HibernateException {
94108
} ) );
95109

96110
agroalDataSource = AgroalDataSource.from( agroalProperties );
111+
112+
// For logging purposes
113+
AgroalConnectionPoolConfiguration acpc = agroalDataSource.getConfiguration().connectionPoolConfiguration();
114+
AgroalConnectionFactoryConfiguration acfc = acpc.connectionFactoryConfiguration();
115+
dbInfo = new DatabaseConnectionInfoImpl()
116+
.setDBUrl( acfc.jdbcUrl() )
117+
.setDBDriverName( acfc.connectionProviderClass().toString() )
118+
.setDBAutoCommitMode( Boolean.toString(acfc.autoCommit()) )
119+
.setDBIsolationLevel( acfc.jdbcTransactionIsolation() != null ?
120+
ConnectionProviderInitiator.toIsolationNiceName( acfc.jdbcTransactionIsolation().level() ) : null )
121+
.setDBMinPoolSize( String.valueOf(acpc.minSize()) )
122+
.setDBMaxPoolSize( String.valueOf(acpc.maxSize()) );
97123
}
98124
catch ( Exception e ) {
99125
throw new HibernateException( e );
@@ -121,6 +147,11 @@ public boolean supportsAggressiveRelease() {
121147
return false;
122148
}
123149

150+
@Override
151+
public DatabaseConnectionInfo getDatabaseConnectionInfo() {
152+
return dbInfo;
153+
}
154+
124155
@Override
125156
public boolean isUnwrappableAs(Class<?> unwrapType) {
126157
return ConnectionProvider.class.equals( unwrapType )

hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import org.hibernate.cfg.C3p0Settings;
2222
import org.hibernate.cfg.JdbcSettings;
2323
import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator;
24+
import org.hibernate.engine.jdbc.connections.internal.DatabaseConnectionInfoImpl;
2425
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
26+
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
2527
import org.hibernate.internal.util.PropertiesHelper;
2628
import org.hibernate.internal.util.config.ConfigurationHelper;
2729
import org.hibernate.service.UnknownUnwrapTypeException;
@@ -61,7 +63,7 @@ public class C3P0ConnectionProvider
6163
// hibernate sensibly lets default to minPoolSize, but we'll let users
6264
// override it with the c3p0-style property if they want.
6365
private static final String C3P0_STYLE_INITIAL_POOL_SIZE = "c3p0.initialPoolSize";
64-
66+
private DatabaseConnectionInfo dbInfo;
6567
private DataSource ds;
6668
private Integer isolation;
6769
private boolean autocommit;
@@ -121,13 +123,12 @@ public void configure(Map<String, Object> props) {
121123
JdbcSettings.URL,
122124
JdbcSettings.JPA_JDBC_URL
123125
);
126+
124127
final Properties connectionProps = ConnectionProviderInitiator.getConnectionProperties( props );
125128

126-
C3P0_MSG_LOGGER.c3p0UsingDriver( jdbcDriverClass, jdbcUrl );
127129
C3P0_MSG_LOGGER.connectionProperties( ConfigurationHelper.maskOut( connectionProps, "password" ) );
128130

129131
autocommit = getBoolean( JdbcSettings.AUTOCOMMIT, props );
130-
C3P0_MSG_LOGGER.autoCommitMode( autocommit );
131132

132133
if ( jdbcDriverClass == null ) {
133134
C3P0_MSG_LOGGER.jdbcDriverNotSpecified();
@@ -141,11 +142,13 @@ public void configure(Map<String, Object> props) {
141142
}
142143
}
143144

145+
Integer minPoolSize = null;
146+
Integer maxPoolSize = null;
144147
try {
145148

146149
//swaldman 2004-02-07: modify to allow null values to signify fall through to c3p0 PoolConfig defaults
147-
final Integer minPoolSize = getInteger( C3p0Settings.C3P0_MIN_SIZE, props );
148-
final Integer maxPoolSize = getInteger( C3p0Settings.C3P0_MAX_SIZE, props );
150+
minPoolSize = getInteger( C3p0Settings.C3P0_MIN_SIZE, props );
151+
maxPoolSize = getInteger( C3p0Settings.C3P0_MAX_SIZE, props );
149152
final Integer maxIdleTime = getInteger( C3p0Settings.C3P0_TIMEOUT, props );
150153
final Integer maxStatements = getInteger( C3p0Settings.C3P0_MAX_STATEMENTS, props );
151154
final Integer acquireIncrement = getInteger( C3p0Settings.C3P0_ACQUIRE_INCREMENT, props );
@@ -187,26 +190,38 @@ public void configure(Map<String, Object> props) {
187190

188191
final DataSource unpooled = DataSources.unpooledDataSource( jdbcUrl, connectionProps );
189192

190-
final Map<String,Object> allProps = new HashMap<>();
193+
final Map<String, Object> allProps = new HashMap<>();
191194
allProps.putAll( props );
192195
allProps.putAll( PropertiesHelper.map(c3props) );
193196

194197
ds = DataSources.pooledDataSource( unpooled, allProps );
195198
}
196199
catch (Exception e) {
197-
C3P0_LOGGER.error( C3P0_MSG_LOGGER.unableToInstantiateC3p0ConnectionPool(), e );
200+
C3P0_LOGGER.error( C3P0_MSG_LOGGER.unableToInstantiateC3p0ConnectionPool(), e );;
198201
throw new HibernateException( C3P0_MSG_LOGGER.unableToInstantiateC3p0ConnectionPool(), e );
199202
}
200203

201204
isolation = ConnectionProviderInitiator.extractIsolation( props );
202-
C3P0_MSG_LOGGER.jdbcIsolationLevel( ConnectionProviderInitiator.toIsolationNiceName( isolation ) );
205+
206+
dbInfo = new DatabaseConnectionInfoImpl()
207+
.setDBUrl( jdbcUrl )
208+
.setDBDriverName( jdbcDriverClass )
209+
.setDBAutoCommitMode( Boolean.toString( autocommit ) )
210+
.setDBIsolationLevel( isolation != null ? ConnectionProviderInitiator.toIsolationNiceName( isolation ) : null )
211+
.setDBMinPoolSize( String.valueOf(minPoolSize) )
212+
.setDBMaxPoolSize( String.valueOf(maxPoolSize) );
203213
}
204214

205215
@Override
206216
public boolean supportsAggressiveRelease() {
207217
return false;
208218
}
209219

220+
@Override
221+
public DatabaseConnectionInfo getDatabaseConnectionInfo() {
222+
return dbInfo;
223+
}
224+
210225
private void setOverwriteProperty(
211226
String hibernateStyleKey,
212227
String c3p0StyleKey,
@@ -237,6 +252,7 @@ public void stop() {
237252
}
238253
catch (SQLException sqle) {
239254
C3P0_MSG_LOGGER.unableToDestroyC3p0ConnectionPool( sqle );
255+
throw new HibernateException( "Unable to destroy the connection pool", sqle );
240256
}
241257
}
242258

hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0MessageLogger.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,6 @@ public interface C3P0MessageLogger extends ConnectionPoolingLogger {
5050
+ "properties. Hibernate-style property '%1$s' will be used and c3p0-style property '%2$s' will be ignored!", id = 10001)
5151
void bothHibernateAndC3p0StylesSet(String hibernateStyle,String c3p0Style);
5252

53-
/**
54-
* Log a message (INFO) about which Driver class is being used.
55-
*
56-
* @param jdbcDriverClass The JDBC Driver class
57-
* @param jdbcUrl The JDBC URL
58-
*/
59-
@LogMessage(level = INFO)
60-
@Message(value = "C3P0 using driver: %s at URL: %s", id = 10002)
61-
void c3p0UsingDriver(String jdbcDriverClass, String jdbcUrl);
62-
6353
/**
6454
* Build a message about not being able to find the JDBC driver class
6555
*
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.engine.jdbc.connections.internal;
8+
9+
import org.hibernate.dialect.DatabaseVersion;
10+
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
11+
import org.hibernate.internal.util.StringHelper;
12+
13+
import static org.hibernate.dialect.SimpleDatabaseVersion.ZERO_VERSION;
14+
import static org.hibernate.dialect.SimpleDatabaseVersion.NO_VERSION;
15+
16+
/**
17+
* @author Jan Schatteman
18+
*/
19+
public class DatabaseConnectionInfoImpl implements DatabaseConnectionInfo {
20+
21+
public static final String DEFAULT = "undefined/unknown";
22+
23+
protected String dbUrl = DEFAULT;
24+
protected String dbDriverName = DEFAULT;
25+
protected DatabaseVersion dbVersion = ZERO_VERSION;
26+
protected String dbAutoCommitMode = DEFAULT;
27+
protected String dbIsolationLevel = DEFAULT;
28+
protected String dbMinPoolSize = DEFAULT;
29+
protected String dbMaxPoolSize = DEFAULT;
30+
31+
public DatabaseConnectionInfoImpl() {
32+
}
33+
34+
@Override
35+
public DatabaseConnectionInfo setDBUrl(String dbUrl) {
36+
this.dbUrl = dbUrl;
37+
return this;
38+
}
39+
40+
@Override
41+
public DatabaseConnectionInfo setDBDriverName(String dbDriverName) {
42+
if ( checkValidString(dbDriverName) && isDefaultStringValue(this.dbDriverName) ) {
43+
this.dbDriverName = dbDriverName;
44+
}
45+
return this;
46+
}
47+
48+
@Override
49+
public DatabaseConnectionInfo setDBVersion(DatabaseVersion dbVersion) {
50+
if ( checkValidVersion(dbVersion) && ZERO_VERSION.equals(this.dbVersion) ) {
51+
this.dbVersion = dbVersion;
52+
}
53+
return this;
54+
}
55+
56+
@Override
57+
public DatabaseConnectionInfo setDBAutoCommitMode(String dbAutoCommitMode) {
58+
if ( checkValidString(dbAutoCommitMode) && isDefaultStringValue(this.dbAutoCommitMode) ) {
59+
this.dbAutoCommitMode = dbAutoCommitMode;
60+
}
61+
return this;
62+
}
63+
64+
@Override
65+
public DatabaseConnectionInfo setDBIsolationLevel(String dbIsolationLevel) {
66+
if ( checkValidString(dbIsolationLevel) && isDefaultStringValue(this.dbIsolationLevel) ) {
67+
this.dbIsolationLevel = dbIsolationLevel;
68+
}
69+
return this;
70+
}
71+
72+
@Override
73+
public DatabaseConnectionInfo setDBMinPoolSize(String minPoolSize) {
74+
if ( checkValidInteger(minPoolSize) ) {
75+
this.dbMinPoolSize = minPoolSize;
76+
}
77+
return this;
78+
}
79+
80+
@Override
81+
public DatabaseConnectionInfo setDBMaxPoolSize(String maxPoolSize) {
82+
if ( checkValidInteger(maxPoolSize) ) {
83+
this.dbMaxPoolSize = maxPoolSize;
84+
}
85+
return this;
86+
}
87+
88+
private boolean checkValidInteger(String integerString) {
89+
return checkValidString( integerString ) && Integer.parseInt( integerString, 10 ) >= 0;
90+
}
91+
92+
private boolean checkValidString(String value) {
93+
return !( StringHelper.isBlank( value ) || "null".equalsIgnoreCase( value ) );
94+
}
95+
96+
private boolean checkValidVersion(DatabaseVersion version) {
97+
return version != null && !( version.isSame(ZERO_VERSION) || version.isSame(NO_VERSION) );
98+
}
99+
100+
private boolean isDefaultStringValue(String value) {
101+
return DEFAULT.equalsIgnoreCase( value );
102+
}
103+
104+
public String toString() {
105+
StringBuilder sb = new StringBuilder();
106+
sb.append( "\tDatabase JDBC URL [" ).append( dbUrl ).append(']');
107+
sb.append(sb.length() > 0 ? "\n\t" : "" ).append( "Database driver: " ).append( dbDriverName );
108+
sb.append(sb.length() > 0 ? "\n\t" : "" ).append( "Database version: " ).append( dbVersion );
109+
sb.append(sb.length() > 0 ? "\n\t" : "" ).append( "Autocommit mode: " ).append( dbAutoCommitMode );
110+
sb.append(sb.length() > 0 ? "\n\t" : "" ).append( "Isolation level: " ).append( dbIsolationLevel );
111+
sb.append(sb.length() > 0 ? "\n\t" : "" ).append( "Minimum pool size: " ).append( dbMinPoolSize );
112+
sb.append(sb.length() > 0 ? "\n\t" : "" ).append( "Maximum pool size: " ).append( dbMaxPoolSize );
113+
return sb.toString();
114+
}
115+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.HibernateException;
1515
import org.hibernate.cfg.Environment;
1616
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
17+
import org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo;
1718
import org.hibernate.engine.jndi.spi.JndiService;
1819
import org.hibernate.service.UnknownUnwrapTypeException;
1920
import org.hibernate.service.spi.Configurable;
@@ -38,6 +39,7 @@ public class DatasourceConnectionProviderImpl implements ConnectionProvider, Con
3839
private String pass;
3940
private boolean useCredentials;
4041
private JndiService jndiService;
42+
private String dataSourceJndiName;
4143

4244
private boolean available;
4345

@@ -92,6 +94,7 @@ public void configure(Map<String, Object> configValues) {
9294
+ "] configuration property"
9395
);
9496
}
97+
this.dataSourceJndiName = dataSourceJndiName;
9598
if ( jndiService == null ) {
9699
throw new HibernateException( "Unable to locate JndiService to lookup Datasource" );
97100
}
@@ -131,4 +134,9 @@ public void closeConnection(Connection connection) throws SQLException {
131134
public boolean supportsAggressiveRelease() {
132135
return true;
133136
}
137+
138+
@Override
139+
public DatabaseConnectionInfo getDatabaseConnectionInfo() {
140+
return new DatabaseConnectionInfoImpl().setDBUrl( "Connecting through datasource" + dataSourceJndiName );
141+
}
134142
}

0 commit comments

Comments
 (0)