Skip to content

Commit

Permalink
Merge branch 'backport-3355' into release-1.7.x
Browse files Browse the repository at this point in the history
  • Loading branch information
Coduz committed Jun 24, 2024
2 parents 83759ef + e50970e commit 3f713a1
Show file tree
Hide file tree
Showing 9 changed files with 194 additions and 76 deletions.
1 change: 1 addition & 0 deletions assembly/broker/descriptors/kapua-broker.xml
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@
<include>com.google.inject:guice</include>
<include>com.google.protobuf:protobuf-java</include>
<include>com.h2database:h2</include>
<include>com.zaxxer:HikariCP</include>
<include>com.tdunning:t-digest</include>

<include>commons-codec:commons-codec</include>
Expand Down
6 changes: 6 additions & 0 deletions assembly/broker/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,12 @@
<artifactId>core</artifactId>
</dependency>

<!-- HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>

</dependencies>

<build>
Expand Down
4 changes: 4 additions & 0 deletions commons/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
package org.eclipse.kapua.commons.jpa;

import org.eclipse.kapua.KapuaException;
import org.eclipse.kapua.commons.setting.system.SystemSetting;
import org.eclipse.kapua.commons.setting.system.SystemSettingKey;

import org.eclipse.kapua.commons.util.log.ConfigurationPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -34,7 +34,7 @@ public abstract class AbstractEntityManagerFactory implements org.eclipse.kapua.
private static final Logger LOG = LoggerFactory.getLogger(AbstractEntityManagerFactory.class);

private static final Map<String, String> UNIQUE_CONTRAINTS = new HashMap<>();
private EntityManagerFactory entityManagerFactory;
private final EntityManagerFactory entityManagerFactory;

/**
* Protected constructor
Expand All @@ -44,32 +44,20 @@ public abstract class AbstractEntityManagerFactory implements org.eclipse.kapua.
* @param uniqueConstraints
*/
protected AbstractEntityManagerFactory(String persistenceUnitName, String datasourceName, Map<String, String> uniqueConstraints) {
SystemSetting config = SystemSetting.getInstance();

//
// Initialize the EntityManagerFactory
try {
// JPA configuration overrides
// Other initialization code moved to org.eclipse.kapua.commons.jpa.JpaSessionCustomizer
Map<String, Object> configOverrides = new HashMap<>();
configOverrides.put("javax.persistence.jdbc.driver", config.getString(SystemSettingKey.DB_JDBC_DRIVER));

configOverrides.put("eclipselink.cache.shared.default", "false"); // This has to be set to false in order to disable the local object cache of EclipseLink.

configOverrides.put("eclipselink.connection-pool.default.url", JdbcConnectionUrlResolvers.resolveJdbcUrl());
configOverrides.put("eclipselink.connection-pool.default.user", config.getString(SystemSettingKey.DB_USERNAME));
configOverrides.put("eclipselink.connection-pool.default.password", config.getString(SystemSettingKey.DB_PASSWORD));

configOverrides.put("eclipselink.connection-pool.default.dataSourceName", datasourceName);
configOverrides.put("eclipselink.connection-pool.default.initial", config.getString(SystemSettingKey.DB_POOL_SIZE_INITIAL));
configOverrides.put("eclipselink.connection-pool.default.min", config.getString(SystemSettingKey.DB_POOL_SIZE_MIN));
configOverrides.put("eclipselink.connection-pool.default.max", config.getString(SystemSettingKey.DB_POOL_SIZE_MAX));
configOverrides.put("eclipselink.connection-pool.default.wait", config.getString(SystemSettingKey.DB_POOL_BORROW_TIMEOUT));

configOverrides.put("eclipselink.logging.level", "FINE");
configOverrides.put("eclipselink.logging.parameters", "true");
configOverrides.put("javax.persistence.nonJtaDataSource", DataSource.getDataSource());

// Standalone JPA
entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, configOverrides);

printEntityManagerConfiguration(persistenceUnitName, datasourceName, configOverrides);
} catch (Throwable ex) {
LOG.error("Error creating EntityManagerFactory", ex);
throw new ExceptionInInitializerError(ex);
Expand All @@ -83,7 +71,6 @@ protected AbstractEntityManagerFactory(String persistenceUnitName, String dataso
}
}

// Entity manager factory methods
/**
* Returns an EntityManager instance.
*
Expand All @@ -96,4 +83,23 @@ public EntityManager createEntityManager()
return new EntityManager(entityManagerFactory.createEntityManager());
}

//
// Private Methods
//

private void printEntityManagerConfiguration(String persistenceUnitName, String datasourceName, Map<String, Object> configOverrides) {
ConfigurationPrinter configurationPrinter =
ConfigurationPrinter.create()
.withLogger(LOG)
.withLogLevel(ConfigurationPrinter.LogLevel.INFO)
.withTitle("Persistence Unit Config: " + persistenceUnitName)
.addParameter("Datasource Name", datasourceName)
.openSection("Configuration Overrides");

for (Map.Entry<String, Object> config : configOverrides.entrySet()) {
configurationPrinter.addParameter(config.getKey(), config.getValue());
}

configurationPrinter.printLog();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*******************************************************************************
* Copyright (c) 2022 Eurotech and/or its affiliates and others
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Eurotech - initial API and implementation
*******************************************************************************/
package org.eclipse.kapua.commons.jpa;

