org.h2.engine.DbSettings Maven / Gradle / Ivy
/*
* Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (https://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.engine;
import java.util.HashMap;
import org.h2.api.ErrorCode;
import org.h2.message.DbException;
import org.h2.util.Utils;
/**
* This class contains various database-level settings. To override the
* documented default value for a database, append the setting in the database
* URL: "jdbc:h2:./test;ALIAS_COLUMN_NAME=TRUE" when opening the first connection
* to the database. The settings can not be changed once the database is open.
*
* Some settings are a last resort and temporary solution to work around a
* problem in the application or database engine. Also, there are system
* properties to enable features that are not yet fully tested or that are not
* backward compatible.
*
*/
public class DbSettings extends SettingsBase {
private static DbSettings defaultSettings;
/**
* The initial size of the hash table.
*/
static final int TABLE_SIZE = 64;
/**
* Database setting ALIAS_COLUMN_NAME
(default: false).
* When enabled, aliased columns (as in SELECT ID AS I FROM TEST) return the
* alias (I in this case) in ResultSetMetaData.getColumnName() and 'null' in
* getTableName(). If disabled, the real column name (ID in this case) and
* table name is returned.
*
* This setting only affects the default and the MySQL mode. When using
* any other mode, this feature is enabled for compatibility, even if this
* database setting is not enabled explicitly.
*/
public final boolean aliasColumnName = get("ALIAS_COLUMN_NAME", false);
/**
* Database setting ANALYZE_AUTO
(default: 2000).
* After changing this many rows, ANALYZE is automatically run for a table.
* Automatically running ANALYZE is disabled if set to 0. If set to 1000,
* then ANALYZE will run against each user table after about 1000 changes to
* that table. The time between running ANALYZE doubles each time since
* starting the database. It is not run on local temporary tables, and
* tables that have a trigger on SELECT.
*/
public final int analyzeAuto = get("ANALYZE_AUTO", 2000);
/**
* Database setting ANALYZE_SAMPLE
(default: 10000).
* The default sample size when analyzing a table.
*/
public final int analyzeSample = get("ANALYZE_SAMPLE", 10_000);
/**
* Database setting DATABASE_TO_LOWER
(default: false).
* When set to true unquoted identifiers and short name of database are
* converted to lower case. Value of this setting should not be changed
* after creation of database. Setting this to "true" is experimental.
*/
public final boolean databaseToLower;
/**
* Database setting DATABASE_TO_UPPER
(default: true).
* When set to true unquoted identifiers and short name of database are
* converted to upper case.
*/
public final boolean databaseToUpper;
/**
* Database setting CASE_INSENSITIVE_IDENTIFIERS
(default:
* false).
* When set to true, all identifier names (table names, column names) are
* case insensitive. Setting this to "true" is experimental.
*/
public final boolean caseInsensitiveIdentifiers = get("CASE_INSENSITIVE_IDENTIFIERS", false);
/**
* Database setting DB_CLOSE_ON_EXIT
(default: true).
* Close the database when the virtual machine exits normally, using a
* shutdown hook.
*/
public final boolean dbCloseOnExit = get("DB_CLOSE_ON_EXIT", true);
/**
* Database setting DEFAULT_CONNECTION
(default: false).
* Whether Java functions can use
* DriverManager.getConnection("jdbc:default:connection")
to
* get a database connection. This feature is disabled by default for
* performance reasons. Please note the Oracle JDBC driver will try to
* resolve this database URL if it is loaded before the H2 driver.
*/
public final boolean defaultConnection = get("DEFAULT_CONNECTION", false);
/**
* Database setting DEFAULT_ESCAPE
(default: \).
* The default escape character for LIKE comparisons. To select no escape
* character, use an empty string.
*/
public final String defaultEscape = get("DEFAULT_ESCAPE", "\\");
/**
* Database setting DEFRAG_ALWAYS
(default: false).
* Each time the database is closed normally, it is fully defragmented (the
* same as SHUTDOWN DEFRAG). If you execute SHUTDOWN COMPACT, then this
* setting is ignored.
*/
public final boolean defragAlways = get("DEFRAG_ALWAYS", false);
/**
* Database setting DROP_RESTRICT
(default: true).
* Whether the default action for DROP TABLE, DROP VIEW, DROP SCHEMA, and
* DROP DOMAIN is RESTRICT.
*/
public final boolean dropRestrict = get("DROP_RESTRICT", true);
/**
* Database setting EARLY_FILTER
(default: false).
* This setting allows table implementations to apply filter conditions
* early on.
*/
public final boolean earlyFilter = get("EARLY_FILTER", false);
/**
* Database setting ESTIMATED_FUNCTION_TABLE_ROWS
(default:
* 1000).
* The estimated number of rows in a function table (for example, CSVREAD or
* FTL_SEARCH). This value is used by the optimizer.
*/
public final int estimatedFunctionTableRows = get(
"ESTIMATED_FUNCTION_TABLE_ROWS", 1000);
/**
* Database setting FUNCTIONS_IN_SCHEMA
* (default: true).
* If set, all functions are stored in a schema. Specially, the SCRIPT
* statement will always include the schema name in the CREATE ALIAS
* statement. This is not backward compatible with H2 versions 1.2.134 and
* older.
*/
public final boolean functionsInSchema = get("FUNCTIONS_IN_SCHEMA", true);
/**
* Database setting LOB_TIMEOUT
(default: 300000,
* which means 5 minutes).
* The number of milliseconds a temporary LOB reference is kept until it
* times out. After the timeout, the LOB is no longer accessible using this
* reference.
*/
public final int lobTimeout = get("LOB_TIMEOUT", 300_000);
/**
* Database setting MAX_COMPACT_COUNT
* (default: Integer.MAX_VALUE).
* The maximum number of pages to move when closing a database.
*/
public final int maxCompactCount = get("MAX_COMPACT_COUNT",
Integer.MAX_VALUE);
/**
* Database setting MAX_COMPACT_TIME
(default: 200).
* The maximum time in milliseconds used to compact a database when closing.
*/
public final int maxCompactTime = get("MAX_COMPACT_TIME", 200);
/**
* Database setting MAX_QUERY_TIMEOUT
(default: 0).
* The maximum timeout of a query in milliseconds. The default is 0, meaning
* no limit. Please note the actual query timeout may be set to a lower
* value.
*/
public final int maxQueryTimeout = get("MAX_QUERY_TIMEOUT", 0);
/**
* Database setting OPTIMIZE_DISTINCT
(default: true).
* Improve the performance of simple DISTINCT queries if an index is
* available for the given column. The optimization is used if:
*
* - The select is a single column query without condition
* - The query contains only one table, and no group by
* - There is only one table involved
* - There is an ascending index on the column
* - The selectivity of the column is below 20
*
*/
public final boolean optimizeDistinct = get("OPTIMIZE_DISTINCT", true);
/**
* Database setting OPTIMIZE_EVALUATABLE_SUBQUERIES
(default:
* true).
* Optimize subqueries that are not dependent on the outer query.
*/
public final boolean optimizeEvaluatableSubqueries = get(
"OPTIMIZE_EVALUATABLE_SUBQUERIES", true);
/**
* Database setting OPTIMIZE_INSERT_FROM_SELECT
* (default: true).
* Insert into table from query directly bypassing temporary disk storage.
* This also applies to create table as select.
*/
public final boolean optimizeInsertFromSelect = get(
"OPTIMIZE_INSERT_FROM_SELECT", true);
/**
* Database setting OPTIMIZE_IN_LIST
(default: true).
* Optimize IN(...) and IN(SELECT ...) comparisons. This includes
* optimization for SELECT, DELETE, and UPDATE.
*/
public final boolean optimizeInList = get("OPTIMIZE_IN_LIST", true);
/**
* Database setting OPTIMIZE_IN_SELECT
(default: true).
* Optimize IN(SELECT ...) comparisons. This includes
* optimization for SELECT, DELETE, and UPDATE.
*/
public final boolean optimizeInSelect = get("OPTIMIZE_IN_SELECT", true);
/**
* Database setting OPTIMIZE_OR
(default: true).
* Convert (C=? OR C=?) to (C IN(?, ?)).
*/
public final boolean optimizeOr = get("OPTIMIZE_OR", true);
/**
* Database setting OPTIMIZE_TWO_EQUALS
(default: true).
* Optimize expressions of the form A=B AND B=1. In this case, AND A=1 is
* added so an index on A can be used.
*/
public final boolean optimizeTwoEquals = get("OPTIMIZE_TWO_EQUALS", true);
/**
* Database setting OPTIMIZE_UPDATE
(default: true).
* Speed up inserts, updates, and deletes by not reading all rows from a
* page unless necessary.
*/
public final boolean optimizeUpdate = get("OPTIMIZE_UPDATE", true);
/**
* Database setting PAGE_STORE_MAX_GROWTH
* (default: 128 * 1024).
* The maximum number of pages the file grows at any time.
*/
public final int pageStoreMaxGrowth = get("PAGE_STORE_MAX_GROWTH",
128 * 1024);
/**
* Database setting PAGE_STORE_INTERNAL_COUNT
* (default: false).
* Update the row counts on a node level.
*/
public final boolean pageStoreInternalCount = get(
"PAGE_STORE_INTERNAL_COUNT", false);
/**
* Database setting PAGE_STORE_TRIM
(default: true).
* Trim the database size when closing.
*/
public final boolean pageStoreTrim = get("PAGE_STORE_TRIM", true);
/**
* Database setting QUERY_CACHE_SIZE
(default: 8).
* The size of the query cache, in number of cached statements. Each session
* has it's own cache with the given size. The cache is only used if the SQL
* statement and all parameters match. Only the last returned result per
* query is cached. The following statement types are cached: SELECT
* statements are cached (excluding UNION and FOR UPDATE statements), CALL
* if it returns a single value, DELETE, INSERT, MERGE, UPDATE, and
* transactional statements such as COMMIT. This works for both statements
* and prepared statement.
*/
public final int queryCacheSize = get("QUERY_CACHE_SIZE", 8);
/**
* Database setting RECOMPILE_ALWAYS
(default: false).
* Always recompile prepared statements.
*/
public final boolean recompileAlways = get("RECOMPILE_ALWAYS", false);
/**
* Database setting REUSE_SPACE
(default: true).
* If disabled, all changes are appended to the database file, and existing
* content is never overwritten. This setting has no effect if the database
* is already open.
*/
public final boolean reuseSpace = get("REUSE_SPACE", true);
/**
* Database setting SHARE_LINKED_CONNECTIONS
* (default: true).
* Linked connections should be shared, that means connections to the same
* database should be used for all linked tables that connect to the same
* database.
*/
public final boolean shareLinkedConnections = get(
"SHARE_LINKED_CONNECTIONS", true);
/**
* Database setting DEFAULT_TABLE_ENGINE
* (default: null).
* The default table engine to use for new tables.
*/
public final String defaultTableEngine = get("DEFAULT_TABLE_ENGINE", null);
/**
* Database setting MV_STORE
* (default: true).
* Use the MVStore storage engine.
*/
public boolean mvStore = get("MV_STORE", true);
/**
* Database setting COMPRESS
* (default: false).
* Compress data when storing.
*/
public final boolean compressData = get("COMPRESS", false);
/**
* Database setting IGNORE_CATALOGS
* (default: false).
* If set, all catalog names in identifiers are silently accepted
* without comparing them with the short name of the database.
*/
public final boolean ignoreCatalogs = get("IGNORE_CATALOGS", false);
private DbSettings(HashMap s) {
super(s);
if (s.get("NESTED_JOINS") != null || Utils.getProperty("h2.nestedJoins", null) != null) {
throw DbException.getUnsupportedException("NESTED_JOINS setting is not available since 1.4.197");
}
boolean lower = get("DATABASE_TO_LOWER", false);
boolean upperSet = containsKey("DATABASE_TO_UPPER");
boolean upper = get("DATABASE_TO_UPPER", true);
if (lower && upper) {
if (upperSet) {
throw DbException.get(ErrorCode.UNSUPPORTED_SETTING_COMBINATION,
"DATABASE_TO_LOWER & DATABASE_TO_UPPER");
}
upper = false;
}
databaseToLower = lower;
databaseToUpper = upper;
HashMap settings = getSettings();
settings.put("DATABASE_TO_LOWER", Boolean.toString(lower));
settings.put("DATABASE_TO_UPPER", Boolean.toString(upper));
}
/**
* Sets the database engine setting.
*
* @param mvStore
* true for MVStore engine, false for PageStore engine
*/
void setMvStore(boolean mvStore) {
this.mvStore = mvStore;
set("MV_STORE", mvStore);
}
/**
* INTERNAL.
* Get the settings for the given properties (may not be null).
*
* @param s the settings
* @return the settings
*/
public static DbSettings getInstance(HashMap s) {
return new DbSettings(s);
}
/**
* INTERNAL.
* Get the default settings. Those must not be modified.
*
* @return the settings
*/
public static DbSettings getDefaultSettings() {
if (defaultSettings == null) {
defaultSettings = new DbSettings(new HashMap(TABLE_SIZE));
}
return defaultSettings;
}
}