diff --git a/jdbc-connection-pool/src/main/java/org/xbib/jdbc/connection/pool/Pool.java b/jdbc-connection-pool/src/main/java/org/xbib/jdbc/connection/pool/Pool.java index 8b79b8f..e7b4fa7 100644 --- a/jdbc-connection-pool/src/main/java/org/xbib/jdbc/connection/pool/Pool.java +++ b/jdbc-connection-pool/src/main/java/org/xbib/jdbc/connection/pool/Pool.java @@ -152,7 +152,7 @@ public class Pool implements BagStateListener { this.closeConnectionExecutor = createThreadPoolExecutor(maxPoolSize, poolName + " connection closer", threadFactory, new ThreadPoolExecutor.CallerRunsPolicy()); this.leakTaskFactory = new ProxyLeakTaskFactory(config.getLeakDetectionThreshold(), houseKeepingExecutorService); this.houseKeeperTask = houseKeepingExecutorService.scheduleWithFixedDelay(new HouseKeeper(), 100L, config.getHousekeepingPeriodMs(), TimeUnit.MILLISECONDS); - if (Boolean.getBoolean("pool.jdbc.blockUntilFilled") && config.getInitializationFailTimeout() > 1) { + if (Boolean.getBoolean("org.xbib.jdbc.connection.pool.blockUntilFilled") && config.getInitializationFailTimeout() > 1) { addConnectionExecutor.setCorePoolSize(Math.min(16, Runtime.getRuntime().availableProcessors())); addConnectionExecutor.setMaximumPoolSize(Math.min(16, Runtime.getRuntime().availableProcessors())); final long startTime = ClockSource.currentTime(); @@ -424,7 +424,6 @@ public class Pool implements BagStateListener { ds = new DriverDataSource(jdbcUrl, config.getDriverClassName(), config.getProperties(), config.getUsername(), config.getPassword()); } } - logger.log(Level.INFO, () -> "got data source, setting props = " + config.getProperties()); setTargetFromProperties(ds, config.getProperties()); setLoginTimeout(ds); this.dataSource = ds; diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/Rows.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/Rows.java index 595be05..d77b3f5 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/Rows.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/Rows.java @@ -4,5 +4,8 @@ package org.xbib.jdbc.query; * Interface for reading results from a database query. */ public interface Rows extends Row { + boolean next(); + + Integer rowCount(); } diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/RowsAdaptor.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/RowsAdaptor.java index 4b66444..c427f31 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/RowsAdaptor.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/RowsAdaptor.java @@ -717,6 +717,16 @@ class RowsAdaptor implements Rows { } } + @Override + public Integer rowCount() { + try { + //rs.last(); + return rs.getRow(); + } catch (SQLException e) { + throw new DatabaseException(e); + } + } + /** * Make sure the Timestamp will return getTime() accurate to the millisecond * (if possible) and truncate away nanoseconds. diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/SqlSelectImpl.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/SqlSelectImpl.java index e429ac4..7d4963c 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/SqlSelectImpl.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/SqlSelectImpl.java @@ -230,17 +230,13 @@ public class SqlSelectImpl implements SqlSelect { return this; } - @Override public Boolean queryBooleanOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public Boolean process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getBooleanOrNull(); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getBooleanOrNull(); } + return null; }); } @@ -259,337 +255,264 @@ public class SqlSelectImpl implements SqlSelect { @Override public Long queryLongOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public Long process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getLongOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getLongOrNull(1); } + return null; }); } @Override public long queryLongOrZero() { - return queryWithTimeout(new RowsHandler() { - @Override - public Long process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getLongOrZero(1); - } - return 0L; + Long l = queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getLongOrZero(1); } + return 0L; }); + return l != null ? l : 0L; } - @Override public List queryLongs() { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - Long value = rs.getLongOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + Long value = rs.getLongOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } @Override public Integer queryIntegerOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public Integer process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getIntegerOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getIntegerOrNull(1); } + return null; }); } @Override public int queryIntegerOrZero() { - return queryWithTimeout(new RowsHandler() { - @Override - public Integer process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getIntegerOrZero(1); - } - return 0; + Integer i = queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getIntegerOrZero(1); } + return 0; }); + return i != null ? i : 0; } - @Override public List queryIntegers() { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - Integer value = rs.getIntegerOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + Integer value = rs.getIntegerOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } @Override public Float queryFloatOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public Float process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getFloatOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getFloatOrNull(1); } + return null; }); } @Override public float queryFloatOrZero() { - return queryWithTimeout(new RowsHandler() { - @Override - public Float process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getFloatOrZero(1); - } - return 0f; + Float f = queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getFloatOrZero(1); } + return 0f; }); + return f!= null ? f : 0f; } - @Override public List queryFloats() { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - Float value = rs.getFloatOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + Float value = rs.getFloatOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } - @Override public Double queryDoubleOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public Double process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getDoubleOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getDoubleOrNull(1); } + return null; }); } @Override public double queryDoubleOrZero() { - return queryWithTimeout(new RowsHandler() { - @Override - public Double process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getDoubleOrZero(1); - } - return 0d; + Double d = queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getDoubleOrZero(1); } + return 0d; }); + return d != null ? d : 0d; } - @Override public List queryDoubles() { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - Double value = rs.getDoubleOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + Double value = rs.getDoubleOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } - @Override public BigDecimal queryBigDecimalOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public BigDecimal process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getBigDecimalOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getBigDecimalOrNull(1); } + return null; }); } @Override public BigDecimal queryBigDecimalOrZero() { - return queryWithTimeout(new RowsHandler() { - @Override - public BigDecimal process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getBigDecimalOrZero(1); - } - return new BigDecimal(0); + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getBigDecimalOrZero(1); } + return new BigDecimal(0); }); } @Override public List queryBigDecimals() { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - BigDecimal value = rs.getBigDecimalOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + BigDecimal value = rs.getBigDecimalOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } @Override public String queryStringOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public String process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getStringOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getStringOrNull(1); } + return null; }); } @Override public String queryStringOrEmpty() { - return queryWithTimeout(new RowsHandler() { - @Override - public String process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getStringOrEmpty(1); - } - return ""; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getStringOrEmpty(1); } + return ""; }); } - @Override public List queryStrings() { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - String value = rs.getStringOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + String value = rs.getStringOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } - @Override public Date queryDateOrNull() { - return queryWithTimeout(new RowsHandler() { - @Override - public Date process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getDateOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getDateOrNull(1); } + return null; }); } - @Override public List queryDates() { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - Date value = rs.getDateOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + Date value = rs.getDateOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } - @Override public LocalDate queryLocalDateOrNull() { // Date without time - return queryWithTimeout(new RowsHandler() { - @Override - public LocalDate process(Rows rs) throws Exception { - if (rs.next()) { - return rs.getLocalDateOrNull(1); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rs.getLocalDateOrNull(1); } + return null; }); } - @Override public List queryLocalDates() { // Date without time - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - while (rs.next()) { - LocalDate value = rs.getLocalDateOrNull(1); - if (value != null) { - result.add(value); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + LocalDate value = rs.getLocalDateOrNull(1); + if (value != null) { + result.add(value); } - return result; } + return result; }); } @@ -600,18 +523,15 @@ public class SqlSelectImpl implements SqlSelect { @Override public T queryOneOrNull(final RowHandler rowHandler) { - return queryWithTimeout(new RowsHandler() { - @Override - public T process(Rows rs) throws Exception { + return queryWithTimeout(rs -> { + if (rs.next()) { + T result = rowHandler.process(rs); if (rs.next()) { - T result = rowHandler.process(rs); - if (rs.next()) { - throw new ConstraintViolationException("Expected exactly one row to be returned but found multiple"); - } - return result; + throw new ConstraintViolationException("Expected exactly one row to be returned but found multiple"); } - return null; + return result; } + return null; }); } @@ -626,14 +546,11 @@ public class SqlSelectImpl implements SqlSelect { @Override public T queryFirstOrNull(final RowHandler rowHandler) { - return queryWithTimeout(new RowsHandler() { - @Override - public T process(Rows rs) throws Exception { - if (rs.next()) { - return rowHandler.process(rs); - } - return null; + return queryWithTimeout(rs -> { + if (rs.next()) { + return rowHandler.process(rs); } + return null; }); } @@ -648,20 +565,15 @@ public class SqlSelectImpl implements SqlSelect { @Override public List queryMany(final RowHandler rowHandler) { - return queryWithTimeout(new RowsHandler>() { - @Override - public List process(Rows rs) throws Exception { - List result = new ArrayList<>(); - - while (rs.next()) { - T row = rowHandler.process(rs); - if (row != null) { - result.add(row); - } + return queryWithTimeout(rs -> { + List result = new ArrayList<>(); + while (rs.next()) { + T row = rowHandler.process(rs); + if (row != null) { + result.add(row); } - - return result; } + return result; }); } @@ -757,7 +669,7 @@ public class SqlSelectImpl implements SqlSelect { if (isSuccess) { DebugSql.logSuccess("Query", log, metric, executeSql, parameters, options); } else if (isWarn) { - DebugSql.logWarning("Query", log, metric, "QueryTimedOutException", executeSql, parameters, options, logEx); + DebugSql.logWarning("Query", log, metric, "QueryTimedOutException", executeSql, parameters, options, null); } else { DebugSql.logError("Query", log, metric, errorCode, executeSql, parameters, options, logEx); } diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/util/DebugSql.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/util/DebugSql.java index c3f469f..00d662c 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/util/DebugSql.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/util/DebugSql.java @@ -13,7 +13,6 @@ import java.util.logging.Logger; /** * Convenience class to substitute real values into a database query for debugging, logging, etc. - *

* WARNING!!! Never execute this SQL without manual inspection because this class does NOTHING * to prevent SQL injection or any other bad things. */ diff --git a/jdbc-query/src/test/java/org/xbib/jdbc/query/test/RowStub.java b/jdbc-query/src/test/java/org/xbib/jdbc/query/test/RowStub.java index 9723db8..41be9ac 100644 --- a/jdbc-query/src/test/java/org/xbib/jdbc/query/test/RowStub.java +++ b/jdbc-query/src/test/java/org/xbib/jdbc/query/test/RowStub.java @@ -48,6 +48,10 @@ public class RowStub { return !rows.isEmpty() && ++row < rows.size(); } + @Override + public Integer rowCount() { + return 0; + } @Override public String[] getColumnLabels() { @@ -55,7 +59,6 @@ public class RowStub { return columnNames; } - @Override public ResultSetMetaData getMetadata() { requireColumnNames();