org.h2.engine.SysProperties Maven / Gradle / Ivy
/*
* Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.engine;
import java.io.File;
import org.h2.util.MathUtils;
import org.h2.util.Utils;
/**
* The constants defined in this class are initialized from system properties.
* Some system properties are per machine settings, and others are as 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.
*
* System properties can be set when starting the virtual machine:
*
*
*
* java -Dh2.baseDir=/temp
*
*
* They can be set within the application, but this must be done before loading
* any classes of this database (before loading the JDBC driver):
*
*
* System.setProperty("h2.baseDir", "/temp");
*
*/
public class SysProperties {
/**
* INTERNAL
*/
public static final String H2_SCRIPT_DIRECTORY = "h2.scriptDirectory";
/**
* INTERNAL
*/
public static final String H2_BROWSER = "h2.browser";
/**
* System property file.separator
.
* It is set by the system, and used to build absolute file names.
*/
public static final String FILE_SEPARATOR = File.separator;
/**
* System property line.separator
.
* It is set by the system, and used by the script and trace tools.
*/
public static final String LINE_SEPARATOR = System.lineSeparator();
/**
* System property user.home
(empty string if not set).
* It is usually set by the system, and used as a replacement for ~ in file
* names.
*/
public static final String USER_HOME =
Utils.getProperty("user.home", "");
/**
* System property {@code h2.preview} (default: false).
*
* Controls default values of other properties. If {@code true} default
* values of other properties are changed to planned defaults for the 1.5.x
* versions of H2. Some other functionality may be also enabled or disabled.
*
*/
public static final boolean PREVIEW = Utils.getProperty("h2.preview", false);
/**
* System property h2.allowedClasses
(default: *).
* Comma separated list of class names or prefixes.
*/
public static final String ALLOWED_CLASSES =
Utils.getProperty("h2.allowedClasses", "*");
/**
* System property h2.enableAnonymousTLS
(default: true).
* When using TLS connection, the anonymous cipher suites should be enabled.
*/
public static final boolean ENABLE_ANONYMOUS_TLS =
Utils.getProperty("h2.enableAnonymousTLS", true);
/**
* System property h2.bindAddress
(default: null).
* The bind address to use.
*/
public static final String BIND_ADDRESS =
Utils.getProperty("h2.bindAddress", null);
/**
* System property h2.check
* (default: true for JDK/JRE, false for Android).
* Optional additional checks in the database engine.
*/
public static final boolean CHECK =
Utils.getProperty("h2.check", !"0.9".equals(Utils.getProperty("java.specification.version", null)));
/**
* System property h2.clientTraceDirectory
(default:
* trace.db/).
* Directory where the trace files of the JDBC client are stored (only for
* client / server).
*/
public static final String CLIENT_TRACE_DIRECTORY =
Utils.getProperty("h2.clientTraceDirectory", "trace.db/");
/**
* System property h2.collatorCacheSize
(default: 32000).
* The cache size for collation keys (in elements). Used when a collator has
* been set for the database.
*/
public static final int COLLATOR_CACHE_SIZE =
Utils.getProperty("h2.collatorCacheSize", 32_000);
/**
* System property h2.consoleTableIndexes
* (default: 100).
* Up to this many tables, the column type and indexes are listed.
*/
public static final int CONSOLE_MAX_TABLES_LIST_INDEXES =
Utils.getProperty("h2.consoleTableIndexes", 100);
/**
* System property h2.consoleTableColumns
* (default: 500).
* Up to this many tables, the column names are listed.
*/
public static final int CONSOLE_MAX_TABLES_LIST_COLUMNS =
Utils.getProperty("h2.consoleTableColumns", 500);
/**
* System property h2.consoleProcedureColumns
* (default: 500).
* Up to this many procedures, the column names are listed.
*/
public static final int CONSOLE_MAX_PROCEDURES_LIST_COLUMNS =
Utils.getProperty("h2.consoleProcedureColumns", 300);
/**
* System property h2.consoleStream
(default: true).
* H2 Console: stream query results.
*/
public static final boolean CONSOLE_STREAM =
Utils.getProperty("h2.consoleStream", true);
/**
* System property h2.consoleTimeout
(default: 1800000).
* H2 Console: session timeout in milliseconds. The default is 30 minutes.
*/
public static final int CONSOLE_TIMEOUT =
Utils.getProperty("h2.consoleTimeout", 30 * 60 * 1000);
/**
* System property h2.dataSourceTraceLevel
(default: 1).
* The trace level of the data source implementation. Default is 1 for
* error.
*/
public static final int DATASOURCE_TRACE_LEVEL =
Utils.getProperty("h2.dataSourceTraceLevel", 1);
/**
* System property h2.delayWrongPasswordMin
* (default: 250).
* The minimum delay in milliseconds before an exception is thrown for using
* the wrong user name or password. This slows down brute force attacks. The
* delay is reset to this value after a successful login. Unsuccessful
* logins will double the time until DELAY_WRONG_PASSWORD_MAX.
* To disable the delay, set this system property to 0.
*/
public static final int DELAY_WRONG_PASSWORD_MIN =
Utils.getProperty("h2.delayWrongPasswordMin", 250);
/**
* System property h2.delayWrongPasswordMax
* (default: 4000).
* The maximum delay in milliseconds before an exception is thrown for using
* the wrong user name or password. This slows down brute force attacks. The
* delay is reset after a successful login. The value 0 means there is no
* maximum delay.
*/
public static final int DELAY_WRONG_PASSWORD_MAX =
Utils.getProperty("h2.delayWrongPasswordMax", 4000);
/**
* System property h2.javaSystemCompiler
(default: true).
* Whether to use the Java system compiler
* (ToolProvider.getSystemJavaCompiler()) if it is available to compile user
* defined functions. If disabled or if the system compiler is not
* available, the com.sun.tools.javac compiler is used if available, and
* "javac" (as an external process) is used if not.
*/
public static final boolean JAVA_SYSTEM_COMPILER =
Utils.getProperty("h2.javaSystemCompiler", true);
/**
* System property h2.lobCloseBetweenReads
* (default: false).
* Close LOB files between read operations.
*/
public static boolean lobCloseBetweenReads =
Utils.getProperty("h2.lobCloseBetweenReads", false);
/**
* System property h2.lobFilesPerDirectory
* (default: 256).
* Maximum number of LOB files per directory.
*/
public static final int LOB_FILES_PER_DIRECTORY =
Utils.getProperty("h2.lobFilesPerDirectory", 256);
/**
* System property h2.lobClientMaxSizeMemory
(default:
* 1048576).
* The maximum size of a LOB object to keep in memory on the client side
* when using the server mode.
*/
public static final int LOB_CLIENT_MAX_SIZE_MEMORY =
Utils.getProperty("h2.lobClientMaxSizeMemory", 1024 * 1024);
/**
* System property h2.maxFileRetry
(default: 16).
* Number of times to retry file delete and rename. in Windows, files can't
* be deleted if they are open. Waiting a bit can help (sometimes the
* Windows Explorer opens the files for a short time) may help. Sometimes,
* running garbage collection may close files if the user forgot to call
* Connection.close() or InputStream.close().
*/
public static final int MAX_FILE_RETRY =
Math.max(1, Utils.getProperty("h2.maxFileRetry", 16));
/**
* System property h2.maxReconnect
(default: 3).
* The maximum number of tries to reconnect in a row.
*/
public static final int MAX_RECONNECT =
Utils.getProperty("h2.maxReconnect", 3);
/**
* System property h2.maxMemoryRows
* (default: 40000 per GB of available RAM).
* The default maximum number of rows to be kept in memory in a result set.
*/
public static final int MAX_MEMORY_ROWS =
getAutoScaledForMemoryProperty("h2.maxMemoryRows", 40_000);
/**
* System property h2.maxTraceDataLength
* (default: 65535).
* The maximum size of a LOB value that is written as data to the trace
* system.
*/
public static final long MAX_TRACE_DATA_LENGTH =
Utils.getProperty("h2.maxTraceDataLength", 65535);
/**
* System property h2.modifyOnWrite
(default: false).
* Only modify the database file when recovery is necessary, or when writing
* to the database. If disabled, opening the database always writes to the
* file (except if the database is read-only). When enabled, the serialized
* file lock is faster.
*/
public static final boolean MODIFY_ON_WRITE =
Utils.getProperty("h2.modifyOnWrite", false);
/**
* System property h2.nioLoadMapped
(default: false).
* If the mapped buffer should be loaded when the file is opened.
* This can improve performance.
*/
public static final boolean NIO_LOAD_MAPPED =
Utils.getProperty("h2.nioLoadMapped", false);
/**
* System property h2.nioCleanerHack
(default: false).
* If enabled, use the reflection hack to un-map the mapped file if
* possible. If disabled, System.gc() is called in a loop until the object
* is garbage collected. See also
* http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724038
*/
public static final boolean NIO_CLEANER_HACK =
Utils.getProperty("h2.nioCleanerHack", false);
/**
* System property h2.objectCache
(default: true).
* Cache commonly used values (numbers, strings). There is a shared cache
* for all values.
*/
public static final boolean OBJECT_CACHE =
Utils.getProperty("h2.objectCache", true);
/**
* System property h2.objectCacheMaxPerElementSize
(default:
* 4096).
* The maximum size (precision) of an object in the cache.
*/
public static final int OBJECT_CACHE_MAX_PER_ELEMENT_SIZE =
Utils.getProperty("h2.objectCacheMaxPerElementSize", 4096);
/**
* System property h2.objectCacheSize
(default: 1024).
* The maximum number of objects in the cache.
* This value must be a power of 2.
*/
public static final int OBJECT_CACHE_SIZE;
static {
try {
OBJECT_CACHE_SIZE = MathUtils.nextPowerOf2(
Utils.getProperty("h2.objectCacheSize", 1024));
} catch (IllegalArgumentException e) {
throw new IllegalStateException("Invalid h2.objectCacheSize", e);
}
}
/**
* System property {@code h2.oldResultSetGetObject}, {@code true} by default
* unless {@code h2.preview} is enabled.
*
* If {@code true} return {@code Byte} and {@code Short} from
* {@code ResultSet#getObject(int)} and {@code ResultSet#getObject(String)}
* for {@code TINYINT} and {@code SMALLINT} values.
*
*
* If {@code false} return {@code Integer} for them as specified in JDBC
* specification (see Mapping from JDBC Types to Java Object Types).
*
*/
public static final boolean OLD_RESULT_SET_GET_OBJECT = Utils.getProperty("h2.oldResultSetGetObject", !PREVIEW);
/**
* System property {@code h2.bigDecimalIsDecimal}, {@code true} by default
* unless {@code h2.preview} is enabled.
*
* If {@code true} map {@code BigDecimal} to {@code DECIMAL} type.
*
*
* If {@code false} map {@code BigDecimal} to {@code NUMERIC} as specified
* in JDBC specification (see Mapping from Java Object Types to JDBC Types).
*
*/
public static final boolean BIG_DECIMAL_IS_DECIMAL = Utils.getProperty("h2.bigDecimalIsDecimal", !PREVIEW);
/**
* System property {@code h2.returnOffsetDateTime}, {@code false} by default
* unless {@code h2.preview} is enabled.
*
* If {@code true} {@link java.sql.ResultSet#getObject(int)} and
* {@link java.sql.ResultSet#getObject(String)} return
* {@code TIMESTAMP WITH TIME ZONE} values as
* {@code java.time.OffsetDateTime}.
*
*
* If {@code false} return them as {@code org.h2.api.TimestampWithTimeZone}
* instead.
*
*
* This property has effect only on Java 8 / Android API 26 and later
* versions. Without JSR-310 {@code org.h2.api.TimestampWithTimeZone} is
* used unconditionally.
*
*/
public static final boolean RETURN_OFFSET_DATE_TIME = Utils.getProperty("h2.returnOffsetDateTime", PREVIEW);
/**
* System property h2.pgClientEncoding
(default: UTF-8).
* Default client encoding for PG server. It is used if the client does not
* sends his encoding.
*/
public static final String PG_DEFAULT_CLIENT_ENCODING =
Utils.getProperty("h2.pgClientEncoding", "UTF-8");
/**
* System property h2.prefixTempFile
(default: h2.temp).
* The prefix for temporary files in the temp directory.
*/
public static final String PREFIX_TEMP_FILE =
Utils.getProperty("h2.prefixTempFile", "h2.temp");
/**
* System property h2.serverCachedObjects
(default: 64).
* TCP Server: number of cached objects per session.
*/
public static final int SERVER_CACHED_OBJECTS =
Utils.getProperty("h2.serverCachedObjects", 64);
/**
* System property h2.serverResultSetFetchSize
* (default: 100).
* The default result set fetch size when using the server mode.
*/
public static final int SERVER_RESULT_SET_FETCH_SIZE =
Utils.getProperty("h2.serverResultSetFetchSize", 100);
/**
* System property h2.socketConnectRetry
(default: 16).
* The number of times to retry opening a socket. Windows sometimes fails
* to open a socket, see bug
* http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213296
*/
public static final int SOCKET_CONNECT_RETRY =
Utils.getProperty("h2.socketConnectRetry", 16);
/**
* System property h2.socketConnectTimeout
* (default: 2000).
* The timeout in milliseconds to connect to a server.
*/
public static final int SOCKET_CONNECT_TIMEOUT =
Utils.getProperty("h2.socketConnectTimeout", 2000);
/**
* System property h2.sortBinaryUnsigned
* (default: true).
* Whether binary data should be sorted in unsigned mode
* (0xff is larger than 0x00) by default in new databases.
*/
public static final boolean SORT_BINARY_UNSIGNED =
Utils.getProperty("h2.sortBinaryUnsigned", true);
/**
* System property {@code h2.sortUuidUnsigned}, {@code false} by default
* unless {@code h2.preview} is enabled.
* Whether UUID data should be sorted in unsigned mode
* ('ffffffff-ffff-ffff-ffff-ffffffffffff' is larger than
* '00000000-0000-0000-0000-000000000000') by default in new databases.
*/
public static final boolean SORT_UUID_UNSIGNED =
Utils.getProperty("h2.sortUuidUnsigned", PREVIEW);
/**
* System property h2.sortNullsHigh
(default: false).
* Invert the default sorting behavior for NULL, such that NULL
* is at the end of a result set in an ascending sort and at
* the beginning of a result set in a descending sort.
*/
public static final boolean SORT_NULLS_HIGH =
Utils.getProperty("h2.sortNullsHigh", false);
/**
* System property h2.splitFileSizeShift
(default: 30).
* The maximum file size of a split file is 1L << x.
*/
public static final long SPLIT_FILE_SIZE_SHIFT =
Utils.getProperty("h2.splitFileSizeShift", 30);
/**
* System property h2.syncMethod
(default: sync).
* What method to call when closing the database, on checkpoint, and on
* CHECKPOINT SYNC. The following options are supported:
* "sync" (default): RandomAccessFile.getFD().sync();
* "force": RandomAccessFile.getChannel().force(true);
* "forceFalse": RandomAccessFile.getChannel().force(false);
* "": do not call a method (fast but there is a risk of data loss
* on power failure).
*/
public static final String SYNC_METHOD =
Utils.getProperty("h2.syncMethod", "sync");
/**
* System property h2.traceIO
(default: false).
* Trace all I/O operations.
*/
public static final boolean TRACE_IO =
Utils.getProperty("h2.traceIO", false);
/**
* System property h2.threadDeadlockDetector
* (default: false).
* Detect thread deadlocks in a background thread.
*/
public static final boolean THREAD_DEADLOCK_DETECTOR =
Utils.getProperty("h2.threadDeadlockDetector", false);
/**
* System property h2.implicitRelativePath
* (default: false).
* If disabled, relative paths in database URLs need to be written as
* jdbc:h2:./test instead of jdbc:h2:test.
*/
public static final boolean IMPLICIT_RELATIVE_PATH =
Utils.getProperty("h2.implicitRelativePath", false);
/**
* System property h2.urlMap
(default: null).
* A properties file that contains a mapping between database URLs. New
* connections are written into the file. An empty value in the map means no
* redirection is used for the given URL.
*/
public static final String URL_MAP =
Utils.getProperty("h2.urlMap", null);
/**
* System property h2.useThreadContextClassLoader
* (default: false).
* Instead of using the default class loader when deserializing objects, the
* current thread-context class loader will be used.
*/
public static final boolean USE_THREAD_CONTEXT_CLASS_LOADER =
Utils.getProperty("h2.useThreadContextClassLoader", false);
/**
* System property h2.serializeJavaObject
* (default: true).
* If true, values of type OTHER will be stored in serialized form
* and have the semantics of binary data for all operations (such as sorting
* and conversion to string).
*
* If false, the objects will be serialized only for I/O operations
* and a few other special cases (for example when someone tries to get the
* value in binary form or when comparing objects that are not comparable
* otherwise).
*
* If the object implements the Comparable interface, the method compareTo
* will be used for sorting (but only if objects being compared have a
* common comparable super type). Otherwise the objects will be compared by
* type, and if they are the same by hashCode, and if the hash codes are
* equal, but objects are not, the serialized forms (the byte arrays) are
* compared.
*
* The string representation of the values use the toString method of
* object.
*
* In client-server mode, the server must have all required classes in the
* class path. On the client side, this setting is required to be disabled
* as well, to have correct string representation and display size.
*
* In embedded mode, no data copying occurs, so the user has to make
* defensive copy himself before storing, or ensure that the value object is
* immutable.
*/
public static boolean serializeJavaObject =
Utils.getProperty("h2.serializeJavaObject", true);
/**
* System property h2.javaObjectSerializer
* (default: null).
* The JavaObjectSerializer class name for java objects being stored in
* column of type OTHER. It must be the same on client and server to work
* correctly.
*/
public static final String JAVA_OBJECT_SERIALIZER =
Utils.getProperty("h2.javaObjectSerializer", null);
/**
* System property h2.customDataTypesHandler
* (default: null).
* The CustomDataTypesHandler class name that is used
* to provide support for user defined custom data types.
* It must be the same on client and server to work correctly.
*/
public static final String CUSTOM_DATA_TYPES_HANDLER =
Utils.getProperty("h2.customDataTypesHandler", null);
/**
* System property h2.authConfigFile
* (default: null).
* authConfigFile define the URL of configuration file
* of {@link org.h2.security.auth.DefaultAuthenticator}
*
*/
public static final String AUTH_CONFIG_FILE =
Utils.getProperty("h2.authConfigFile", null);
private static final String H2_BASE_DIR = "h2.baseDir";
private SysProperties() {
// utility class
}
/**
* INTERNAL
*/
public static void setBaseDir(String dir) {
if (!dir.endsWith("/")) {
dir += "/";
}
System.setProperty(H2_BASE_DIR, dir);
}
/**
* INTERNAL
*/
public static String getBaseDir() {
return Utils.getProperty(H2_BASE_DIR, null);
}
/**
* System property h2.scriptDirectory
(default: empty
* string).
* Relative or absolute directory where the script files are stored to or
* read from.
*
* @return the current value
*/
public static String getScriptDirectory() {
return Utils.getProperty(H2_SCRIPT_DIRECTORY, "");
}
/**
* This method attempts to auto-scale some of our properties to take
* advantage of more powerful machines out of the box. We assume that our
* default properties are set correctly for approx. 1G of memory, and scale
* them up if we have more.
*/
private static int getAutoScaledForMemoryProperty(String key, int defaultValue) {
String s = Utils.getProperty(key, null);
if (s != null) {
try {
return Integer.decode(s);
} catch (NumberFormatException e) {
// ignore
}
}
return Utils.scaleForAvailableMemory(defaultValue);
}
}