import com.zaxxer.hikari.HikariDataSource;
import org.eclipse.kapua.commons.setting.system.SystemSetting;
import org.eclipse.kapua.commons.setting.system.SystemSettingKey;

public final class DataSource {

private static HikariDataSource hikariDataSource;

private DataSource() {
}

public static HikariDataSource getDataSource() {
if (hikariDataSource == null) {
SystemSetting config = SystemSetting.getInstance();

hikariDataSource = new HikariDataSource();
hikariDataSource.setDriverClassName(config.getString(SystemSettingKey.DB_JDBC_DRIVER));
hikariDataSource.setJdbcUrl(JdbcConnectionUrlResolvers.resolveJdbcUrl());
hikariDataSource.setUsername(config.getString(SystemSettingKey.DB_USERNAME));
hikariDataSource.setPassword(config.getString(SystemSettingKey.DB_PASSWORD));

hikariDataSource.setMaximumPoolSize(config.getInt(SystemSettingKey.DB_POOL_SIZE_MAX, 20));
hikariDataSource.setMinimumIdle(config.getInt(SystemSettingKey.DB_POOL_SIZE_MIN, 1));
hikariDataSource.setIdleTimeout(config.getInt(SystemSettingKey.DB_POOL_IDLE_TIMEOUT, 180000));
hikariDataSource.setKeepaliveTime(config.getInt(SystemSettingKey.DB_POOL_KEEPALIVE_TIME, 30000));
hikariDataSource.setMaxLifetime(config.getInt(SystemSettingKey.DB_POOL_MAX_LIFETIME, 1800000));
hikariDataSource.setConnectionTestQuery(config.getString(SystemSettingKey.DB_POOL_TEST_QUERY, "SELECT 1"));

hikariDataSource.setLeakDetectionThreshold(config.getInt(SystemSettingKey.DB_POOL_LEAKDETECTION_THRESHOLD, 0));
}

return hikariDataSource;
}

@Override
public String toString() {
return hikariDataSource.getDriverClassName() + "@" + hikariDataSource.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -146,11 +146,19 @@ public enum SystemSettingKey implements SettingKey {
* Database character encoding
*/
DB_CHAR_ENCODING("commons.db.characterEncoding"),

/**
* Database pool initial pool size
* Character used in DB query to escape other special characters
*/
DB_CHARACTER_ESCAPE("commons.db.character.escape"),
/**
* Character used in DB query to use as wildcard
*/
DB_CHARACTER_WILDCARD_ANY("commons.db.character.wildcard.any"),
/**
* Character used in DB query to use as single character wildcard
*/
DB_POOL_SIZE_INITIAL("commons.db.pool.size.initial"),
DB_CHARACTER_WILDCARD_SINGLE("commons.db.character.wildcard.single"),

/**
* Database pool minimum pool size
*/
Expand All @@ -160,21 +168,25 @@ public enum SystemSettingKey implements SettingKey {
*/
DB_POOL_SIZE_MAX("commons.db.pool.size.max"),
/**
* Database pool connection borrow timeout
* Database pool maximum time before evicting an idle connection
*/
DB_POOL_BORROW_TIMEOUT("commons.db.pool.borrow.timeout"),
DB_POOL_IDLE_TIMEOUT("commons.db.pool.idle.timeout"),
/**
* Character used in DB query to escape other special characters
* Database pool keepalive query interval for idle connections
*/
DB_CHARACTER_ESCAPE("commons.db.character.escape"),
DB_POOL_KEEPALIVE_TIME("commons.db.pool.keepalive.timeout"),
/**
* Character used in DB query to use as wildcard
* Database pool maximum lifetime of a connection
*/
DB_CHARACTER_WILDCARD_ANY("commons.db.character.wildcard.any"),
DB_POOL_MAX_LIFETIME("commons.db.pool.max.lifetime"),
/**
* Character used in DB query to use as single character wildcard
* Test query used for connection liveness tests and keepalive
*/
DB_CHARACTER_WILDCARD_SINGLE("commons.db.character.wildcard.single"),
DB_POOL_TEST_QUERY("commons.db.pool.test.query"),
/**
* Amount of time that a connection can be out of the pool before a message is logged
*/
DB_POOL_LEAKDETECTION_THRESHOLD("commons.db.pool.leakdetection.threshold"),

/**
* Broker schema (e.g. mqtt, mqtts, ..)
Expand Down
Loading

0 comments on commit 3f713a1

Please sign in to comment.