diff --git a/CHANGES_NEXT_RELEASE b/CHANGES_NEXT_RELEASE index 9639ebea9..f11e4124a 100644 --- a/CHANGES_NEXT_RELEASE +++ b/CHANGES_NEXT_RELEASE @@ -1 +1,2 @@ +- [cygnus-common] [SQL-sinks] Define default values and allow to set connection pool config for maxPoolSize(3), maxPoolIddle(2), minPoolIdle(0) and minPoolIdleTimeMillis(10000) (#2366) - [cygnus-ngsi] Upgrade Debian version from 12.4 to 12.5 in Dockerfile diff --git a/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImpl.java b/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImpl.java index 239d1bdce..461b6e422 100644 --- a/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImpl.java +++ b/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImpl.java @@ -65,13 +65,16 @@ public class SQLBackendImpl implements SQLBackend{ * @param sqlUsername * @param sqlPassword * @param maxPoolSize + * @param maxPoolIdle + * @param minPoolIdle + * @param minPoolIdleTimeMillis * @param sqlInstance * @param sqlDriverName * @param persistErrors * @param maxLatestErrors */ - public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, SQLInstance sqlInstance, String sqlDriverName, boolean persistErrors, int maxLatestErrors) { - this(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, sqlInstance, sqlDriverName, null, persistErrors, maxLatestErrors); + public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, SQLInstance sqlInstance, String sqlDriverName, boolean persistErrors, int maxLatestErrors) { + this(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, null, persistErrors, maxLatestErrors); } // SQLBackendImpl /** @@ -82,12 +85,15 @@ public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String * @param sqlUsername * @param sqlPassword * @param maxPoolSize + * @param maxPoolIdle + * @param minPoolIdle + * @param minPoolIdleTimeMillis * @param sqlInstance * @param sqlDriverName * @param sqlOptions */ - public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, SQLInstance sqlInstance, String sqlDriverName, String sqlOptions) { - this(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, true, DEFAULT_MAX_LATEST_ERRORS); + public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, SQLInstance sqlInstance, String sqlDriverName, String sqlOptions) { + this(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, true, DEFAULT_MAX_LATEST_ERRORS); } // SQLBackendImpl /** @@ -98,14 +104,17 @@ public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String * @param sqlUsername * @param sqlPassword * @param maxPoolSize + * @param maxPoolIdle + * @param minPoolIdle + * @param minPoolIdleTimeMillis * @param sqlInstance * @param sqlDriverName * @param sqlOptions * @param persistErrors * @param maxLatestErrors */ - public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, SQLInstance sqlInstance, String sqlDriverName, String sqlOptions, boolean persistErrors, int maxLatestErrors) { - driver = new SQLBackendImpl.SQLDriver(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions); + public SQLBackendImpl(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, SQLInstance sqlInstance, String sqlDriverName, String sqlOptions, boolean persistErrors, int maxLatestErrors) { + driver = new SQLBackendImpl.SQLDriver(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions); cache = new SQLCache(); this.sqlInstance = sqlInstance; this.persistErrors = persistErrors; @@ -935,6 +944,9 @@ public class SQLDriver { private final SQLInstance sqlInstance; private final String sqlDriverName; private final int maxPoolSize; + private final int maxPoolIdle; + private final int minPoolIdle; + private final int minPoolIdleTimeMillis; private final String sqlOptions; /** @@ -945,11 +957,14 @@ public class SQLDriver { * @param sqlUsername * @param sqlPassword * @param maxPoolSize + * @param maxPoolIdle + * @param minPoolIdle + * @param minPoolIdleTimeMillis * @param sqlInstance * @param sqlDriverName * @param sqlOptions */ - public SQLDriver(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, SQLInstance sqlInstance, String sqlDriverName, String sqlOptions) { + public SQLDriver(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, SQLInstance sqlInstance, String sqlDriverName, String sqlOptions) { datasources = new HashMap<>(); pools = new HashMap<>(); this.sqlHost = sqlHost; @@ -957,6 +972,9 @@ public SQLDriver(String sqlHost, String sqlPort, String sqlUsername, String sqlP this.sqlUsername = sqlUsername; this.sqlPassword = sqlPassword; this.maxPoolSize = maxPoolSize; + this.maxPoolIdle = maxPoolIdle; + this.minPoolIdle = minPoolIdle; + this.minPoolIdleTimeMillis = minPoolIdleTimeMillis; this.sqlInstance = sqlInstance; this.sqlDriverName = sqlDriverName; this.sqlOptions = sqlOptions; @@ -1095,7 +1113,17 @@ private DataSource createConnectionPool(String destination) throws Exception { // Creates an Instance of GenericObjectPool That Holds Our Pool of Connections Object! gPool = new GenericObjectPool(); + // Tune from https://javadoc.io/static/commons-pool/commons-pool/1.6/org/apache/commons/pool/impl/GenericObjectPool.html + // Sets the cap on the number of objects that can be allocated by the pool (checked out to clients, or idle awaiting checkout) at a given time. gPool.setMaxActive(this.maxPoolSize); + // Sets the cap on the number of "idle" instances in the pool. + gPool.setMaxIdle(this.maxPoolIdle); + // Sets the minimum number of objects allowed in the pool before the evictor thread (if active) spawns new objects. + gPool.setMinIdle(this.minPoolIdle); + // Sets the minimum amount of time an object may sit idle in the pool before it is eligible for eviction by the idle object evictor (if any) + gPool.setMinEvictableIdleTimeMillis(this.minPoolIdleTimeMillis); + // Sets the number of milliseconds to sleep between runs of the idle object evictor thread + gPool.setTimeBetweenEvictionRunsMillis(this.minPoolIdleTimeMillis*3); pools.put(destination, gPool); // Creates a ConnectionFactory Object Which Will Be Used by the Pool to Create the Connection Object! diff --git a/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImplTest.java b/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImplTest.java index f3f8d06b3..50c61eb7f 100644 --- a/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImplTest.java +++ b/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/sql/SQLBackendImplTest.java @@ -53,6 +53,9 @@ public class SQLBackendImplTest { // constants private final int maxPoolSize = 2; + private final int maxPoolIdle = 1; + private final int minPoolIdle = 0; + private final int minPoolIdleTimeMillis = 10000; private final String host = "localhost"; private final String port = "3306"; private final String user = "root"; @@ -83,7 +86,7 @@ public class SQLBackendImplTest { @Before public void setUp() throws Exception { // set up the instance of the tested class - backend = new SQLBackendImpl(host, port, user, password, maxPoolSize, MYSQL_INSTANCE_NAME, MYSQL_DRIVER_NAME, null, persistErrors, maxLatestErrors); + backend = new SQLBackendImpl(host, port, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, MYSQL_INSTANCE_NAME, MYSQL_DRIVER_NAME, null, persistErrors, maxLatestErrors); // set up the behaviour of the mocked classes when(mockDriverDbCreate.getConnection(Mockito.anyString())).thenReturn(mockConnection); @@ -169,7 +172,7 @@ public void testJDBCUrlMySQL() { String sqlDriverName = "com.mysql.jdbc.Driver"; String destination = "dest"; - SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, null, persistErrors, maxLatestErrors); + SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, null, persistErrors, maxLatestErrors); SQLBackendImpl.SQLDriver driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:mysql://localhost:3306/dest"); @@ -185,7 +188,7 @@ public void testJDBCUrlPostgreSQL() { String destination = "dest"; String defaultDataBase = "default"; - SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, defaultDataBase, persistErrors, maxLatestErrors); + SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, defaultDataBase, persistErrors, maxLatestErrors); SQLBackendImpl.SQLDriver driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:postgresql://localhost:5432/default"); @@ -201,7 +204,7 @@ public void testJDBCUrlOracleSQL() { String destination = "dest"; String defaultDataBase = "default"; - SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, defaultDataBase, persistErrors, maxLatestErrors); + SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, defaultDataBase, persistErrors, maxLatestErrors); SQLBackendImpl.SQLDriver driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:oracle:oci://localhost:1521/default"); @@ -217,7 +220,7 @@ public void testJDBCUrlMySQLWithOptions() { String destination = "dest"; String sqlOptions = "useSSL=true&requireSSL=false"; - SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); + SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); SQLBackendImpl.SQLDriver driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:mysql://localhost:3306/dest?useSSL=true&requireSSL=false"); @@ -225,7 +228,7 @@ public void testJDBCUrlMySQLWithOptions() { System.out.println("Testing SQLBackendImpl.SQLDriver.generateJDBCUrl (sqlInstance:mysql, options:)"); sqlOptions = " \t"; - backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); + backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:mysql://localhost:3306/dest"); @@ -233,7 +236,7 @@ public void testJDBCUrlMySQLWithOptions() { System.out.println("Testing SQLBackendImpl.SQLDriver.generateJDBCUrl (sqlInstance:mysql, options:)"); sqlOptions = ""; - backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); + backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:mysql://localhost:3306/dest"); @@ -241,7 +244,7 @@ public void testJDBCUrlMySQLWithOptions() { System.out.println("Testing SQLBackendImpl.SQLDriver.generateJDBCUrl (sqlInstance:mysql, options:)"); sqlOptions = null; - backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); + backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:mysql://localhost:3306/dest"); @@ -258,7 +261,7 @@ public void testJDBCUrlPostgreSQLWithOptions() { String defaultDataBase = "default"; String sqlOptions = "sslmode=require"; - SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); + SQLBackendImpl backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); SQLBackendImpl.SQLDriver driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:postgresql://localhost:5432/default?sslmode=require"); @@ -266,7 +269,7 @@ public void testJDBCUrlPostgreSQLWithOptions() { System.out.println("Testing SQLBackendImpl.SQLDriver.generateJDBCUrl (sqlInstance:postgresql, options:)"); sqlOptions = ""; - backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); + backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:postgresql://localhost:5432/default"); @@ -282,7 +285,7 @@ public void testJDBCUrlPostgreSQLWithOptions() { System.out.println("Testing SQLBackendImpl.SQLDriver.generateJDBCUrl (sqlInstance:postgresql, options:)"); sqlOptions = null; - backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); + backend = new SQLBackendImpl(sqlHost, sqlPort, user, password, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, sqlInstance, sqlDriverName, sqlOptions, persistErrors, maxLatestErrors); driver = backend.getDriver(); assertEquals(driver.generateJDBCUrl(destination), "jdbc:postgresql://localhost:5432/default"); diff --git a/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java b/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java index bf76abf06..f866bb954 100644 --- a/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java +++ b/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java @@ -57,6 +57,9 @@ public class NGSIPostgisSink extends NGSILDSink { private static final String DEFAULT_DATABASE = "postgres"; private static final String DEFAULT_ENABLE_CACHE = "false"; private static final int DEFAULT_MAX_POOL_SIZE = 3; + private static final int DEFAULT_MAX_POOL_IDLE = 2; + private static final int DEFAULT_MIN_POOL_IDLE = 0; + private static final int DEFAULT_MIN_POOL_IDLE_TIME_MILLIS = 10000; private static final String DEFAULT_POSTGIS_TYPE = "geometry"; private static final String DEFAULT_ATTR_NATIVE_TYPES = "false"; private static final String POSTGIS_DRIVER_NAME = "org.postgresql.Driver"; @@ -70,6 +73,9 @@ public class NGSIPostgisSink extends NGSILDSink { private String postgisPassword; private boolean rowAttrPersistence; private int maxPoolSize; + private int maxPoolIdle; + private int minPoolIdle; + private int minPoolIdleTimeMillis; private SQLBackendImpl postgisPersistenceBackend; private boolean enableCache; private boolean swapCoordinates; @@ -206,6 +212,15 @@ public void configure(Context context) { maxPoolSize = context.getInteger("postgis_maxPoolSize", DEFAULT_MAX_POOL_SIZE); LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_maxPoolSize=" + maxPoolSize + ")"); + maxPoolIdle = context.getInteger("postgis_maxPoolIdle", DEFAULT_MAX_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_maxPoolIdle=" + maxPoolIdle + ")"); + + minPoolIdle = context.getInteger("postgis_minPoolIdle", DEFAULT_MIN_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_minPoolIdle=" + minPoolIdle + ")"); + + minPoolIdleTimeMillis = context.getInteger("postgis_minPoolIdleTimeMillis", DEFAULT_MIN_POOL_IDLE_TIME_MILLIS); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_minPoolIdleTimeMillis=" + minPoolIdleTimeMillis + ")"); + rowAttrPersistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE).equals("row"); String persistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE); @@ -269,7 +284,7 @@ public void stop() { @Override public void start() { try { - createPersistenceBackend(postgisHost, postgisPort, postgisUsername, postgisPassword, maxPoolSize, postgisOptions); + createPersistenceBackend(postgisHost, postgisPort, postgisUsername, postgisPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, postgisOptions); } catch (Exception e) { LOGGER.error("Error while creating the Postgis persistence backend. Details=" + e.getMessage()); @@ -282,9 +297,9 @@ public void start() { /** * Initialices a lazy singleton to share among instances on JVM */ - private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, String sqlOptions) { + private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, String sqlOptions) { if (postgisPersistenceBackend == null) { - postgisPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, POSTGIS_INSTANCE_NAME, POSTGIS_DRIVER_NAME, sqlOptions); + postgisPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, POSTGIS_INSTANCE_NAME, POSTGIS_DRIVER_NAME, sqlOptions); } } diff --git a/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java b/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java index e64de56fd..3efcc788e 100644 --- a/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java +++ b/cygnus-ngsi-ld/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java @@ -48,6 +48,9 @@ public class NGSIPostgreSQLSink extends NGSILDSink { private static final String DEFAULT_DATABASE = "postgres"; private static final String DEFAULT_ENABLE_CACHE = "false"; private static final int DEFAULT_MAX_POOL_SIZE = 3; + private static final int DEFAULT_MAX_POOL_IDLE = 2; + private static final int DEFAULT_MIN_POOL_IDLE = 0; + private static final int DEFAULT_MIN_POOL_IDLE_TIME_MILLIS = 10000; private static final String POSTGRESQL_DRIVER_NAME = "org.postgresql.Driver"; private static final SQLInstance POSTGRESQL_INSTANCE_NAME = SQLInstance.POSTGRESQL; @@ -58,6 +61,9 @@ public class NGSIPostgreSQLSink extends NGSILDSink { private String postgresqlUsername; private String postgresqlPassword; private int maxPoolSize; + private int maxPoolIdle; + private int minPoolIdle; + private int minPoolIdleTimeMillis; private boolean rowAttrPersistence; private SQLBackendImpl postgreSQLPersistenceBackend; private boolean enableCache; @@ -184,6 +190,15 @@ public void configure(Context context) { maxPoolSize = context.getInteger("postgresql_maxPoolSize", DEFAULT_MAX_POOL_SIZE); LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_maxPoolSize=" + maxPoolSize + ")"); + maxPoolIdle = context.getInteger("postgresql_maxPoolIdle", DEFAULT_MAX_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_maxPoolIdle=" + maxPoolIdle + ")"); + + minPoolIdle = context.getInteger("postgresql_minPoolIdle", DEFAULT_MIN_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_minPoolIdle=" + minPoolIdle + ")"); + + minPoolIdleTimeMillis = context.getInteger("postgresql_minPoolIdleTimeMillis", DEFAULT_MIN_POOL_IDLE_TIME_MILLIS); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_minPoolIdleTimeMillis=" + minPoolIdleTimeMillis + ")"); + rowAttrPersistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE).equals("row"); String persistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE); @@ -213,7 +228,7 @@ public void configure(Context context) { @Override public void start() { try { - createPersistenceBackend(postgresqlHost, postgresqlPort, postgresqlUsername, postgresqlPassword, maxPoolSize, postgresqlOptions); + createPersistenceBackend(postgresqlHost, postgresqlPort, postgresqlUsername, postgresqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, postgresqlOptions); } catch (Exception e) { LOGGER.error("Error while creating the PostgreSQL persistence backend. Details=" + e.getMessage()); @@ -226,9 +241,9 @@ public void start() { /** * Initialices a lazy singleton to share among instances on JVM */ - private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, String sqlOptions) { + private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, String sqlOptions) { if (postgreSQLPersistenceBackend == null) { - postgreSQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, POSTGRESQL_INSTANCE_NAME, POSTGRESQL_DRIVER_NAME, sqlOptions); + postgreSQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, POSTGRESQL_INSTANCE_NAME, POSTGRESQL_DRIVER_NAME, sqlOptions); } } diff --git a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIMySQLSink.java b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIMySQLSink.java index c97888802..8d87b370a 100644 --- a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIMySQLSink.java +++ b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIMySQLSink.java @@ -58,6 +58,9 @@ public class NGSIMySQLSink extends NGSISink { private static final String DEFAULT_HOST = "localhost"; private static final String DEFAULT_USER_NAME = "root"; private static final int DEFAULT_MAX_POOL_SIZE = 3; + private static final int DEFAULT_MAX_POOL_IDLE = 2; + private static final int DEFAULT_MIN_POOL_IDLE = 0; + private static final int DEFAULT_MIN_POOL_IDLE_TIME_MILLIS = 10000; private static final String DEFAULT_ATTR_NATIVE_TYPES = "false"; private static final String MYSQL_DRIVER_NAME = "com.mysql.jdbc.Driver"; private static final SQLInstance MYSQL_INSTANCE_NAME = SQLInstance.MYSQL; @@ -74,6 +77,9 @@ public class NGSIMySQLSink extends NGSISink { private String mysqlUsername; private String mysqlPassword; private int maxPoolSize; + private int maxPoolIdle; + private int minPoolIdle; + private int minPoolIdleTimeMillis; private boolean rowAttrPersistence; private SQLBackendImpl mySQLPersistenceBackend; private boolean attrNativeTypes; @@ -193,6 +199,15 @@ public void configure(Context context) { maxPoolSize = context.getInteger("mysql_maxPoolSize", DEFAULT_MAX_POOL_SIZE); LOGGER.debug("[" + this.getName() + "] Reading configuration (mysql_maxPoolSize=" + maxPoolSize + ")"); + maxPoolIdle = context.getInteger("mysql_maxPoolIdle", DEFAULT_MAX_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (mysql_maxPoolIdle=" + maxPoolIdle + ")"); + + minPoolIdle = context.getInteger("mysql_minPoolIdle", DEFAULT_MIN_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (mysql_minPoolIdle=" + minPoolIdle + ")"); + + minPoolIdleTimeMillis = context.getInteger("mysql_minPoolIdleTimeMillis", DEFAULT_MIN_POOL_IDLE_TIME_MILLIS); + LOGGER.debug("[" + this.getName() + "] Reading configuration (mysql_minPoolIdleTimeMillis=" + minPoolIdleTimeMillis + ")"); + rowAttrPersistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE).equals("row"); String persistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE); @@ -278,10 +293,10 @@ public void configure(Context context) { @Override public void start() { try { - createPersistenceBackend(mysqlHost, mysqlPort, mysqlUsername, mysqlPassword, maxPoolSize, mysqlOptions, persistErrors, maxLatestErrors); + createPersistenceBackend(mysqlHost, mysqlPort, mysqlUsername, mysqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, mysqlOptions, persistErrors, maxLatestErrors); LOGGER.debug("[" + this.getName() + "] MySQL persistence backend created"); } catch (Exception e) { - String configParams = " mysqlHost " + mysqlHost + " mysqlPort " + mysqlPort + " mysqlUsername " + mysqlUsername + " mysqlPassword " + mysqlPassword + " maxPoolSize " + maxPoolSize + " mysqlOptions " + mysqlOptions + " persistErrors " + persistErrors + " maxLatestErrors " + maxLatestErrors; + String configParams = " mysqlHost " + mysqlHost + " mysqlPort " + mysqlPort + " mysqlUsername " + mysqlUsername + " mysqlPassword " + mysqlPassword + " maxPoolSize " + maxPoolSize + " maxPoolIdle " + maxPoolIdle + " minPoolIdle " + minPoolIdle + " minPoolIdleTimeMillis " + minPoolIdleTimeMillis + " mysqlOptions " + mysqlOptions + " persistErrors " + persistErrors + " maxLatestErrors " + maxLatestErrors; LOGGER.error("Error while creating the MySQL persistence backend. " + "Config params= " + configParams + "Details=" + e.getMessage() + @@ -300,9 +315,9 @@ public void stop() { /** * Initialices a lazy singleton to share among instances on JVM */ - private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, String sqlOptions, boolean persistErrors, int maxLatestErrors) { +private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, String sqlOptions, boolean persistErrors, int maxLatestErrors) { if (mySQLPersistenceBackend == null) { - mySQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, MYSQL_INSTANCE_NAME, MYSQL_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); + mySQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, MYSQL_INSTANCE_NAME, MYSQL_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); } } diff --git a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIOracleSQLSink.java b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIOracleSQLSink.java index 8fef9c398..eeb78cbd4 100644 --- a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIOracleSQLSink.java +++ b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIOracleSQLSink.java @@ -58,6 +58,9 @@ public class NGSIOracleSQLSink extends NGSISink { private static final String DEFAULT_USER_NAME = "system"; private static final String DEFAULT_DATABASE = "xe"; private static final int DEFAULT_MAX_POOL_SIZE = 3; + private static final int DEFAULT_MAX_POOL_IDLE = 2; + private static final int DEFAULT_MIN_POOL_IDLE = 0; + private static final int DEFAULT_MIN_POOL_IDLE_TIME_MILLIS = 10000; private static final String DEFAULT_ATTR_NATIVE_TYPES = "false"; //private static final String ORACLE_DRIVER_NAME = "oracle.jdbc.OracleDriver"; private static final String ORACLE_DRIVER_NAME = "oracle.jdbc.driver.OracleDriver"; @@ -82,6 +85,9 @@ public class NGSIOracleSQLSink extends NGSISink { private String oraclePassword; private String oracleDatabase; private int maxPoolSize; + private int maxPoolIdle; + private int minPoolIdle; + private int minPoolIdleTimeMillis; private boolean rowAttrPersistence; private SQLBackendImpl oracleSQLPersistenceBackend; private boolean attrNativeTypes; @@ -216,6 +222,15 @@ public void configure(Context context) { maxPoolSize = context.getInteger("oracle_maxPoolSize", DEFAULT_MAX_POOL_SIZE); LOGGER.debug("[" + this.getName() + "] Reading configuration (oracle_maxPoolSize=" + maxPoolSize + ")"); + maxPoolIdle = context.getInteger("oracle_maxPoolIdle", DEFAULT_MAX_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (oracle_maxPoolIdle=" + maxPoolIdle + ")"); + + minPoolIdle = context.getInteger("oracle_minPoolIdle", DEFAULT_MIN_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (oracle_minPoolIdle=" + minPoolIdle + ")"); + + minPoolIdleTimeMillis = context.getInteger("oracle_minPoolIdleTimeMillis", DEFAULT_MIN_POOL_IDLE_TIME_MILLIS); + LOGGER.debug("[" + this.getName() + "] Reading configuration (oracle_minPoolIdleTimeMillis=" + minPoolIdleTimeMillis + ")"); + rowAttrPersistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE).equals("row"); String persistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE); @@ -327,10 +342,10 @@ public void configure(Context context) { @Override public void start() { try { - createPersistenceBackend(oracleHost, oraclePort, oracleUsername, oraclePassword, maxPoolSize, oracleOptions, persistErrors, maxLatestErrors); + createPersistenceBackend(oracleHost, oraclePort, oracleUsername, oraclePassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, oracleOptions, persistErrors, maxLatestErrors); LOGGER.debug("[" + this.getName() + "] OracleSQL persistence backend created"); } catch (Exception e) { - String configParams = " oracleHost " + oracleHost + " oraclePort " + oraclePort + " oracleUsername " + oracleUsername + " oraclePassword " + oraclePassword + " maxPoolSize " + maxPoolSize + " oracleOptions " + oracleOptions + " persistErrors " + persistErrors + " maxLatestErrors " + maxLatestErrors; + String configParams = " oracleHost " + oracleHost + " oraclePort " + oraclePort + " oracleUsername " + oracleUsername + " oraclePassword " + oraclePassword + " maxPoolSize " + maxPoolSize + " maxPoolIdle " + maxPoolIdle + " minPoolIdle " + minPoolIdle + " minPoolIdleTimeMillis " + minPoolIdleTimeMillis + " oracleOptions " + oracleOptions + " persistErrors " + persistErrors + " maxLatestErrors " + maxLatestErrors; LOGGER.error("Error while creating the OracleSQL persistence backend. " + "Config params= " + configParams + "Details=" + e.getMessage() + @@ -349,9 +364,9 @@ public void stop() { /** * Initialices a lazy singleton to share among instances on JVM */ - private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, String sqlOptions, boolean persistErrors, int maxLatestErrors) { + private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, String sqlOptions, boolean persistErrors, int maxLatestErrors) { if (oracleSQLPersistenceBackend == null) { - oracleSQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, ORACLE_INSTANCE_NAME, ORACLE_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); + oracleSQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, ORACLE_INSTANCE_NAME, ORACLE_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); oracleSQLPersistenceBackend.setNlsTimestampFormat(nlsTimestampFormat); oracleSQLPersistenceBackend.setNlsTimestampTzFormat(nlsTimestampTzFormat); } diff --git a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java index 316515b6f..ce6335016 100644 --- a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java +++ b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgisSink.java @@ -54,6 +54,9 @@ public class NGSIPostgisSink extends NGSISink { private static final String DEFAULT_DATABASE = "postgres"; private static final String DEFAULT_ENABLE_CACHE = "false"; private static final int DEFAULT_MAX_POOL_SIZE = 3; + private static final int DEFAULT_MAX_POOL_IDLE = 2; + private static final int DEFAULT_MIN_POOL_IDLE = 0; + private static final int DEFAULT_MIN_POOL_IDLE_TIME_MILLIS = 10000; private static final String DEFAULT_POSTGIS_TYPE = "geometry"; private static final String DEFAULT_ATTR_NATIVE_TYPES = "false"; private static final String POSTGIS_DRIVER_NAME = "org.postgresql.Driver"; @@ -75,6 +78,9 @@ public class NGSIPostgisSink extends NGSISink { private String postgisPassword; private boolean rowAttrPersistence; private int maxPoolSize; + private int maxPoolIdle; + private int minPoolIdle; + private int minPoolIdleTimeMillis; private SQLBackendImpl postgisPersistenceBackend; private boolean enableCache; private boolean swapCoordinates; @@ -218,6 +224,15 @@ public void configure(Context context) { maxPoolSize = context.getInteger("postgis_maxPoolSize", DEFAULT_MAX_POOL_SIZE); LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_maxPoolSize=" + maxPoolSize + ")"); + maxPoolIdle = context.getInteger("postgis_maxPoolIdle", DEFAULT_MAX_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_maxPoolIdle=" + maxPoolIdle + ")"); + + minPoolIdle = context.getInteger("postgis_minPoolIdle", DEFAULT_MIN_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_minPoolIdle=" + minPoolIdle + ")"); + + minPoolIdleTimeMillis = context.getInteger("postgis_minPoolIdleTimeMillis", DEFAULT_MIN_POOL_IDLE_TIME_MILLIS); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgis_minPoolIdleTimeMillis=" + minPoolIdleTimeMillis + ")"); + rowAttrPersistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE).equals("row"); String persistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE); @@ -323,11 +338,11 @@ public void stop() { @Override public void start() { try { - createPersistenceBackend(postgisHost, postgisPort, postgisUsername, postgisPassword, maxPoolSize, postgisOptions, persistErrors, maxLatestErrors); + createPersistenceBackend(postgisHost, postgisPort, postgisUsername, postgisPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, postgisOptions, persistErrors, maxLatestErrors); LOGGER.debug("[" + this.getName() + "] POSTGIS persistence backend created"); } catch (Exception e) { String configParams = " postgisHost " + postgisHost + " postgisPort " + postgisPort + " postgisUsername " + - postgisUsername + " postgisPassword " + postgisPassword + " maxPoolSize " + maxPoolSize + " postgisOptions " + + postgisUsername + " postgisPassword " + postgisPassword + " maxPoolSize " + maxPoolSize + " maxPoolIdle " + maxPoolIdle + " minPoolIdle " + minPoolIdle + " minPoolIdleTimeMillis " + minPoolIdleTimeMillis + " postgisOptions " + postgisOptions + " persistErrors " + persistErrors + " maxLatestErrors " + maxLatestErrors; LOGGER.error("Error while creating the Postgis persistence backend. " + "Config params= " + configParams + @@ -342,9 +357,9 @@ public void start() { /** * Initialices a lazy singleton to share among instances on JVM */ - private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, String sqlOptions, boolean persistErrors, int maxLatestErrors) { + private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, String sqlOptions, boolean persistErrors, int maxLatestErrors) { if (postgisPersistenceBackend == null) { - postgisPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, POSTGIS_INSTANCE_NAME, POSTGIS_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); + postgisPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, POSTGIS_INSTANCE_NAME, POSTGIS_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); } } diff --git a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java index 347f32a7c..79b176fd8 100644 --- a/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java +++ b/cygnus-ngsi/src/main/java/com/telefonica/iot/cygnus/sinks/NGSIPostgreSQLSink.java @@ -56,6 +56,9 @@ public class NGSIPostgreSQLSink extends NGSISink { private static final String DEFAULT_DATABASE = "postgres"; private static final String DEFAULT_ENABLE_CACHE = "false"; private static final int DEFAULT_MAX_POOL_SIZE = 3; + private static final int DEFAULT_MAX_POOL_IDLE = 2; + private static final int DEFAULT_MIN_POOL_IDLE = 0; + private static final int DEFAULT_MIN_POOL_IDLE_TIME_MILLIS = 10000; private static final String DEFAULT_ATTR_NATIVE_TYPES = "false"; private static final String POSTGRESQL_DRIVER_NAME = "org.postgresql.Driver"; private static final SQLInstance POSTGRESQL_INSTANCE_NAME = SQLInstance.POSTGRESQL; @@ -75,6 +78,9 @@ public class NGSIPostgreSQLSink extends NGSISink { private String postgresqlUsername; private String postgresqlPassword; private int maxPoolSize; + private int maxPoolIdle; + private int minPoolIdle; + private int minPoolIdleTimeMillis; private boolean rowAttrPersistence; private SQLBackendImpl postgreSQLPersistenceBackend; private boolean enableCache; @@ -218,6 +224,15 @@ public void configure(Context context) { maxPoolSize = context.getInteger("postgresql_maxPoolSize", DEFAULT_MAX_POOL_SIZE); LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_maxPoolSize=" + maxPoolSize + ")"); + maxPoolIdle = context.getInteger("postgresql_maxPoolIdle", DEFAULT_MAX_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_maxPoolIdle=" + maxPoolIdle + ")"); + + minPoolIdle = context.getInteger("postgresql_minPoolIdle", DEFAULT_MIN_POOL_IDLE); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_minPoolIdle=" + minPoolIdle + ")"); + + minPoolIdleTimeMillis = context.getInteger("postgresql_minPoolIdleTimeMillis", DEFAULT_MIN_POOL_IDLE_TIME_MILLIS); + LOGGER.debug("[" + this.getName() + "] Reading configuration (postgresql_minPoolIdleTimeMillis=" + minPoolIdleTimeMillis + ")"); + rowAttrPersistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE).equals("row"); String persistence = context.getString("attr_persistence", DEFAULT_ROW_ATTR_PERSISTENCE); @@ -315,12 +330,12 @@ public void configure(Context context) { @Override public void start() { try { - createPersistenceBackend(postgresqlHost, postgresqlPort, postgresqlUsername, postgresqlPassword, maxPoolSize, postgresqlOptions, persistErrors, maxLatestErrors); + createPersistenceBackend(postgresqlHost, postgresqlPort, postgresqlUsername, postgresqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, postgresqlOptions, persistErrors, maxLatestErrors); LOGGER.debug("[" + this.getName() + "] Postgresql persistence backend created"); } catch (Exception e) { String configParams = " postgresqlHost " + postgresqlHost + " postgresqlPort " + postgresqlPort + " postgresqlUsername " + postgresqlUsername + " postgresqlPassword " + postgresqlPassword + - " maxPoolSize " + maxPoolSize + " postgresqlOptions " + + " maxPoolSize " + maxPoolSize + " maxPoolIdle " + maxPoolIdle + " minPoolIdle " + minPoolIdle + " minPoolIdleTimeMillis " + minPoolIdleTimeMillis + " postgresqlOptions " + postgresqlOptions + " persistErrors " + persistErrors + " maxLatestErrors " + maxLatestErrors; LOGGER.error("Error while creating the Postgresql persistence backend. " + "Config params= " + configParams + @@ -335,9 +350,9 @@ public void start() { /** * Initialices a lazy singleton to share among instances on JVM */ - private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, String sqlOptions, boolean persistErrors, int maxLatestErrors) { + private void createPersistenceBackend(String sqlHost, String sqlPort, String sqlUsername, String sqlPassword, int maxPoolSize, int maxPoolIdle, int minPoolIdle, int minPoolIdleTimeMillis, String sqlOptions, boolean persistErrors, int maxLatestErrors) { if (postgreSQLPersistenceBackend == null) { - postgreSQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, POSTGRESQL_INSTANCE_NAME, POSTGRESQL_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); + postgreSQLPersistenceBackend = new SQLBackendImpl(sqlHost, sqlPort, sqlUsername, sqlPassword, maxPoolSize, maxPoolIdle, minPoolIdle, minPoolIdleTimeMillis, POSTGRESQL_INSTANCE_NAME, POSTGRESQL_DRIVER_NAME, sqlOptions, persistErrors, maxLatestErrors); } } diff --git a/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_mysql_sink.md b/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_mysql_sink.md index ae6ea0f08..c6ad3d435 100644 --- a/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_mysql_sink.md +++ b/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_mysql_sink.md @@ -235,6 +235,9 @@ If `attr_persistence=colum` then `NGSIMySQLSink` will persist the data within th | mysql\_username | no | root | `root` is the default username that is created automatically | | mysql\_password | no | N/A | Empty value as default (no password is created automatically) | | mysql\_maxPoolSize | no | 3 | Max number of connections per database pool | +| mysql\_maxPoolIdle | no | 2 | Max number of idle connections per database pool | +| mysql\_minPoolIdle | no | 0 | Min number of idle connections per database pool | +| mysql\_minPoolIdleTimeMillis | no | 10000 | minimum amount of time an idle connection before is eligible for eviction | | mysql\_options | no | N/A | optional connection parameter(s) concatinated to jdbc url if necessary
When `useSSL=true&requireSSL=false` is set to `mysql_options`, jdbc url will become like jdbc:mysql://mysql.example.com:3306/fiwareservice?useSSL=true&requireSSL=false| | attr\_persistence | no | row | row or column | attr\_metadata\_store | no | false | true or false. | @@ -264,6 +267,9 @@ A configuration example could be: cygnus-ngsi.sinks.mysql-sink.mysql_username = myuser cygnus-ngsi.sinks.mysql-sink.mysql_password = mypassword cygnus-ngsi.sinks.mysql-sink.mysql_maxPoolSize = 3 + cygnus-ngsi.sinks.mysql-sink.mysql_maxPoolIdle = 2 + cygnus-ngsi.sinks.mysql-sink.mysql_minPoolIdle = 0 + cygnus-ngsi.sinks.mysql-sink.mysql_minPoolIdleTimeMillis = 10000 cygnus-ngsi.sinks.mysql-sink.mysql_options = useSSL=true&requireSSL=false cygnus-ngsi.sinks.mysql-sink.attr_persistence = row cygnus-ngsi.sinks.mysql-sink.attr_native_types = false diff --git a/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_oracle_sink.md b/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_oracle_sink.md index 4512a0b43..5135b6379 100644 --- a/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_oracle_sink.md +++ b/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_oracle_sink.md @@ -236,6 +236,9 @@ If `attr_persistence=colum` then `NGSIOracleSQLSink` will persist the data withi | oracle\_password | no | oracle | `oracle` is the default for default username | | oracle\_database | no | xe | `xe` is the default database avaiable in oracle 11g XE (express edition) | | oracle\_maxPoolSize | no | 3 | Max number of connections per database pool | +| oracle\_maxPoolIdle | no | 2 | Max number of idle connections per database pool | +| oracle\_minPoolIdle | no | 0 | Min number of idle connections per database pool | +| oracle\_minPoolIdleTimeMillis | no | 10000 | minimum amount of time an idle connection before is eligible for eviction | | oracle\_options | no | N/A | optional connection parameter(s) concatinated to jdbc url if necessary
When `useSSL=true&requireSSL=false` is set to `oracle_options`, jdbc url will become like jdbc:oracle://oracle.example.com:3306/fiwareservice?useSSL=true&requireSSL=false| | attr\_persistence | no | row | row or column | attr\_metadata\_store | no | false | true or false. | @@ -273,6 +276,9 @@ A configuration example could be: cygnus-ngsi.sinks.oracle-sink.nl_timestamp_format = YYYY-MM-DD HH24:MI:SS.FF6 cygnus-ngsi.sinks.oracle-sink.nl_timestamp_tz_format = YYYY-MM-DD\"T\"HH24:MI:SS.FF6 TZR cygnus-ngsi.sinks.oracle-sink.oracle_maxPoolSize = 3 + cygnus-ngsi.sinks.oracle-sink.oracle_maxPoolIdle = 2 + cygnus-ngsi.sinks.oracle-sink.oracle_minPoolIdle = 0 + cygnus-ngsi.sinks.oracle-sink.oracle_minPoolIdleTimeMillis = 10000 cygnus-ngsi.sinks.oracle-sink.attr_persistence = column cygnus-ngsi.sinks.oracle-sink.attr_native_types = false cygnus-ngsi.sinks.oracle-sink.batch_size = 100 diff --git a/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_postgresql_sink.md b/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_postgresql_sink.md index cc10c0c82..4fac5137c 100644 --- a/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_postgresql_sink.md +++ b/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_postgresql_sink.md @@ -268,6 +268,10 @@ Coming soon. | postgresql\_database | no | postgres | `postgres` is the default database that is created automatically when install. Note also than with datamodels dm-by-entity-database, dm-by-entity-database-schema, dm-by-entity-type-database and dm-by-entity-type-database-schema this setting is ignored (as the database is part of the mapping done by the datamodel) | | | postgresql\_username | no | postgres | `postgres` is the default username that is created automatically when install | | postgresql\_password | no | N/A | Empty value by default (No password is created when install) | +| postgresql\_maxPoolSize | no | 3 | Max number of connections per database pool | +| postgresql\_maxPoolIdle | no | 2 | Max number of idle connections per database pool | +| postgresql\_minPoolIdle | no | 0 | Min number of idle connections per database pool | +| postgresql\_minPoolIdleTimeMillis | no | 10000 | minimum amount of time an idle connection before is eligible for eviction | | postgresql\_options | no | N/A | optional connection parameter(s) concatinated to jdbc url if necessary
When `sslmode=require` is set to `postgresql_options`, jdbc url will become like jdbc:postgresql://postgresql.example.com:5432/postgres?sslmode=require| | attr\_persistence | no | row | row or column. | | attr\_metadata\_store | no | false | true or false. | @@ -295,6 +299,10 @@ A configuration example could be: cygnus-ngsi.sinks.postgresql-sink.postgresql_database = mydatabase cygnus-ngsi.sinks.postgresql-sink.postgresql_username = myuser cygnus-ngsi.sinks.postgresql-sink.postgresql_password = mypassword + cygnus-ngsi.sinks.postgresql-sink.postgresql_maxPoolSize = 3 + cygnus-ngsi.sinks.postgresql-sink.postgresql_maxPoolIdle = 2 + cygnus-ngsi.sinks.postgresql-sink.postgresql_minPoolIdle = 0 + cygnus-ngsi.sinks.postgresql-sink.postgresql_minPoolIdleTimeMillis = 10000 cygnus-ngsi.sinks.postgresql-sink.postgresql_options = sslmode=require cygnus-ngsi.sinks.postgresql-sink.attr_persistence = row cygnus-ngsi.sinks.postgresql-sink.attr_native_types = false