提交 c7038f81 authored 作者: Thomas Mueller's avatar Thomas Mueller

--no commit message

--no commit message
上级 d00707ae
...@@ -18,7 +18,15 @@ Change Log ...@@ -18,7 +18,15 @@ Change Log
<h1>Change Log</h1> <h1>Change Log</h1>
<h2>Next Version (unreleased)</h2> <h2>Next Version (unreleased)</h2>
<ul><li>- <ul><li>H2 Console: command line settings are now longer stored in the properties file.
They are now only used for the current process, except if they are explicitly saved.
</li><li>Cache: support for a second level soft-references cache.
To enable it, append ;CACHE_TYPE=SOFT_LRU (or SOFT_TQ) to the database URL, or
set the system property h2.cacheTypeDefault to "SOFT_LRU" / "SOFT_TQ".
Enabling the second level cache reduces performance for
small databases, but speeds up large databases. It makes sense to use it
if the available memory size is unknown. Thanks a lot to Jan Kotek!
</li><li>
</li></ul> </li></ul>
<h2>Version 1.1.112 (2009-05-01)</h2> <h2>Version 1.1.112 (2009-05-01)</h2>
......
...@@ -38,7 +38,7 @@ Downloads ...@@ -38,7 +38,7 @@ Downloads
<p> <p>
<a href="http://repo2.maven.org/maven2/com/h2database/h2/${version}/h2-${version}.jar">Maven.org</a><br /> <a href="http://repo2.maven.org/maven2/com/h2database/h2/${version}/h2-${version}.jar">Maven.org</a><br />
<a href="http://hsql.sourceforge.net/m2-repo/com/h2database/h2/${version}/h2-${version}.jar">Sourceforge.net</a><br /> <a href="http://hsql.sourceforge.net/m2-repo/com/h2database/h2/${version}/h2-${version}.jar">Sourceforge.net</a><br />
<a href="http://www.h2database.com/automated/h2-latest.jar"">Latest Automated Build (not released)</a> <a href="http://www.h2database.com/automated/h2-latest.jar">Latest Automated Build (not released)</a>
</p> </p>
<h3>Subversion Source Repository</h3> <h3>Subversion Source Repository</h3>
......
...@@ -1661,13 +1661,17 @@ CACHE_SIZE. This setting can be set in the database connection URL ...@@ -1661,13 +1661,17 @@ CACHE_SIZE. This setting can be set in the database connection URL
SET CACHE_SIZE size. SET CACHE_SIZE size.
</p><p> </p><p>
This database supports two cache page replacement algorithms: LRU (the default) and This database supports two cache page replacement algorithms: LRU (the default) and
2Q. For LRU, the pages that were least frequently used are removed from the TQ. For LRU, the pages that were least frequently used are removed from the
cache if it becomes full. The 2Q algorithm is a bit more complicated: basically two cache if it becomes full. The TQ (Two Queue, also called 2Q) algorithm is a bit more complicated: basically two
queues are used. The 2Q algorithm is more resistant to table scans, however the overhead queues are used. It is more resistant to table scans, however the overhead
is a bit higher compared to the LRU. To use the cache algorithm 2Q, use a database URL is a bit higher compared to the LRU. To use the cache algorithm TQ, use a database URL
of the form jdbc:h2:~/test;CACHE_TYPE=TQ. The cache algorithm cannot be changed of the form jdbc:h2:~/test;CACHE_TYPE=TQ. The cache algorithm cannot be changed
once the database is open. once the database is open.
</p><p> </p><p>
Also supported is a second level soft reference cache. Rows in this cache are only garbage collected
on low memory. By default the second level cache is disabled. To enable it,
use the prefix SOFT_. Example: jdbc:h2:~/test;CACHE_TYPE=SOFT_LRU .
</p><p>
To get information about page reads and writes, and the current caching algorithm in use, To get information about page reads and writes, and the current caching algorithm in use,
call SELECT * FROM INFORMATION_SCHEMA.SETTINGS. The number of pages read / written call SELECT * FROM INFORMATION_SCHEMA.SETTINGS. The number of pages read / written
is listed for the data and index file. is listed for the data and index file.
......
...@@ -451,4 +451,10 @@ See <code>src/test/org/h2/samples/optimizations.sql</code> for a few examples of ...@@ -451,4 +451,10 @@ See <code>src/test/org/h2/samples/optimizations.sql</code> for a few examples of
that benefit from special optimizations built into the database. that benefit from special optimizations built into the database.
</p> </p>
<h3>Cache Size and Type</h3>
<p>
By default the cache size of H2 is quite small. Consider using a larger cache size, or enable
the second level soft reference cache. See also <a href="features.html#cache_settings">Cache Settings</a>.
</p>
<!-- [close] { --></div></td></tr></table><!-- } --><!-- analytics --></body></html> <!-- [close] { --></div></td></tr></table><!-- } --><!-- analytics --></body></html>
...@@ -197,7 +197,7 @@ See also <a href="build.html#providing_patches">Providing Patches</a>. ...@@ -197,7 +197,7 @@ See also <a href="build.html#providing_patches">Providing Patches</a>.
</li><li>Feature matrix like in <a href="http://www.inetsoftware.de/products/jdbc/mssql/features/default.asp">i-net software</a>. </li><li>Feature matrix like in <a href="http://www.inetsoftware.de/products/jdbc/mssql/features/default.asp">i-net software</a>.
</li><li>Updatable result set on table without primary key or unique index </li><li>Updatable result set on table without primary key or unique index
</li><li>Use LinkedList instead of ArrayList where applicable </li><li>Use LinkedList instead of ArrayList where applicable
</li><li>Optimizer: use an index for IS NULL and IS NOT NULL (including linked tables). </li><li>Optimizer: use an index for IS NULL and IS NOT NULL (including linked tables).
ID IS NOT NULL could be converted to ID >= Integer.MIN_VALUE. ID IS NOT NULL could be converted to ID >= Integer.MIN_VALUE.
</li><li>Support % operator (modulo) </li><li>Support % operator (modulo)
</li><li>Support 1+'2'=3, '1'+'2'='12' (MS SQL Server compatibility) </li><li>Support 1+'2'=3, '1'+'2'='12' (MS SQL Server compatibility)
......
...@@ -1148,7 +1148,7 @@ Submit patches as .patch files (compressed if big). To create a patch using Ecli ...@@ -1148,7 +1148,7 @@ Submit patches as .patch files (compressed if big). To create a patch using Ecli
Automated Build Automated Build
@build_1064_p @build_1064_p
This build process is automated and runs regularly. The build process includes running the tests and code coverage. The last results are available here: This build process is automated and runs regularly. The build process includes running the tests and code coverage, using the command line <code>./build.sh clean jar coverage -Dh2.ftpPassword=... uploadBuild</code> . The last results are available here:
@build_1065_a @build_1065_a
Test Output Test Output
...@@ -1159,6 +1159,12 @@ Code Coverage Summary ...@@ -1159,6 +1159,12 @@ Code Coverage Summary
@build_1067_a @build_1067_a
Code Coverage Details (download, 1.3 MB) Code Coverage Details (download, 1.3 MB)
@build_1068_a
Build Newsfeed
@build_1069_a
Latest Jar File (download, 1 MB)
@changelog_1000_h1 @changelog_1000_h1
Change Log Change Log
...@@ -1166,1053 +1172,1056 @@ Change Log ...@@ -1166,1053 +1172,1056 @@ Change Log
Next Version (unreleased) Next Version (unreleased)
@changelog_1002_li @changelog_1002_li
- H2 Console: command line properties are now longer stored in the properties file. They are now only used for the current process, except if they are explicitly saved.
@changelog_1003_h2 @changelog_1003_li
Cache: support for a second level soft-references cache. To enable it, append ;CACHE_TYPE=SOFT_LRU (or SOFT_TQ) to the database URL, or set the system property h2.cacheTypeDefault to "SOFT_LRU" / "SOFT_TQ". Enabling the second level cache reduces performance for small databases, but speeds up large databases. It makes sense to use it if the available memory size is unknown. Thanks a lot to Jan Kotek!
@changelog_1004_h2
Version 1.1.112 (2009-05-01) Version 1.1.112 (2009-05-01)
@changelog_1004_li @changelog_1005_li
JdbcPreparedStatement.toString() could throw a NullPointerException. JdbcPreparedStatement.toString() could throw a NullPointerException.
@changelog_1005_li @changelog_1006_li
EclipseLink: Added H2Platform.supportsIdentity(). EclipseLink: Added H2Platform.supportsIdentity().
@changelog_1006_li @changelog_1007_li
Connection pool: the default login timeout is now 5 minutes. Connection pool: the default login timeout is now 5 minutes.
@changelog_1007_li @changelog_1008_li
After truncating tables, opening large databases could become slow because indexes were always re-built unnecessarily when opening. After truncating tables, opening large databases could become slow because indexes were always re-built unnecessarily when opening.
@changelog_1008_li @changelog_1009_li
More bugs in the server-less multi-connection mode have been fixed: Sometimes parameters of prepared statements were lost when a reconnecting. Concurrent read operations were slow. To improve performance, executeQuery(..) must be used for queries (execute(..) switches to the write mode, which is slow). More bugs in the server-less multi-connection mode have been fixed: Sometimes parameters of prepared statements were lost when a reconnecting. Concurrent read operations were slow. To improve performance, executeQuery(..) must be used for queries (execute(..) switches to the write mode, which is slow).
@changelog_1009_li @changelog_1010_li
GROUP BY queries with a self-join (join to the same table) that were grouped by columns with indexes returned the wrong result in some cases. GROUP BY queries with a self-join (join to the same table) that were grouped by columns with indexes returned the wrong result in some cases.
@changelog_1010_li @changelog_1011_li
Improved error message when the .lock.db file modification time is in the future. Improved error message when the .lock.db file modification time is in the future.
@changelog_1011_li @changelog_1012_li
The MERGE statement now returns 0 as the generated key if the row was updated. The MERGE statement now returns 0 as the generated key if the row was updated.
@changelog_1012_li @changelog_1013_li
Running code coverage is now automated. Running code coverage is now automated.
@changelog_1013_li @changelog_1014_li
A file system implementation can now be registered using FileSystem.register. A file system implementation can now be registered using FileSystem.register.
@changelog_1014_li @changelog_1015_li
The database file system is no longer included in the jar file, it moved to the test section. The database file system is no longer included in the jar file, it moved to the test section.
@changelog_1015_h2 @changelog_1016_h2
Version 1.1.111 (2009-04-10) Version 1.1.111 (2009-04-10)
@changelog_1016_li @changelog_1017_li
In-memory databases can now run inside the Google App Engine. In-memory databases can now run inside the Google App Engine.
@changelog_1017_li @changelog_1018_li
Queries that are ordered by an indexed column returned no rows in certain cases (if all rows were deleted from the table previously, and there is a low number of rows in the table, and when not using other conditions, and when using the default b tree index). Queries that are ordered by an indexed column returned no rows in certain cases (if all rows were deleted from the table previously, and there is a low number of rows in the table, and when not using other conditions, and when using the default b tree index).
@changelog_1018_li @changelog_1019_li
The wrong exception was thrown when using unquoted text for the SQL statements COMMENT, ALTER USER, and SET PASSWORD. The wrong exception was thrown when using unquoted text for the SQL statements COMMENT, ALTER USER, and SET PASSWORD.
@changelog_1019_li @changelog_1020_li
The built-in connection pool did not roll back transactions and enable autocommit enabled after closing a connection. The built-in connection pool did not roll back transactions and enable autocommit enabled after closing a connection.
@changelog_1020_li @changelog_1021_li
Sometimes a StackOverflow occurred when checking for deadlock. See also http://code.google.com/p/h2database/issues/detail?id=61 Sometimes a StackOverflow occurred when checking for deadlock. See also http://code.google.com/p/h2database/issues/detail?id=61
@changelog_1021_li @changelog_1022_li
The Shell tool no longer truncates results with only one column, and displays a message if data was truncated. The Shell tool no longer truncates results with only one column, and displays a message if data was truncated.
@changelog_1022_h2 @changelog_1023_h2
Version 1.1.110 (2009-04-03) Version 1.1.110 (2009-04-03)
@changelog_1023_li @changelog_1024_li
Support for not persistent in-memory tables in regular (persistent) databases using CREATE MEMORY TABLE(..) NOT PERSISTENT. Thanks a lot to Sergi Vladykin for the patch! Support for not persistent in-memory tables in regular (persistent) databases using CREATE MEMORY TABLE(..) NOT PERSISTENT. Thanks a lot to Sergi Vladykin for the patch!
@changelog_1024_li @changelog_1025_li
The H2 Console trimmed the password (removed leading and trailing spaces). This is no longer the case, to support encrypted H2 database with an empty user password. The H2 Console trimmed the password (removed leading and trailing spaces). This is no longer the case, to support encrypted H2 database with an empty user password.
@changelog_1025_li @changelog_1026_li
The data type of a SUBSTRING method was wrong. The data type of a SUBSTRING method was wrong.
@changelog_1026_li @changelog_1027_li
ResultSet.findColumn and get methods with column label parameters now also check for matching column names (like most databases except MySQL). ResultSet.findColumn and get methods with column label parameters now also check for matching column names (like most databases except MySQL).
@changelog_1027_li @changelog_1028_li
H2 Console: the browser system property now supports a list of arguments. Example: java -Dh2.browser="open,-a,Safari,%url" ... H2 Console: the browser system property now supports a list of arguments. Example: java -Dh2.browser="open,-a,Safari,%url" ...
@changelog_1028_li @changelog_1029_li
Improved Javadoc navigation (similar to Scaladoc). Improved Javadoc navigation (similar to Scaladoc).
@changelog_1029_li @changelog_1030_li
H2 Console: auto-complete of identifiers did not work correctly for H2 databases in MySQL mode. H2 Console: auto-complete of identifiers did not work correctly for H2 databases in MySQL mode.
@changelog_1030_li @changelog_1031_li
DISTINCT and GROUP BY on a CLOB column was broken. DISTINCT and GROUP BY on a CLOB column was broken.
@changelog_1031_li @changelog_1032_li
The FTP server moved to the tools section and is no longer included in the h2*.jar file. The FTP server moved to the tools section and is no longer included in the h2*.jar file.
@changelog_1032_li @changelog_1033_li
Improved error message for unsupported features: now the message says what exactly is not supported. Improved error message for unsupported features: now the message says what exactly is not supported.
@changelog_1033_li @changelog_1034_li
Improved OSGi support. Improved OSGi support.
@changelog_1034_li @changelog_1035_li
Some internal caches did not use the LRU mechanism. Fixed (LOB file list, optimizer cost cache, trace system, view indexes, collection keys, compressed in-memory file system). Some internal caches did not use the LRU mechanism. Fixed (LOB file list, optimizer cost cache, trace system, view indexes, collection keys, compressed in-memory file system).
@changelog_1035_li @changelog_1036_li
The API of the tools changed a bit (each tool now returns an exit code). The API of the tools changed a bit (each tool now returns an exit code).
@changelog_1036_li @changelog_1037_li
Command line help of the tools now match the javadocs. The build converts the javadocs to a resource that is read by the tool at runtime. This should not have an effect on using the database, but it reduces duplicate and out-of-sync documentation. Command line help of the tools now match the javadocs. The build converts the javadocs to a resource that is read by the tool at runtime. This should not have an effect on using the database, but it reduces duplicate and out-of-sync documentation.
@changelog_1037_li @changelog_1038_li
CREATE TABLE: improved compatibility (support for UNIQUE NOT NULL). CREATE TABLE: improved compatibility (support for UNIQUE NOT NULL).
@changelog_1038_li @changelog_1039_li
DatabaseMetaData.getSQLKeywords now returns the correct list. DatabaseMetaData.getSQLKeywords now returns the correct list.
@changelog_1039_li @changelog_1040_li
Deterministic user defined functions did not work when the parameter was a column. Fixed. Deterministic user defined functions did not work when the parameter was a column. Fixed.
@changelog_1040_li @changelog_1041_li
JdbcConnectionPool.setLoginTimeout with 0 now uses the default timeout. JdbcConnectionPool.setLoginTimeout with 0 now uses the default timeout.
@changelog_1041_li @changelog_1042_li
Creating a JdbcConnectionPool has been simplified a bit. Creating a JdbcConnectionPool has been simplified a bit.
@changelog_1042_li @changelog_1043_li
The built-in connection pool did not re-use connections. Getting a connection using the built-in JdbcConnectionPool is now about 70 times faster than opening connections using DriverManager.getConnection. The built-in connection pool did not re-use connections. Getting a connection using the built-in JdbcConnectionPool is now about 70 times faster than opening connections using DriverManager.getConnection.
@changelog_1043_li @changelog_1044_li
More bugs in the server-less multi-connection mode have been fixed: If a process terminated while writing, other open connections were blocked. If two processes were writing to the database, sometimes the database was corrupt after closing. More bugs in the server-less multi-connection mode have been fixed: If a process terminated while writing, other open connections were blocked. If two processes were writing to the database, sometimes the database was corrupt after closing.
@changelog_1044_li @changelog_1045_li
Linked tables to SQLite database can now be created. Linked tables to SQLite database can now be created.
@changelog_1045_li @changelog_1046_li
Nested IN(IN(...)) didn't work. Nested IN(IN(...)) didn't work.
@changelog_1046_li @changelog_1047_li
NIO storage: the nio: prefix was using memory mapped files instead of FileChannel. NIO storage: the nio: prefix was using memory mapped files instead of FileChannel.
@changelog_1047_h2 @changelog_1048_h2
Version 1.1.109 (2009-03-14) Version 1.1.109 (2009-03-14)
@changelog_1048_li @changelog_1049_li
The optimization for IN(...) is now only used if comparing a column with an index. The optimization for IN(...) is now only used if comparing a column with an index.
@changelog_1049_li @changelog_1050_li
User defined functions can now be deterministic (see CREATE ALIAS documentation). User defined functions can now be deterministic (see CREATE ALIAS documentation).
@changelog_1050_li @changelog_1051_li
Multiple nested queries in the FROM clause with parameters did not always work. Multiple nested queries in the FROM clause with parameters did not always work.
@changelog_1051_li @changelog_1052_li
When converting CLOB to BINARY, each character resulted in one byte. Now, the text is parsed as a hex as when converting VARCHAR. When converting CLOB to BINARY, each character resulted in one byte. Now, the text is parsed as a hex as when converting VARCHAR.
@changelog_1052_li @changelog_1053_li
New experimental NIO storage mechanism with both FileChannel and memory mapped files. To use it, use the file name prefix nio: or nioMapped: as in jdbc:h2:nio:~/test. So far it looks like NIO storage is faster on Mac OS but slower on some Windows systems. Thanks a lot to Jan Kotek for the patch! New experimental NIO storage mechanism with both FileChannel and memory mapped files. To use it, use the file name prefix nio: or nioMapped: as in jdbc:h2:nio:~/test. So far it looks like NIO storage is faster on Mac OS but slower on some Windows systems. Thanks a lot to Jan Kotek for the patch!
@changelog_1053_li @changelog_1054_li
The functions BITOR, BITAND, BITXOR, and MOD now accept and return BIGINT instead of INT. The functions BITOR, BITAND, BITXOR, and MOD now accept and return BIGINT instead of INT.
@changelog_1054_li @changelog_1055_li
Could not use the same linked table multiple times in the same query. Could not use the same linked table multiple times in the same query.
@changelog_1055_li @changelog_1056_li
Bugs in the server-less multi-connection mode have been fixed. Bugs in the server-less multi-connection mode have been fixed.
@changelog_1056_li @changelog_1057_li
Column names could not be named "UNIQUE" (with the quotes). Column names could not be named "UNIQUE" (with the quotes).
@changelog_1057_li @changelog_1058_li
New system function TRANSACTION_ID() to get the current transaction identifier for a session. New system function TRANSACTION_ID() to get the current transaction identifier for a session.
@changelog_1058_h2 @changelog_1059_h2
Version 1.1.108 (2009-02-28) Version 1.1.108 (2009-02-28)
@changelog_1059_li @changelog_1060_li
When the shutdown hook closed the database, the last log file was deleted too early. This could cause uncommitted changes to be persisted. In some cases, this could cause data corruption. When the shutdown hook closed the database, the last log file was deleted too early. This could cause uncommitted changes to be persisted. In some cases, this could cause data corruption.
@changelog_1060_li @changelog_1061_li
JdbcConnectionPool: it was possible to set a negative connection pool size. JdbcConnectionPool: it was possible to set a negative connection pool size.
@changelog_1061_li @changelog_1062_li
Fulltext search did not support table names with a backslash. Fulltext search did not support table names with a backslash.
@changelog_1062_li @changelog_1063_li
The internal IntArray class did not work correctly when initialized with a zero length array. The internal IntArray class did not work correctly when initialized with a zero length array.
@changelog_1063_li @changelog_1064_li
The H2 Console web application (war file) did only support ASCII characters. Now UTF-8 is supported. The H2 Console web application (war file) did only support ASCII characters. Now UTF-8 is supported.
@changelog_1064_li @changelog_1065_li
DATEADD does no longer require that the argument is a timestamp. DATEADD does no longer require that the argument is a timestamp.
@changelog_1065_li @changelog_1066_li
The database file locking mechanism didn't work correctly on Mac OS. The database file locking mechanism didn't work correctly on Mac OS.
@changelog_1066_li @changelog_1067_li
Some built-in functions reported the wrong precision, scale, and display size. Some built-in functions reported the wrong precision, scale, and display size.
@changelog_1067_li @changelog_1068_li
MySQL compatibility for CREATE TABLE is improved (UNSIGNED, KEY). MySQL compatibility for CREATE TABLE is improved (UNSIGNED, KEY).
@changelog_1068_li @changelog_1069_li
Recovery did not work if there were more than 255 lobs stored as files. Recovery did not work if there were more than 255 lobs stored as files.
@changelog_1069_li @changelog_1070_li
New experimental mode to support multiple read-write connections without starting a server. To enable this mode, append ;FILE_LOCK=SERIALIZED;OPEN_NEW=TRUE to the database URL. Don't expect high performance when multiple concurrent writers. New experimental mode to support multiple read-write connections without starting a server. To enable this mode, append ;FILE_LOCK=SERIALIZED;OPEN_NEW=TRUE to the database URL. Don't expect high performance when multiple concurrent writers.
@changelog_1070_li @changelog_1071_li
In a web application, the database classes are not unloaded if a connection is open. This may cause out of memory when re-deploying a web application. The DbStarter is changed to close all connections to the configured database (by executing SHUTDOWN). In a web application, the database classes are not unloaded if a connection is open. This may cause out of memory when re-deploying a web application. The DbStarter is changed to close all connections to the configured database (by executing SHUTDOWN).
@changelog_1071_li @changelog_1072_li
The WebServlet did not close the database when un-deploying the web application. The WebServlet did not close the database when un-deploying the web application.
@changelog_1072_li @changelog_1073_li
The exception message of failed INSERT or MERGE statements now includes all values and the row number. The exception message of failed INSERT or MERGE statements now includes all values and the row number.
@changelog_1073_li @changelog_1074_li
If opening a database failed with an out of memory exception, some files were not closed. If opening a database failed with an out of memory exception, some files were not closed.
@changelog_1074_li @changelog_1075_li
Optimizer: the expected runtime calculation was incorrect. The fixed calculation should give slightly better query plans when using many joins. Optimizer: the expected runtime calculation was incorrect. The fixed calculation should give slightly better query plans when using many joins.
@changelog_1075_li @changelog_1076_li
Improved exception message when connecting to a just started server fails. Improved exception message when connecting to a just started server fails.
@changelog_1076_li @changelog_1077_li
Connection.isValid is a bit faster. Connection.isValid is a bit faster.
@changelog_1077_li @changelog_1078_li
H2 Console: The autocomplete feature has been improved a bit. It can now better parse conditions. H2 Console: The autocomplete feature has been improved a bit. It can now better parse conditions.
@changelog_1078_li @changelog_1079_li
When restarting a web application in Tomcat, an exception was thrown sometimes. In most cases this was a NullPointerException. A workaround in H2 has been implemented. The root cause of the problem is now documented in the FAQ: Tomcat sets all static fields (final or non-final) to null when unloading a web application. A workaround is to put the h2.jar in the lib directory, or set the system property org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES to false. When restarting a web application in Tomcat, an exception was thrown sometimes. In most cases this was a NullPointerException. A workaround in H2 has been implemented. The root cause of the problem is now documented in the FAQ: Tomcat sets all static fields (final or non-final) to null when unloading a web application. A workaround is to put the h2.jar in the lib directory, or set the system property org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES to false.
@changelog_1079_h2 @changelog_1080_h2
Version 1.1.107 (2009-01-24) Version 1.1.107 (2009-01-24)
@changelog_1080_li @changelog_1081_li
Some DatabaseMetaData operations did not work for non-admin users for versions 1.1.x. Some DatabaseMetaData operations did not work for non-admin users for versions 1.1.x.
@changelog_1081_li @changelog_1082_li
The MySQL compatibility extension fromUnixTime now used the English locale. The MySQL compatibility extension fromUnixTime now used the English locale.
@changelog_1082_li @changelog_1083_li
When using LOG=2 and repeatedly updating the last row rows of a table, the index file grew quickly. When using LOG=2 and repeatedly updating the last row rows of a table, the index file grew quickly.
@changelog_1083_li @changelog_1084_li
In versions 1.1.105 and 1.1.106, encrypted script files of earlier versions could not be processed. This is now again possible. The problem was that such script files were stored in a special format (STORAGE=TEXT) but support for this format was removed in version 1.1.105. In versions 1.1.105 and 1.1.106, encrypted script files of earlier versions could not be processed. This is now again possible. The problem was that such script files were stored in a special format (STORAGE=TEXT) but support for this format was removed in version 1.1.105.
@changelog_1084_li @changelog_1085_li
Enabling the trace mechanism by creating a specially named file is no longer supported. Enabling the trace mechanism by creating a specially named file is no longer supported.
@changelog_1085_h2 @changelog_1086_h2
Version 1.1.106 (2009-01-04) Version 1.1.106 (2009-01-04)
@changelog_1086_li @changelog_1087_li
Statement.setQueryTimeout did not work correctly for some statements. Statement.setQueryTimeout did not work correctly for some statements.
@changelog_1087_li @changelog_1088_li
CREATE DOMAIN: Built-in data types can now only be changed if no tables exist. CREATE DOMAIN: Built-in data types can now only be changed if no tables exist.
@changelog_1088_li @changelog_1089_li
Linked tables: a workaround for Oracle DATE columns has been implemented. Linked tables: a workaround for Oracle DATE columns has been implemented.
@changelog_1089_li @changelog_1090_li
DatabaseMetaData.getPrimaryKeys: The column PK_NAME now contains the constraint name instead of the index name (compatibility for PostgreSQL and Derby). DatabaseMetaData.getPrimaryKeys: The column PK_NAME now contains the constraint name instead of the index name (compatibility for PostgreSQL and Derby).
@changelog_1090_li @changelog_1091_li
Using IN(..) inside a IN(SELECT..) did not always work. Using IN(..) inside a IN(SELECT..) did not always work.
@changelog_1091_li @changelog_1092_li
Views with IN(..) that used a view itself did not work. Views with IN(..) that used a view itself did not work.
@changelog_1092_li @changelog_1093_li
Union queries with LIMIT or ORDER BY that are used in a view or subquery did not work. Union queries with LIMIT or ORDER BY that are used in a view or subquery did not work.
@changelog_1093_li @changelog_1094_li
The license change a bit: so far the license was modified to say 'Swiss law'. This is now changed back to the original 'US law'. This was requested by a user, and I don't see a problem. The license change a bit: so far the license was modified to say 'Swiss law'. This is now changed back to the original 'US law'. This was requested by a user, and I don't see a problem.
@changelog_1094_li @changelog_1095_li
Constraints for local temporary tables now session scoped. So far they were global. Thanks a lot to Eric Faulhaber for finding and fixing this problem! Constraints for local temporary tables now session scoped. So far they were global. Thanks a lot to Eric Faulhaber for finding and fixing this problem!
@changelog_1095_li @changelog_1096_li
When using the auto-server mode, and if the lock file was modified in the future, the wrong exception was thrown ('Connection is broken' instead of 'Error opening database: Lock file modified in the future'). When using the auto-server mode, and if the lock file was modified in the future, the wrong exception was thrown ('Connection is broken' instead of 'Error opening database: Lock file modified in the future').
@changelog_1096_h2 @changelog_1097_h2
Version 1.1.105 (2008-12-19) Version 1.1.105 (2008-12-19)
@changelog_1097_li @changelog_1098_li
The setting STORAGE=TEXT is no longer supported. The setting STORAGE=TEXT is no longer supported.
@changelog_1098_li @changelog_1099_li
Deleting a database using the tool DeleteDbFiles deleted LOB files of other databases in the same directory. Deleting a database using the tool DeleteDbFiles deleted LOB files of other databases in the same directory.
@changelog_1099_li @changelog_1100_li
When used in a subquery, LIKE and IN(..) did not work correctly sometimes. When used in a subquery, LIKE and IN(..) did not work correctly sometimes.
@changelog_1100_li @changelog_1101_li
The fulltext search documentation has been improved. The fulltext search documentation has been improved.
@changelog_1101_li @changelog_1102_li
ARRAY_GET returned the wrong data type (ARRAY). Now it returns VARCHAR. ARRAY_GET returned the wrong data type (ARRAY). Now it returns VARCHAR.
@changelog_1102_li @changelog_1103_li
Natural join: the joined columns are not repeated any more when using SELECT *. Natural join: the joined columns are not repeated any more when using SELECT *.
@changelog_1103_li @changelog_1104_li
User defined aggregate functions: the method getType expected internal data types instead of SQL types. User defined aggregate functions: the method getType expected internal data types instead of SQL types.
@changelog_1104_li @changelog_1105_li
User defined aggregate functions did not work if there was no group by expression. User defined aggregate functions did not work if there was no group by expression.
@changelog_1105_li @changelog_1106_li
MySQL compatibility: support for := assignment as in @sum:=@sum+x MySQL compatibility: support for := assignment as in @sum:=@sum+x
@changelog_1106_li @changelog_1107_li
INSERT INTO TEST(SELECT * FROM TEST) is now supported. INSERT INTO TEST(SELECT * FROM TEST) is now supported.
@changelog_1107_li @changelog_1108_li
Each session threw an invisible exception when garbage collected. Each session threw an invisible exception when garbage collected.
@changelog_1108_li @changelog_1109_li
Foreign key constraints that refer to a quoted column did not work. Foreign key constraints that refer to a quoted column did not work.
@changelog_1109_li @changelog_1110_li
New meta data column INFORMATION_SCHEMA.TABLES.LAST_MODIFICATION to get the table modification counter. New meta data column INFORMATION_SCHEMA.TABLES.LAST_MODIFICATION to get the table modification counter.
@changelog_1110_li @changelog_1111_li
Shell: line comments didn't work correctly. Shell: line comments didn't work correctly.
@changelog_1111_li @changelog_1112_li
H2 Console: Columns are now listed for up to 500 tables instead of 100. H2 Console: Columns are now listed for up to 500 tables instead of 100.
@changelog_1112_li @changelog_1113_li
H2 Console: Cmd+Enter executes the current statement, Alt+Space for autocomplete. H2 Console: Cmd+Enter executes the current statement, Alt+Space for autocomplete.
@changelog_1113_li @changelog_1114_li
JaQu: the maximum length of a column can now be defined using maxLength. For an example, see Product.java (maxLength(category, 255)). JaQu: the maximum length of a column can now be defined using maxLength. For an example, see Product.java (maxLength(category, 255)).
@changelog_1114_li @changelog_1115_li
R&\#305;dvan A&\#287;ar has completed the Turkish translation of the H2 Console. Thanks a lot! R&\#305;dvan A&\#287;ar has completed the Turkish translation of the H2 Console. Thanks a lot!
@changelog_1115_h2 @changelog_1116_h2
Version 1.1.104 (2008-11-28) Version 1.1.104 (2008-11-28)
@changelog_1116_li @changelog_1117_li
If a query that was used like a table contained group by and was ordered by an expression that is not in the column list, an exception was thrown. If a query that was used like a table contained group by and was ordered by an expression that is not in the column list, an exception was thrown.
@changelog_1117_li @changelog_1118_li
JaQu: tables are now auto-created when running a query. JaQu: tables are now auto-created when running a query.
@changelog_1118_li @changelog_1119_li
The optimizer had problems with function tables (for example CSVREAD and FTL_SEARCH). A new system property h2.estimatedFunctionTableRows (default 1000) defines how many rows can be expected in the table. The optimizer had problems with function tables (for example CSVREAD and FTL_SEARCH). A new system property h2.estimatedFunctionTableRows (default 1000) defines how many rows can be expected in the table.
@changelog_1119_li @changelog_1120_li
The function SUM could overflow when using large values. It returns now a data type that is safe. The function SUM could overflow when using large values. It returns now a data type that is safe.
@changelog_1120_li @changelog_1121_li
The function AVG could overflow when using large values. Fixed. The function AVG could overflow when using large values. Fixed.
@changelog_1121_li @changelog_1122_li
The emergency reserve file has been removed. It didn't provide an appropriate solution for the problem. It is still possible for an application to detect and deal with the low disk space problem (deleting temporary files for example) using DatabaseEventListener.diskSpaceIsLow, but this method is now always called with stillAvailable=0. The emergency reserve file has been removed. It didn't provide an appropriate solution for the problem. It is still possible for an application to detect and deal with the low disk space problem (deleting temporary files for example) using DatabaseEventListener.diskSpaceIsLow, but this method is now always called with stillAvailable=0.
@changelog_1122_li @changelog_1123_li
Build: JAVA_HOME is now automatically detected on Mac OS X. Build: JAVA_HOME is now automatically detected on Mac OS X.
@changelog_1123_li @changelog_1124_li
Testing for local connections was very slow on some systems. Testing for local connections was very slow on some systems.
@changelog_1124_li @changelog_1125_li
The cache memory usage calculation is more conservative. The cache memory usage calculation is more conservative.
@changelog_1125_li @changelog_1126_li
Allocating space got slower and slower the larger the database. Allocating space got slower and slower the larger the database.
@changelog_1126_li @changelog_1127_li
ALTER TABLE ALTER COLUMN could throw the wrong exception in the last version (Table not found). ALTER TABLE ALTER COLUMN could throw the wrong exception in the last version (Table not found).
@changelog_1127_li @changelog_1128_li
Updatable result sets: the key columns can now be updated. Updatable result sets: the key columns can now be updated.
@changelog_1128_li @changelog_1129_li
The H2DatabaseProvider for ActiveObjects is now included in the tools section. The H2DatabaseProvider for ActiveObjects is now included in the tools section.
@changelog_1129_li @changelog_1130_li
The H2Platform for Oracle Toplink Essential has been improved a bit. The H2Platform for Oracle Toplink Essential has been improved a bit.
@changelog_1130_li @changelog_1131_li
The Windows service to start H2 didn't work in version 1.1. The Windows service to start H2 didn't work in version 1.1.
@changelog_1131_li @changelog_1132_li
File systems with a maximum file size (for example FAT) are now supported using the file prefix 'split:'. In this case the files are split in parts of 1 GB. Example URL: jdbc:h2:split:~/db/test. If you want to split into parts of 1 MB, use jdbc:h2:split:20:~/db/test (the part size is 1 &lt;&lt; x, the default is 30 meaning 1 GB). File systems with a maximum file size (for example FAT) are now supported using the file prefix 'split:'. In this case the files are split in parts of 1 GB. Example URL: jdbc:h2:split:~/db/test. If you want to split into parts of 1 MB, use jdbc:h2:split:20:~/db/test (the part size is 1 &lt;&lt; x, the default is 30 meaning 1 GB).
@changelog_1132_li @changelog_1133_li
The database now tries to detect if the classloader or virtual machine has almost shut down by checking if static final variables are set to null. This should help reduce exceptions when stopping the web application. The database now tries to detect if the classloader or virtual machine has almost shut down by checking if static final variables are set to null. This should help reduce exceptions when stopping the web application.
@changelog_1133_li @changelog_1134_li
Compatibility for MS SQL Server DATEDIFF(YYYY, .., ..) Compatibility for MS SQL Server DATEDIFF(YYYY, .., ..)
@changelog_1134_li @changelog_1135_li
ResultSet.getObject for CLOB or BLOB will return a java.sql.Clob / java.sql.Blob object instead of a java.io.Reader / java.io.InputStream as in version 1.0. This behavior can be changed using the system property h2.returnLobObjects (true by default for version 1.1). ResultSet.getObject for CLOB or BLOB will return a java.sql.Clob / java.sql.Blob object instead of a java.io.Reader / java.io.InputStream as in version 1.0. This behavior can be changed using the system property h2.returnLobObjects (true by default for version 1.1).
@changelog_1135_li @changelog_1136_li
The interface CloseListener has a new method 'remove' that is called when the trigger is dropped. The interface CloseListener has a new method 'remove' that is called when the trigger is dropped.
@changelog_1136_li @changelog_1137_li
Fulltext search: there was a memory leak when creating and dropping fulltext indexes in a loop. Fulltext search: there was a memory leak when creating and dropping fulltext indexes in a loop.
@changelog_1137_h2 @changelog_1138_h2
Version 1.1.103 (2008-11-07) Version 1.1.103 (2008-11-07)
@changelog_1138_li @changelog_1139_li
Could not order by a formula when the formula was in the group by list but not in the select list. Could not order by a formula when the formula was in the group by list but not in the select list.
@changelog_1139_li @changelog_1140_li
Date values that match the daylight saving time end were not allowed in times zones were the daylight saving time ends at midnight, for years larger than 2037. Example: timezone Brasilia, date 2042-10-12. This is a problem of Java, however a workaround is implemented in H2 that solves most problems (except the problems of java.util.Date itself). Date values that match the daylight saving time end were not allowed in times zones were the daylight saving time ends at midnight, for years larger than 2037. Example: timezone Brasilia, date 2042-10-12. This is a problem of Java, however a workaround is implemented in H2 that solves most problems (except the problems of java.util.Date itself).
@changelog_1140_li @changelog_1141_li
ALTER TABLE used a lot of memory when using multi-version concurrency. ALTER TABLE used a lot of memory when using multi-version concurrency.
@changelog_1141_li @changelog_1142_li
Referential integrity for in-memory databases didn't work in some cases in version 1.1.102. Referential integrity for in-memory databases didn't work in some cases in version 1.1.102.
@changelog_1142_li @changelog_1143_li
New column INFORMATION_SCHEMA.COLUMNS.SEQUENCE_NAME to get the name of the sequence for auto-increment columns. New column INFORMATION_SCHEMA.COLUMNS.SEQUENCE_NAME to get the name of the sequence for auto-increment columns.
@changelog_1143_li @changelog_1144_li
Aliases for built-in data types (such as MEDIUMBLOB which is an alias for BLOB) can now be re-mapped to another data type using CREATE DOMAIN. However main built-in data types (such as INTEGER) can not be re-mapped. Aliases for built-in data types (such as MEDIUMBLOB which is an alias for BLOB) can now be re-mapped to another data type using CREATE DOMAIN. However main built-in data types (such as INTEGER) can not be re-mapped.
@changelog_1144_li @changelog_1145_li
The Japanese translation has been completed by Masahiro Ikemoto. Thanks a lot! The Japanese translation has been completed by Masahiro Ikemoto. Thanks a lot!
@changelog_1145_li @changelog_1146_li
Improved PostgreSQL compatibility for NEXTVAL and CURRVAL. Improved PostgreSQL compatibility for NEXTVAL and CURRVAL.
@changelog_1146_li @changelog_1147_li
Less heap memory is needed when multiple databases are open at the same time: The memory reserve (used to rollback after out of memory) is now global and no longer allocated for each database separately. Less heap memory is needed when multiple databases are open at the same time: The memory reserve (used to rollback after out of memory) is now global and no longer allocated for each database separately.
@changelog_1147_li @changelog_1148_li
New system property h2.browser to set the browser to use. New system property h2.browser to set the browser to use.
@changelog_1148_li @changelog_1149_li
To start the browser, java.awt.Desktop.browse is now used if available. To start the browser, java.awt.Desktop.browse is now used if available.
@changelog_1149_h2 @changelog_1150_h2
Version 1.1.102 (2008-10-24) Version 1.1.102 (2008-10-24)
@changelog_1150_li @changelog_1151_li
The French translation of the H2 Console has been improved by Olivier Parent. Thanks a lot! The French translation of the H2 Console has been improved by Olivier Parent. Thanks a lot!
@changelog_1151_li @changelog_1152_li
There was a memory leak when creating and dropping tables and indexes in a loop (persistent database only). There was a memory leak when creating and dropping tables and indexes in a loop (persistent database only).
@changelog_1152_li @changelog_1153_li
SET LOG 2 was not effective if executed after opening the database. SET LOG 2 was not effective if executed after opening the database.
@changelog_1153_li @changelog_1154_li
Translating the H2 Console is now simpler. Translating the H2 Console is now simpler.
@changelog_1154_li @changelog_1155_li
Common exception (error code 23*) are no longer written to the .trace.db file by default. Common exception (error code 23*) are no longer written to the .trace.db file by default.
@changelog_1155_li @changelog_1156_li
In-memory databases don't write LOBs to files any longer. In-memory databases don't write LOBs to files any longer.
@changelog_1156_li @changelog_1157_li
Self referencing constraints didn't restrict deleting rows that reference itself if there is another row that references it. Self referencing constraints didn't restrict deleting rows that reference itself if there is another row that references it.
@changelog_1157_li @changelog_1158_li
ResultSetMetaData.getColumnName now returns the alias name except for columns. ResultSetMetaData.getColumnName now returns the alias name except for columns.
@changelog_1158_li @changelog_1159_li
Temporary files are now deleted when the database is closed, even if they were not garbage collected so far. Temporary files are now deleted when the database is closed, even if they were not garbage collected so far.
@changelog_1159_h2 @changelog_1160_h2
Version 1.1.101 (2008-10-17) Version 1.1.101 (2008-10-17)
@changelog_1160_li @changelog_1161_li
Errors with code 42000 - 42999 are no longer written to the trace file by default. Errors with code 42000 - 42999 are no longer written to the trace file by default.
@changelog_1161_li @changelog_1162_li
Queries with more than 10 tables are now faster. Queries with more than 10 tables are now faster.
@changelog_1162_li @changelog_1163_li
Opening a connection with AUTO_SERVER=TRUE is now fast when the database is already open in another process (less than 0.01 seconds instead of 2 seconds). Opening a connection with AUTO_SERVER=TRUE is now fast when the database is already open in another process (less than 0.01 seconds instead of 2 seconds).
@changelog_1163_li @changelog_1164_li
IF [NOT] EXISTS is supported for named constraints in ALTER TABLE ... ADD/DROP CONSTRAINT. IF [NOT] EXISTS is supported for named constraints in ALTER TABLE ... ADD/DROP CONSTRAINT.
@changelog_1164_li @changelog_1165_li
The error messages have been translated to Spanish by Dario V. Fassi. Thanks a lot! The error messages have been translated to Spanish by Dario V. Fassi. Thanks a lot!
@changelog_1165_li @changelog_1166_li
Linked tables: the automatic connection sharing didn't work. Actually the system property h2.shareLinkedConnections was working in the opposite direction: it was disabled when set to true. Now it works as expected. Linked tables: the automatic connection sharing didn't work. Actually the system property h2.shareLinkedConnections was working in the opposite direction: it was disabled when set to true. Now it works as expected.
@changelog_1166_li @changelog_1167_li
Opening large database is now faster. Opening large database is now faster.
@changelog_1167_li @changelog_1168_li
New system property h2.socketConnectTimeout, the timeout in milliseconds to connect to a server. The default is 2000 (2 seconds). New system property h2.socketConnectTimeout, the timeout in milliseconds to connect to a server. The default is 2000 (2 seconds).
@changelog_1168_li @changelog_1169_li
The wrong parameters were bound to subqueries with parameters, specially when using IN(SELECT ...) and IN(...). The wrong parameters were bound to subqueries with parameters, specially when using IN(SELECT ...) and IN(...).
@changelog_1169_li @changelog_1170_li
Unset parameters were not detected when the query was re-compiled. Unset parameters were not detected when the query was re-compiled.
@changelog_1170_li @changelog_1171_li
New functions ISO_YEAR, ISO_WEEK, ISO_DAY_OF_WEEK. Thanks a lot to Robert Rathsack for implementing those! New functions ISO_YEAR, ISO_WEEK, ISO_DAY_OF_WEEK. Thanks a lot to Robert Rathsack for implementing those!
@changelog_1171_li @changelog_1172_li
The date functions DAYOFYEAR, DAYOFMONTH, DAYOFWEEK are now called DAY_OF_YEAR, DAY_OF_MONTH, DAY_OF_WEEK (the old names still work). The date functions DAYOFYEAR, DAYOFMONTH, DAYOFWEEK are now called DAY_OF_YEAR, DAY_OF_MONTH, DAY_OF_WEEK (the old names still work).
@changelog_1172_li @changelog_1173_li
An out of memory error while deleting or updating many rows could result in a strange exception. An out of memory error while deleting or updating many rows could result in a strange exception.
@changelog_1173_li @changelog_1174_li
Linked tables: compatibility with MS SQL Server has been improved. Linked tables: compatibility with MS SQL Server has been improved.
@changelog_1174_li @changelog_1175_li
Renaming tables that have foreign keys with cascade didn't work correctly. Renaming tables that have foreign keys with cascade didn't work correctly.
@changelog_1175_li @changelog_1176_li
The auto-reconnect feature didn't work when using the auto-server mode. Fixed. The auto-reconnect feature didn't work when using the auto-server mode. Fixed.
@changelog_1176_li @changelog_1177_li
Fulltext search: new method FT_DROP_INDEX. Fulltext search: new method FT_DROP_INDEX.
@changelog_1177_li @changelog_1178_li
The optimization to group using an index didn't work in some cases in version 1.1 (see also system property h2.optimizeGroupSorted). The optimization to group using an index didn't work in some cases in version 1.1 (see also system property h2.optimizeGroupSorted).
@changelog_1178_li @changelog_1179_li
OSGi meta data is included in the manifest file. An OSGi BundleActivator is included: it loads the database driver when starting the bundle, and unloads it when stopping the bundle. OSGi meta data is included in the manifest file. An OSGi BundleActivator is included: it loads the database driver when starting the bundle, and unloads it when stopping the bundle.
@changelog_1179_li @changelog_1180_li
The default value for MAX_MEMORY_UNDO is now 50000. The default value for MAX_MEMORY_UNDO is now 50000.
@changelog_1180_li @changelog_1181_li
For alias columns, ResultSetMetaData.getTableName() and getColumnName() now return the real table and column name in the default mode. For alias columns, ResultSetMetaData.getTableName() and getColumnName() now return the real table and column name in the default mode.
@changelog_1181_li @changelog_1182_li
In SQL scripts created with SCRIPT TO, schemas are now only created if they don't exist yet. In SQL scripts created with SCRIPT TO, schemas are now only created if they don't exist yet.
@changelog_1182_li @changelog_1183_li
After re-connecting to a database, the database event listener (if set) is informed about it. After re-connecting to a database, the database event listener (if set) is informed about it.
@changelog_1183_li @changelog_1184_li
Local temporary tables now support indexes. Thanks a lot to Matt Roy! Local temporary tables now support indexes. Thanks a lot to Matt Roy!
@changelog_1184_li @changelog_1185_li
RUNSCRIPT no longer uses a temporary file. RUNSCRIPT no longer uses a temporary file.
@changelog_1185_li @changelog_1186_li
New system table INFORMATION_SCHEMA.SESSION_STATE containing the SQL statements that make up the session state. The list currently contains variables (SET @..) and local temporary tables (without data). New system table INFORMATION_SCHEMA.SESSION_STATE containing the SQL statements that make up the session state. The list currently contains variables (SET @..) and local temporary tables (without data).
@changelog_1186_li @changelog_1187_li
After an automatic re-connect, part of the session state stays (the part that is stored in the SESSION_STATE table). After an automatic re-connect, part of the session state stays (the part that is stored in the SESSION_STATE table).
@changelog_1187_li @changelog_1188_li
The build didn't work if the directory temp didn't exist before. The build didn't work if the directory temp didn't exist before.
@changelog_1188_li @changelog_1189_li
New system property h2.maxReconnect (default 3) to limit the number of re-connects for the same SQL statement (this is usually only important for SHUTDOWN). New system property h2.maxReconnect (default 3) to limit the number of re-connects for the same SQL statement (this is usually only important for SHUTDOWN).
@changelog_1189_li @changelog_1190_li
WHERE .. IN (SELECT ...) could throw a NullPointerException. WHERE .. IN (SELECT ...) could throw a NullPointerException.
@changelog_1190_li @changelog_1191_li
Improved Glassfish / Toplink support in H2Platform thanks to Marcio Borges from Brazil. Thanks a lot! Improved Glassfish / Toplink support in H2Platform thanks to Marcio Borges from Brazil. Thanks a lot!
@changelog_1191_h2 @changelog_1192_h2
Version 1.1.100 (2008-10-04) Version 1.1.100 (2008-10-04)
@changelog_1192_li @changelog_1193_li
In version 1.1, the following system properties are now enabled by default: h2.lobFilesInDirectories, h2.optimizeGroupSorted, h2.optimizeInJoin, h2.shareLinkedConnections In version 1.1, the following system properties are now enabled by default: h2.lobFilesInDirectories, h2.optimizeGroupSorted, h2.optimizeInJoin, h2.shareLinkedConnections
@changelog_1193_li @changelog_1194_li
The H2 Console tool now works with the JDBC-ODBC bridge. The H2 Console tool now works with the JDBC-ODBC bridge.
@changelog_1194_li @changelog_1195_li
The H2 Console tool now supports command line options to start things separately. The H2 Console tool now supports command line options to start things separately.
@changelog_1195_li @changelog_1196_li
Large objects did not work for in-memory databases in server mode in Linux. Large objects did not work for in-memory databases in server mode in Linux.
@changelog_1196_li @changelog_1197_li
Connections from a local address other than 'localhost' were not allowed if remote connections were disabled. This was always a problem, but only got visible in the last release because the server no longer connects to 'localhost' if networked. Connections from a local address other than 'localhost' were not allowed if remote connections were disabled. This was always a problem, but only got visible in the last release because the server no longer connects to 'localhost' if networked.
@changelog_1197_li @changelog_1198_li
The h2console.war can now be built using the Java build. The h2console.war can now be built using the Java build.
@changelog_1198_li @changelog_1199_li
By default, databases are shared in the same process. For read-only databases this causes unnecessary synchronization, but safes memory. If you want that each connection opens its own database, append ;OPEN_NEW=TRUE to the database URL. By default, databases are shared in the same process. For read-only databases this causes unnecessary synchronization, but safes memory. If you want that each connection opens its own database, append ;OPEN_NEW=TRUE to the database URL.
@changelog_1199_li @changelog_1200_li
New auto-reconnect feature will cause the JDBC driver to reconnect to the database if the connection is lost. To enable, append ;AUTO_RECONNECT=TRUE to the database URL. This is specially helpful when using AUTO_SERVER. AUTO_SERVER automatically uses auto-reconnect. New auto-reconnect feature will cause the JDBC driver to reconnect to the database if the connection is lost. To enable, append ;AUTO_RECONNECT=TRUE to the database URL. This is specially helpful when using AUTO_SERVER. AUTO_SERVER automatically uses auto-reconnect.
@changelog_1200_li @changelog_1201_li
CreateCluster: the property 'serverlist' is now called 'serverList'. CreateCluster: the property 'serverlist' is now called 'serverList'.
@changelog_1201_li @changelog_1202_li
The ConvertTraceFile tool could not parse some files because the trace mechanism did not encode prepared statement parameters. The ConvertTraceFile tool could not parse some files because the trace mechanism did not encode prepared statement parameters.
@changelog_1202_li @changelog_1203_li
Databases names can now be one character long (the minimum size used to be 2 characters). Databases names can now be one character long (the minimum size used to be 2 characters).
@changelog_1203_h2 @changelog_1204_h2
Version 1.0.79 (2008-09-26) Version 1.0.79 (2008-09-26)
@changelog_1204_li @changelog_1205_li
Linked tables that point to the same database can now share the connection within the same database. Access to the same connection is serialized. To enable this feature, set the system property h2.shareLinkedConnections to true. Linked tables that point to the same database can now share the connection within the same database. Access to the same connection is serialized. To enable this feature, set the system property h2.shareLinkedConnections to true.
@changelog_1205_li @changelog_1206_li
Multiple processes can now access the same database without having to explicitly start the server. To do that, append ;AUTO_SERVER=TRUE to the database URL. In this case, the server is started automatically if the connection is in embedded mode, and the server mode is used if a server is running. If the process that opened the first connection is closed, the other client need to reconnect (there is no automatic re-connect so far). Remote connections are allowed, but only to this database. Multiple processes can now access the same database without having to explicitly start the server. To do that, append ;AUTO_SERVER=TRUE to the database URL. In this case, the server is started automatically if the connection is in embedded mode, and the server mode is used if a server is running. If the process that opened the first connection is closed, the other client need to reconnect (there is no automatic re-connect so far). Remote connections are allowed, but only to this database.
@changelog_1206_li @changelog_1207_li
The server tool now displays the correct IP address if networked. The server tool now displays the correct IP address if networked.
@changelog_1207_li @changelog_1208_li
Can now start a TCP server with port 0 (automatically select a port). Can now start a TCP server with port 0 (automatically select a port).
@changelog_1208_li @changelog_1209_li
Result sets with just a unique index can now be updated (previously a primary key was required). Result sets with just a unique index can now be updated (previously a primary key was required).
@changelog_1209_li @changelog_1210_li
LINKED TABLE: the schema name can now be set. When multiple tables exist in different schema, and the schema name is not set, an exception is thrown. LINKED TABLE: the schema name can now be set. When multiple tables exist in different schema, and the schema name is not set, an exception is thrown.
@changelog_1210_li @changelog_1211_li
LINKED TABLE: worked around a bug in Oracle with the CHAR data type. LINKED TABLE: worked around a bug in Oracle with the CHAR data type.
@changelog_1211_li @changelog_1212_li
Faster hash code calculation for large binary arrays. Faster hash code calculation for large binary arrays.
@changelog_1212_li @changelog_1213_li
Faster storage re-use algorithm thanks to Greg Dhuse from cleversafe.com. Faster storage re-use algorithm thanks to Greg Dhuse from cleversafe.com.
@changelog_1213_li @changelog_1214_li
The database supports the SHOW command for better MySQL and PostgreSQL compatibility. The database supports the SHOW command for better MySQL and PostgreSQL compatibility.
@changelog_1214_li @changelog_1215_li
The H2 Console now abbreviates large texts in results. The H2 Console now abbreviates large texts in results.
@changelog_1215_li @changelog_1216_li
Multiple UNION queries could not be used in derived tables. Multiple UNION queries could not be used in derived tables.
@changelog_1216_li @changelog_1217_li
Linked tables can now be read-only. Linked tables can now be read-only.
@changelog_1217_li @changelog_1218_li
Temporary linked tables are now supported. Temporary linked tables are now supported.
@changelog_1218_li @changelog_1219_li
It was possible to create tables in read-only databases. It was possible to create tables in read-only databases.
@changelog_1219_li @changelog_1220_li
SET SCHEMA_SEARCH_PATH is now documented. SET SCHEMA_SEARCH_PATH is now documented.
@changelog_1220_li @changelog_1221_li
SET SCHEMA did not work for views. SET SCHEMA did not work for views.
@changelog_1221_li @changelog_1222_li
Row level locking for MVCC is now enabled. The exception 'Concurrent update in table ...' is still thrown, but only after the lock timeout. Row level locking for MVCC is now enabled. The exception 'Concurrent update in table ...' is still thrown, but only after the lock timeout.
@changelog_1222_li @changelog_1223_li
The maximum log file size setting was ignored for large databases. The maximum log file size setting was ignored for large databases.
@changelog_1223_li @changelog_1224_li
Multi-Version Concurrency (MVCC) may no longer be used when using the multi-threaded kernel feature (MULTI_THREADED). An exception is thrown when trying to connect with both settings. Additional synchronization is required before those features can be used together. Multi-Version Concurrency (MVCC) may no longer be used when using the multi-threaded kernel feature (MULTI_THREADED). An exception is thrown when trying to connect with both settings. Additional synchronization is required before those features can be used together.
@changelog_1224_li @changelog_1225_li
The data type JAVA_OBJECT could not be used in updatable result sets. The data type JAVA_OBJECT could not be used in updatable result sets.
@changelog_1225_li @changelog_1226_li
The system property h2.optimizeInJoin did not work correctly. The system property h2.optimizeInJoin did not work correctly.
@changelog_1226_li @changelog_1227_li
Conditions such as ID=? AND ID>? were slow. Conditions such as ID=? AND ID>? were slow.
@changelog_1227_h2 @changelog_1228_h2
Version 1.0.78 (2008-08-28) Version 1.0.78 (2008-08-28)
@changelog_1228_li @changelog_1229_li
The documentation no longer uses a frameset (except the Javadocs). The documentation no longer uses a frameset (except the Javadocs).
@changelog_1229_li @changelog_1230_li
When using DB_CLOSE_DELAY, sometimes a NullPointerException is thrown when the database is opened almost at the same time as it is closed automatically. Thanks a lot to Dmitry Pekar for finding this! When using DB_CLOSE_DELAY, sometimes a NullPointerException is thrown when the database is opened almost at the same time as it is closed automatically. Thanks a lot to Dmitry Pekar for finding this!
@changelog_1230_li @changelog_1231_li
Java methods with variable number of parameters can now be used (for Java 1.5 or newer). Java methods with variable number of parameters can now be used (for Java 1.5 or newer).
@changelog_1231_li @changelog_1232_li
The Japanese translation has been improved by Masahiro Ikemoto. Thanks a lot! The Japanese translation has been improved by Masahiro Ikemoto. Thanks a lot!
@changelog_1232_li @changelog_1233_li
The H2 Console replaced an empty user name with a single space. The H2 Console replaced an empty user name with a single space.
@changelog_1233_li @changelog_1234_li
The build target 'build jarSmall' now includes the embedded database. The build target 'build jarSmall' now includes the embedded database.
@changelog_1234_li @changelog_1235_li
JdbcDataSource now keeps the password in a char array where possible. JdbcDataSource now keeps the password in a char array where possible.
@changelog_1235_li @changelog_1236_li
ResultSet.absolute did not always work with large result sets. ResultSet.absolute did not always work with large result sets.
@changelog_1236_li @changelog_1237_li
Column aliases can now be used in GROUP BY and HAVING. Column aliases can now be used in GROUP BY and HAVING.
@changelog_1237_li @changelog_1238_li
Jason Brittain has contributed MySQL date functions. Thanks a lot! They are not in the h2.jar file currently, but in src/tools/org/h2/mode/FunctionsMySQL.java. To install, add this class to the classpath and call FunctionsMySQL.register(conn) in the Java code. Jason Brittain has contributed MySQL date functions. Thanks a lot! They are not in the h2.jar file currently, but in src/tools/org/h2/mode/FunctionsMySQL.java. To install, add this class to the classpath and call FunctionsMySQL.register(conn) in the Java code.
@changelog_1238_h2 @changelog_1239_h2
Version 1.0.77 (2008-08-16) Version 1.0.77 (2008-08-16)
@changelog_1239_li @changelog_1240_li
JaQu is now using prepared statements and supports Date, Time, Timestamp. JaQu is now using prepared statements and supports Date, Time, Timestamp.
@changelog_1240_li @changelog_1241_li
When using remote in-memory databases, large LOB objects did not work. When using remote in-memory databases, large LOB objects did not work.
@changelog_1241_li @changelog_1242_li
Timestamp columns such as TIMESTAMP(6) were not compatible to other database. Timestamp columns such as TIMESTAMP(6) were not compatible to other database.
@changelog_1242_li @changelog_1243_li
Opening a large database was slow if there was a problem opening the previous time. Opening a large database was slow if there was a problem opening the previous time.
@changelog_1243_li @changelog_1244_li
NOT IN(SELECT ...) was incorrect if the subquery returns no rows. NOT IN(SELECT ...) was incorrect if the subquery returns no rows.
@changelog_1244_li @changelog_1245_li
CREATE TABLE AS SELECT did not work correctly in the multi-version concurrency mode. CREATE TABLE AS SELECT did not work correctly in the multi-version concurrency mode.
@changelog_1245_li @changelog_1246_li
Support a comma before closing a list, as in: create table test(id int,) Support a comma before closing a list, as in: create table test(id int,)
@changelog_1246_li @changelog_1247_li
MySQL compatibility: linked tables had lower case column names on some systems. MySQL compatibility: linked tables had lower case column names on some systems.
@changelog_1247_li @changelog_1248_li
DB2 compatibility: the DB2 fetch-first-clause is supported. DB2 compatibility: the DB2 fetch-first-clause is supported.
@changelog_1248_li @changelog_1249_li
Oracle compatibility: old style outer join syntax using (+) did work correctly sometimes. Oracle compatibility: old style outer join syntax using (+) did work correctly sometimes.
@changelog_1249_li @changelog_1250_li
ResultSet.setFetchSize is now supported. ResultSet.setFetchSize is now supported.
@changelog_1250_li @changelog_1251_li
It has been reported that when using Install4j on some Linux systems and enabling the 'pack200' option, the h2.jar becomes corrupted by the install process, causing application failure. A workaround is to add an empty file h2.jar.nopack next to the h2.jar file. The reason for this problem is not known. It has been reported that when using Install4j on some Linux systems and enabling the 'pack200' option, the h2.jar becomes corrupted by the install process, causing application failure. A workaround is to add an empty file h2.jar.nopack next to the h2.jar file. The reason for this problem is not known.
@changelog_1251_h2 @changelog_1252_h2
Version 1.0.76 (2008-07-27) Version 1.0.76 (2008-07-27)
@changelog_1252_li @changelog_1253_li
The comment of a domain (user defined data type) is now used as the default column comment when creating a column with this domain. The comment of a domain (user defined data type) is now used as the default column comment when creating a column with this domain.
@changelog_1253_li @changelog_1254_li
Invalid database names are now detected and a better error message is thrown. Invalid database names are now detected and a better error message is thrown.
@changelog_1254_li @changelog_1255_li
ResultSetMetaData.getColumnClassName now returns the correct class name for BLOB and CLOB. ResultSetMetaData.getColumnClassName now returns the correct class name for BLOB and CLOB.
@changelog_1255_li @changelog_1256_li
Fixed the Oracle mode: Oracle allows multiple rows only where all columns of the unique index are NULL. Fixed the Oracle mode: Oracle allows multiple rows only where all columns of the unique index are NULL.
@changelog_1256_li @changelog_1257_li
There is a problem with Hibernate when using Boolean columns. A patch for Hibernate has been submitted at http://opensource.atlassian.com/projects/hibernate/browse/HHH-3401 There is a problem with Hibernate when using Boolean columns. A patch for Hibernate has been submitted at http://opensource.atlassian.com/projects/hibernate/browse/HHH-3401
@changelog_1257_li @changelog_1258_li
ORDER BY on tableName.columnName didn't work correctly if the column name was also used as an alias. ORDER BY on tableName.columnName didn't work correctly if the column name was also used as an alias.
@changelog_1258_li @changelog_1259_li
H2 Console: The progress display when opening a database has been improved. H2 Console: The progress display when opening a database has been improved.
@changelog_1259_li @changelog_1260_li
The error message when the server doesn't start has been improved. The error message when the server doesn't start has been improved.
@changelog_1260_li @changelog_1261_li
Key values can now be changed in updatable result sets. Key values can now be changed in updatable result sets.
@changelog_1261_li @changelog_1262_li
Changes in updatable result sets are now visible even when resetting the result set. Changes in updatable result sets are now visible even when resetting the result set.
@changelog_1262_li @changelog_1263_li
Temporary files were sometimes deleted too late when executing large insert, update, or delete operations. Temporary files were sometimes deleted too late when executing large insert, update, or delete operations.
@changelog_1263_li @changelog_1264_li
The database file was growing after deleting many rows, and after large update operations. The database file was growing after deleting many rows, and after large update operations.
@changelog_1264_h2 @changelog_1265_h2
Version 1.0.75 (2008-07-14) Version 1.0.75 (2008-07-14)
@changelog_1265_li @changelog_1266_li
Multi version concurrency (MVCC): when a row was updated or deleted, but this change was rolled back, the row was not visible by other sessions if no index was used to access it. Fixed. Multi version concurrency (MVCC): when a row was updated or deleted, but this change was rolled back, the row was not visible by other sessions if no index was used to access it. Fixed.
@changelog_1266_li @changelog_1267_li
Views with multiple joined tables (where one was an outer join) couldn't be used in some cases. Fixed. Views with multiple joined tables (where one was an outer join) couldn't be used in some cases. Fixed.
@changelog_1267_li @changelog_1268_li
The CSVREAD method did not process NULL correctly when using a whitespace field separator. The CSVREAD method did not process NULL correctly when using a whitespace field separator.
@changelog_1268_li @changelog_1269_li
Fixed the Oracle mode: Oracle allows multiple rows with NULL in a unique index. Fixed the Oracle mode: Oracle allows multiple rows with NULL in a unique index.
@changelog_1269_li @changelog_1270_li
Running out of memory could result in incomplete transactions or corrupted databases. Fixed. Running out of memory could result in incomplete transactions or corrupted databases. Fixed.
@changelog_1270_li @changelog_1271_li
When using order by in a query that uses the same table multiple times, the order could be incorrect. Fixed. When using order by in a query that uses the same table multiple times, the order could be incorrect. Fixed.
@changelog_1271_li @changelog_1272_li
Referential constraint checking improvement: now the constraint is only checked if the key column values change. Referential constraint checking improvement: now the constraint is only checked if the key column values change.
@changelog_1272_li @changelog_1273_li
Some database metadata calls returned the wrong data type for DATA_TYPE columns. Some database metadata calls returned the wrong data type for DATA_TYPE columns.
@changelog_1273_li @changelog_1274_li
The Lucene fulltext index was empty when opening a database with fulltext index enabled, and re-indexing it didn't work. Fixed. The Lucene fulltext index was empty when opening a database with fulltext index enabled, and re-indexing it didn't work. Fixed.
@changelog_1274_li @changelog_1275_li
The character '$' could not be used in identifier names (table name, column names and so on). Fixed. The character '$' could not be used in identifier names (table name, column names and so on). Fixed.
@changelog_1275_li @changelog_1276_li
The new method org.h2.tools.Server.startWebServer(conn) starts the H2 Console to inspect a database while debugging. The new method org.h2.tools.Server.startWebServer(conn) starts the H2 Console to inspect a database while debugging.
@changelog_1276_li @changelog_1277_li
Stopping a WebServer didn't always work. Fixed. Stopping a WebServer didn't always work. Fixed.
@changelog_1277_h2 @changelog_1278_h2
Version 1.0.74 (2008-06-21) Version 1.0.74 (2008-06-21)
@changelog_1278_li @changelog_1279_li
Work on row level locking has been started (but there is nothing usable yet). Work on row level locking has been started (but there is nothing usable yet).
@changelog_1279_li @changelog_1280_li
JaQu (Java Query), a tool similar to LINQ (Language Integrated Query; from Microsoft) is now included under src/tools/org/h2/jaqu. A small sample application is included under src/test/org/h2/test/jaqu. JaQu (Java Query), a tool similar to LINQ (Language Integrated Query; from Microsoft) is now included under src/tools/org/h2/jaqu. A small sample application is included under src/test/org/h2/test/jaqu.
@changelog_1280_li @changelog_1281_li
The source code is now switched to Java 1.6 by default. To switch back to Java 1.4, run 'build compile'. The h2.jar file is still Java 1.4. The source code is now switched to Java 1.6 by default. To switch back to Java 1.4, run 'build compile'. The h2.jar file is still Java 1.4.
@changelog_1281_li @changelog_1282_li
The ChangePassword tool is now called ChangeFileEncryption. The ChangePassword tool is now called ChangeFileEncryption.
@changelog_1282_li @changelog_1283_li
It is no longer allowed to create columns with the data type NULL. Also, it is no longer allowed to convert a column to the data type NULL. This was possible before but caused data loss. It is no longer allowed to create columns with the data type NULL. Also, it is no longer allowed to convert a column to the data type NULL. This was possible before but caused data loss.
@changelog_1283_li @changelog_1284_li
When using computed columns or default values with a different data type than the column data type, a class cast exception could occur. Fixed. When using computed columns or default values with a different data type than the column data type, a class cast exception could occur. Fixed.
@changelog_1284_li @changelog_1285_li
Opening databases larger than 1 GB was sometimes very slow if a lot of data was deleted previously. Fixed. Opening databases larger than 1 GB was sometimes very slow if a lot of data was deleted previously. Fixed.
@changelog_1285_li @changelog_1286_li
RUNSCRIPT could throw a NullPointerException if the script name was an expression. RUNSCRIPT could throw a NullPointerException if the script name was an expression.
@changelog_1286_li @changelog_1287_li
Improved compatibility. New compatibility modes for Oracle and Derby. New compatibility flag uniqueIndexNullDistinct to only allow one row with 'NULL' in a unique index. This flag is enabled for Derby, Oracle, MSSQLServer, and HSQLDB. Improved compatibility. New compatibility modes for Oracle and Derby. New compatibility flag uniqueIndexNullDistinct to only allow one row with 'NULL' in a unique index. This flag is enabled for Derby, Oracle, MSSQLServer, and HSQLDB.
@changelog_1287_li @changelog_1288_li
Linked tables: To view the statements that are executed against the target table, set the trace level to 3. Linked tables: To view the statements that are executed against the target table, set the trace level to 3.
@changelog_1288_li @changelog_1289_li
RunScript tool: new options to show and check the results of queries. RunScript tool: new options to show and check the results of queries.
@changelog_1289_li @changelog_1290_li
Deadlocks are now detected. One transaction is rolled back automatically. Deadlocks are now detected. One transaction is rolled back automatically.
@changelog_1290_li @changelog_1291_li
The Lucene fulltext index was always re-created when opening a database with fulltext index enabled. The Lucene fulltext index was always re-created when opening a database with fulltext index enabled.
@changelog_1291_li @changelog_1292_li
Support for overloaded Java methods. A user defined function can now be bound to multiple Java methods, if the Java methods have the same name but a different number of parameters. Thanks to Gary Tong for providing a patch! Support for overloaded Java methods. A user defined function can now be bound to multiple Java methods, if the Java methods have the same name but a different number of parameters. Thanks to Gary Tong for providing a patch!
@changelog_1292_h2 @changelog_1293_h2
Version 1.0.73 (2008-05-31) Version 1.0.73 (2008-05-31)
@changelog_1293_li @changelog_1294_li
ParameterMetaData now returns the right data type for most conditions, as in WHERE ID=?. ParameterMetaData now returns the right data type for most conditions, as in WHERE ID=?.
@changelog_1294_li @changelog_1295_li
The table SYSTEM_RANGE now supports expressions and parameters. The table SYSTEM_RANGE now supports expressions and parameters.
@changelog_1295_li @changelog_1296_li
New column INFORMATION_SCHEMA.CONSTRAINTS.UNIQUE_INDEX_NAME that contains the name of the unique index used to enforce this constraint, if there is such an index. New column INFORMATION_SCHEMA.CONSTRAINTS.UNIQUE_INDEX_NAME that contains the name of the unique index used to enforce this constraint, if there is such an index.
@changelog_1296_li @changelog_1297_li
SET QUERY_TIMEOUT and Statement.setQueryTimeout no longer commits a transaction. The same applies to SET @VARIABLE, SET LOCK_TIMEOUT, SET TRACE_LEVEL_*, SET THROTTLE, and SET PATH. SET QUERY_TIMEOUT and Statement.setQueryTimeout no longer commits a transaction. The same applies to SET @VARIABLE, SET LOCK_TIMEOUT, SET TRACE_LEVEL_*, SET THROTTLE, and SET PATH.
@changelog_1297_li @changelog_1298_li
The SCRIPT command does now emit IF NOT EXISTS for CREATE ROLE. The SCRIPT command does now emit IF NOT EXISTS for CREATE ROLE.
@changelog_1298_li @changelog_1299_li
MySQL compatibility: auto_increment column are no longer automatically converted to primary key columns. MySQL compatibility: auto_increment column are no longer automatically converted to primary key columns.
@changelog_1299_li @changelog_1300_li
PostgreSQL compatibility: support for BOOL_OR and BOOL_AND aggregate functions. PostgreSQL compatibility: support for BOOL_OR and BOOL_AND aggregate functions.
@changelog_1300_li @changelog_1301_li
Negative scale values for DECIMAL or NUMBER columns are now supported in regular tables and in linked tables. Negative scale values for DECIMAL or NUMBER columns are now supported in regular tables and in linked tables.
@changelog_1301_li @changelog_1302_li
A role or right can now be granted or revoked multiple times without getting an exception. A role or right can now be granted or revoked multiple times without getting an exception.
@changelog_1302_li @changelog_1303_li
Infinite numbers in SQL scripts are listed as POWER(0, -1)), negative infinite as (-POWER(0, -1)), and NaN (not a number) as SQRT(-1). Infinite numbers in SQL scripts are listed as POWER(0, -1)), negative infinite as (-POWER(0, -1)), and NaN (not a number) as SQRT(-1).
@changelog_1303_li @changelog_1304_li
The special double and float values 'NaN' (not a number) did not work correctly when sorting or comparing. The special double and float values 'NaN' (not a number) did not work correctly when sorting or comparing.
@changelog_1304_li @changelog_1305_li
The fulltext search did not support CLOB data types. The fulltext search did not support CLOB data types.
@changelog_1305_li @changelog_1306_li
If the drive with the database files was disconnected or unmounted while writing, sometimes a stack overflow exception was thrown instead of a IO exception. If the drive with the database files was disconnected or unmounted while writing, sometimes a stack overflow exception was thrown instead of a IO exception.
@changelog_1306_li @changelog_1307_li
The H2 Console could not be shut down from within the tool if the browser supports keepAlive (most browsers do). The H2 Console could not be shut down from within the tool if the browser supports keepAlive (most browsers do).
@changelog_1307_li @changelog_1308_li
If the password was passed as a char array, it was kept in an internal buffer longer than required. Theoretically the password could have been stolen if the main memory was swapped to disk before the garbage collection was run. If the password was passed as a char array, it was kept in an internal buffer longer than required. Theoretically the password could have been stolen if the main memory was swapped to disk before the garbage collection was run.
@changelog_1308_h2 @changelog_1309_h2
Version 1.0.72 (2008-05-10) Version 1.0.72 (2008-05-10)
@changelog_1309_li @changelog_1310_li
Some databases could not be opened when appending ;RECOVER=1 to the database URL. Some databases could not be opened when appending ;RECOVER=1 to the database URL.
@changelog_1310_li @changelog_1311_li
The Japanese translation of the error messages and the H2 Console has been completed by Masahiro Ikemoto (Arizona Design Inc.) The Japanese translation of the error messages and the H2 Console has been completed by Masahiro Ikemoto (Arizona Design Inc.)
@changelog_1311_li @changelog_1312_li
Updates made to updatable rows are now visible within the same result set. DatabaseMetaData.ownUpdatesAreVisible now returns true. Updates made to updatable rows are now visible within the same result set. DatabaseMetaData.ownUpdatesAreVisible now returns true.
@changelog_1312_li @changelog_1313_li
ParameterMetaData now returns the correct data for INSERT and UPDATE statements. ParameterMetaData now returns the correct data for INSERT and UPDATE statements.
@changelog_1313_li @changelog_1314_li
H2 Shell: DESCRIBE now supports an schema name. H2 Shell: DESCRIBE now supports an schema name.
@changelog_1314_li @changelog_1315_li
A subset of the PostgreSQL 'dollar quoting' feature is now supported. A subset of the PostgreSQL 'dollar quoting' feature is now supported.
@changelog_1315_li @changelog_1316_li
SLF4J is now supported by using adding TRACE_LEVEL_FILE=4 to the database URL. SLF4J is now supported by using adding TRACE_LEVEL_FILE=4 to the database URL.
@changelog_1316_li @changelog_1317_li
The recovery tool did not work if the table name contained spaces or if there was a comment on the table. The recovery tool did not work if the table name contained spaces or if there was a comment on the table.
@changelog_1317_li @changelog_1318_li
Triggers are no longer executed when changing the table structure (ALTER TABLE). Triggers are no longer executed when changing the table structure (ALTER TABLE).
@changelog_1318_li @changelog_1319_li
When setting BLOB or CLOB values larger than 65 KB using a remote connection, temporary files were kept on the client longer than required (until the connection was closed or the object is garbage collected). Now they are removed as soon as the PreparedStatement is closed, or when the value is overwritten. When setting BLOB or CLOB values larger than 65 KB using a remote connection, temporary files were kept on the client longer than required (until the connection was closed or the object is garbage collected). Now they are removed as soon as the PreparedStatement is closed, or when the value is overwritten.
@changelog_1319_li @changelog_1320_li
Statements can now be canceled remotely (when using remote connections). Statements can now be canceled remotely (when using remote connections).
@changelog_1320_li @changelog_1321_li
The Shell tool now uses java.io.Console to read the password when using JDK 1.6 The Shell tool now uses java.io.Console to read the password when using JDK 1.6
@changelog_1321_li @changelog_1322_li
When using read-only databases and setting LOG=2, an exception was written to the trace file when closing the database. Fixed. When using read-only databases and setting LOG=2, an exception was written to the trace file when closing the database. Fixed.
@changelog_1322_h2 @changelog_1323_h2
Version 1.0.71 (2008-04-25) Version 1.0.71 (2008-04-25)
@changelog_1323_li @changelog_1324_li
H2 is now dual-licensed under the Eclipse Public License (EPL) and the old 'H2 License' (which is basically MPL). H2 is now dual-licensed under the Eclipse Public License (EPL) and the old 'H2 License' (which is basically MPL).
@changelog_1324_li @changelog_1325_li
Sometimes an exception 'File ID mismatch' or 'try to add a record twice' occurred after large records (8 KB or larger) are updated or deleted. See also http://code.google.com/p/h2database/issues/detail?id=22 Sometimes an exception 'File ID mismatch' or 'try to add a record twice' occurred after large records (8 KB or larger) are updated or deleted. See also http://code.google.com/p/h2database/issues/detail?id=22
@changelog_1325_li @changelog_1326_li
H2 Console: The tools can now be translated (it didn't work in the last release). H2 Console: The tools can now be translated (it didn't work in the last release).
@changelog_1326_li @changelog_1327_li
New traditional Chinese translation. Thanks a lot to Derek Chao! New traditional Chinese translation. Thanks a lot to Derek Chao!
@changelog_1327_li @changelog_1328_li
Indexes were not used when enabling the optimization for IN(SELECT...) (system property h2.optimizeInJoin). Indexes were not used when enabling the optimization for IN(SELECT...) (system property h2.optimizeInJoin).
@changelog_1328_h2 @changelog_1329_h2
Version 1.0.70 (2008-04-20) Version 1.0.70 (2008-04-20)
@changelog_1329_li
The plan is to dual-license H2. The additional license is EPL (Eclipse Public License). The current license (MPL, Mozilla Public License) will stay. Current users are not affected because they can keep MPL. EPL is very similar to MPL, the only bigger difference is related to patents (EPL is a bit more business friendly in this regard). See also http://opensource.org/licenses/eclipse-1.0.php, http://www.eclipse.org/legal/eplfaq.php (FAQ), http://blogs.zdnet.com/Burnette/?p=131
@changelog_1330_li @changelog_1330_li
Multi version concurrency (MVCC): when a row was updated, and the updated column was not indexed, this update was visible sometimes for other sessions even if it was not committed. The plan is to dual-license H2. The additional license is EPL (Eclipse Public License). The current license (MPL, Mozilla Public License) will stay. Current users are not affected because they can keep MPL. EPL is very similar to MPL, the only bigger difference is related to patents (EPL is a bit more business friendly in this regard). See also http://opensource.org/licenses/eclipse-1.0.php, http://www.eclipse.org/legal/eplfaq.php (FAQ), http://blogs.zdnet.com/Burnette/?p=131
@changelog_1331_li @changelog_1331_li
Calling SHUTDOWN on one connection and starting a query on another connection concurrently could result in a Java level deadlock. Multi version concurrency (MVCC): when a row was updated, and the updated column was not indexed, this update was visible sometimes for other sessions even if it was not committed.
@changelog_1332_li @changelog_1332_li
New system property h2.enableAnonymousSSL (default: true) to enable anonymous SSL connections. Calling SHUTDOWN on one connection and starting a query on another connection concurrently could result in a Java level deadlock.
@changelog_1333_li @changelog_1333_li
The precision if SUBSTR is now calculated if possible. New system property h2.enableAnonymousSSL (default: true) to enable anonymous SSL connections.
@changelog_1334_li @changelog_1334_li
The autocomplete in the H2 Console has been improved a bit. The precision if SUBSTR is now calculated if possible.
@changelog_1335_li @changelog_1335_li
The tools in the H2 Console are now translatable. The autocomplete in the H2 Console has been improved a bit.
@changelog_1336_li @changelog_1336_li
The servlet and lucene jar files are now automatically downloaded when building. The tools in the H2 Console are now translatable.
@changelog_1337_li @changelog_1337_li
The code switch tool has been replaced by a simpler tool called SwitchSource that just uses find and replace. The servlet and lucene jar files are now automatically downloaded when building.
@changelog_1338_li @changelog_1338_li
Started to write a Ant replacement ('JAnt') that uses pure Java build definitions. Advantages: ability to debug the build, extensible, flexible, no XML, a bit faster. Future plan: support creating custom h2 distributions (for embedded use). Maybe create a new project 'Jant' or 'Javen' if other people are interested. The code switch tool has been replaced by a simpler tool called SwitchSource that just uses find and replace.
@changelog_1339_li @changelog_1339_li
The jar file is now about 10% smaller because the variable debugging info is no longer included. The source file and line number debugging info is still included. If required, the jar file size of the full version can be further reduced to about 720 KB using 'build jarSmall' or even more by removing unneeded components. Started to write a Ant replacement ('JAnt') that uses pure Java build definitions. Advantages: ability to debug the build, extensible, flexible, no XML, a bit faster. Future plan: support creating custom h2 distributions (for embedded use). Maybe create a new project 'Jant' or 'Javen' if other people are interested.
@changelog_1340_li @changelog_1340_li
Added shell scripts run.sh and build.sh. chmod +x is required, but otherwise it should work. Feedback or improvements are welcome! The jar file is now about 10% smaller because the variable debugging info is no longer included. The source file and line number debugging info is still included. If required, the jar file size of the full version can be further reduced to about 720 KB using 'build jarSmall' or even more by removing unneeded components.
@changelog_1341_li @changelog_1341_li
Databases in zip files: large queries are now supported. Temp files are created in the temp directory if required. The documentation how to create the zip file has been corrected. Added shell scripts run.sh and build.sh. chmod +x is required, but otherwise it should work. Feedback or improvements are welcome!
@changelog_1342_li @changelog_1342_li
Invalid inline views threw confusing SQL exceptions. Databases in zip files: large queries are now supported. Temp files are created in the temp directory if required. The documentation how to create the zip file has been corrected.
@changelog_1343_li @changelog_1343_li
The Japanese translation of the error messages and the H2 Console has been improved. Thanks a lot to Masahiro IKEMOTO. Invalid inline views threw confusing SQL exceptions.
@changelog_1344_li @changelog_1344_li
Optimization for MIN() and MAX() when using MVCC. The Japanese translation of the error messages and the H2 Console has been improved. Thanks a lot to Masahiro IKEMOTO.
@changelog_1345_li @changelog_1345_li
To protect against remote brute force password attacks, the delay after each unsuccessful login now gets double as long. New system properties h2.delayWrongPasswordMin and h2.delayWrongPasswordMax. Optimization for MIN() and MAX() when using MVCC.
@changelog_1346_li @changelog_1346_li
After setting the query timeout and then resetting it, the next query would still timeout. Fixed. To protect against remote brute force password attacks, the delay after each unsuccessful login now gets double as long. New system properties h2.delayWrongPasswordMin and h2.delayWrongPasswordMax.
@changelog_1347_li @changelog_1347_li
Adding a IDENTITY column to a table with data threw a lock timeout. After setting the query timeout and then resetting it, the next query would still timeout. Fixed.
@changelog_1348_li @changelog_1348_li
OutOfMemoryError could occur when using EXISTS or IN(SELECT ..). Adding a IDENTITY column to a table with data threw a lock timeout.
@changelog_1349_li @changelog_1349_li
The built-in connection pool is not called JdbcConnectionPool. The API and documentation has been changed. OutOfMemoryError could occur when using EXISTS or IN(SELECT ..).
@changelog_1350_li @changelog_1350_li
The ConvertTraceFile tool now generates SQL statement statistics at the end of the SQL script file (similar to the profiling data generated when using java -Xrunhprof). The built-in connection pool is not called JdbcConnectionPool. The API and documentation has been changed.
@changelog_1351_li @changelog_1351_li
The ConvertTraceFile tool now generates SQL statement statistics at the end of the SQL script file (similar to the profiling data generated when using java -Xrunhprof).
@changelog_1352_li
Nested joins are now supported (A JOIN B JOIN C ON .. ON ..) Nested joins are now supported (A JOIN B JOIN C ON .. ON ..)
@download_1000_h1 @download_1000_h1
...@@ -2243,12 +2252,24 @@ Download Mirror and Older Versions ...@@ -2243,12 +2252,24 @@ Download Mirror and Older Versions
Platform-Independent Zip Platform-Independent Zip
@download_1009_h3 @download_1009_h3
Subversion Source Repository Jar File
@download_1010_a @download_1010_a
Maven.org
@download_1011_a
Sourceforge.net
@download_1012_a
Latest Automated Build (not released)
@download_1013_h3
Subversion Source Repository
@download_1014_a
Google Code Google Code
@download_1011_p @download_1015_p
For details about changes, see the <a href="changelog.html">Change Log</a> . For details about changes, see the <a href="changelog.html">Change Log</a> .
@faq_1000_h1 @faq_1000_h1
...@@ -3641,600 +3662,606 @@ This database is multithreading-safe. That means, if an application is multi-thr ...@@ -3641,600 +3662,606 @@ This database is multithreading-safe. That means, if an application is multi-thr
Locking, Lock-Timeout, Deadlocks Locking, Lock-Timeout, Deadlocks
@features_1401_p @features_1401_p
The database uses table level locks to give each connection a consistent state of the data. There are two kinds of locks: read locks (shared locks) and write locks (exclusive locks). If a connection wants to reads from a table, and there is no write lock on the table, then a read lock is added to the table. If there is a write lock, then this connection waits for the other connection to release the lock. If a connection cannot get a lock for a specified time, then a lock timeout exception is thrown. The database uses table level locks to give each connection a consistent state of the data. There are two kinds of locks: read locks (shared locks) and write locks (exclusive locks). All locks are released when the transaction commits or rolls back. When using the default transaction isolation level 'read committed', read locks are already released after each statement.
@features_1402_p @features_1402_p
If a connection wants to reads from a table, and there is no write lock on the table, then a read lock is added to the table. If there is a write lock, then this connection waits for the other connection to release the lock. If a connection cannot get a lock for a specified time, then a lock timeout exception is thrown.
@features_1403_p
Usually, SELECT statements will generate read locks. This includes subqueries. Statements that modify data use write locks. It is also possible to lock a table exclusively without modifying data, using the statement SELECT ... FOR UPDATE. The statements COMMIT and ROLLBACK releases all open locks. The commands SAVEPOINT and ROLLBACK TO SAVEPOINT don't affect locks. The locks are also released when the autocommit mode changes, and for connections with autocommit set to true (this is the default), locks are released after each statement. The following statements generate locks: Usually, SELECT statements will generate read locks. This includes subqueries. Statements that modify data use write locks. It is also possible to lock a table exclusively without modifying data, using the statement SELECT ... FOR UPDATE. The statements COMMIT and ROLLBACK releases all open locks. The commands SAVEPOINT and ROLLBACK TO SAVEPOINT don't affect locks. The locks are also released when the autocommit mode changes, and for connections with autocommit set to true (this is the default), locks are released after each statement. The following statements generate locks:
@features_1403_th @features_1404_th
Type of Lock Type of Lock
@features_1404_th @features_1405_th
SQL Statement SQL Statement
@features_1405_td @features_1406_td
Read Read
@features_1406_td @features_1407_td
SELECT * FROM TEST; SELECT * FROM TEST;
@features_1407_td @features_1408_td
CALL SELECT MAX(ID) FROM TEST; CALL SELECT MAX(ID) FROM TEST;
@features_1408_td @features_1409_td
SCRIPT; SCRIPT;
@features_1409_td @features_1410_td
Write Write
@features_1410_td @features_1411_td
SELECT * FROM TEST WHERE 1=0 FOR UPDATE; SELECT * FROM TEST WHERE 1=0 FOR UPDATE;
@features_1411_td @features_1412_td
Write Write
@features_1412_td @features_1413_td
INSERT INTO TEST VALUES(1, 'Hello'); INSERT INTO TEST VALUES(1, 'Hello');
@features_1413_td @features_1414_td
INSERT INTO TEST SELECT * FROM TEST; INSERT INTO TEST SELECT * FROM TEST;
@features_1414_td @features_1415_td
UPDATE TEST SET NAME='Hi'; UPDATE TEST SET NAME='Hi';
@features_1415_td @features_1416_td
DELETE FROM TEST; DELETE FROM TEST;
@features_1416_td @features_1417_td
Write Write
@features_1417_td @features_1418_td
ALTER TABLE TEST ...; ALTER TABLE TEST ...;
@features_1418_td @features_1419_td
CREATE INDEX ... ON TEST ...; CREATE INDEX ... ON TEST ...;
@features_1419_td @features_1420_td
DROP INDEX ...; DROP INDEX ...;
@features_1420_p @features_1421_p
The number of seconds until a lock timeout exception is thrown can be set separately for each connection using the SQL command SET LOCK_TIMEOUT &lt;milliseconds&gt;. The initial lock timeout (that is the timeout used for new connections) can be set using the SQL command SET DEFAULT_LOCK_TIMEOUT &lt;milliseconds&gt;. The default lock timeout is persistent. The number of seconds until a lock timeout exception is thrown can be set separately for each connection using the SQL command SET LOCK_TIMEOUT &lt;milliseconds&gt;. The initial lock timeout (that is the timeout used for new connections) can be set using the SQL command SET DEFAULT_LOCK_TIMEOUT &lt;milliseconds&gt;. The default lock timeout is persistent.
@features_1421_h2 @features_1422_h2
Database File Layout Database File Layout
@features_1422_p @features_1423_p
There are a number of files created for persistent databases. Unlike some other databases, not every table and/or index is stored in its own file. Instead, usually only the following files are created: A data file, an index file, a log file, and a database lock file (exists only while the database is in use). In addition to that, a file is created for each large object (CLOB/BLOB) larger than a certain size, and temporary files for large result sets. If the database trace option is enabled, trace files are created. The following files can be created by the database: There are a number of files created for persistent databases. Unlike some other databases, not every table and/or index is stored in its own file. Instead, usually only the following files are created: A data file, an index file, a log file, and a database lock file (exists only while the database is in use). In addition to that, a file is created for each large object (CLOB/BLOB) larger than a certain size, and temporary files for large result sets. If the database trace option is enabled, trace files are created. The following files can be created by the database:
@features_1423_th @features_1424_th
File Name File Name
@features_1424_th @features_1425_th
Description Description
@features_1425_th @features_1426_th
Number of Files Number of Files
@features_1426_td @features_1427_td
test.data.db test.data.db
@features_1427_td @features_1428_td
Data file. Data file.
@features_1428_td @features_1429_td
Contains the data for all tables. Contains the data for all tables.
@features_1429_td @features_1430_td
Format: &lt;database&gt;.data.db Format: &lt;database&gt;.data.db
@features_1430_td @features_1431_td
1 per database 1 per database
@features_1431_td @features_1432_td
test.index.db test.index.db
@features_1432_td @features_1433_td
Index file. Index file.
@features_1433_td @features_1434_td
Contains the data for all (b tree) indexes. Contains the data for all (b tree) indexes.
@features_1434_td @features_1435_td
Format: &lt;database&gt;.index.db Format: &lt;database&gt;.index.db
@features_1435_td @features_1436_td
1 per database 1 per database
@features_1436_td @features_1437_td
test.0.log.db test.0.log.db
@features_1437_td @features_1438_td
Transaction log file. Transaction log file.
@features_1438_td @features_1439_td
The transaction log is used for recovery. The transaction log is used for recovery.
@features_1439_td @features_1440_td
Format: &lt;database&gt;.&lt;id&gt;.log.db Format: &lt;database&gt;.&lt;id&gt;.log.db
@features_1440_td @features_1441_td
0 or more per database 0 or more per database
@features_1441_td @features_1442_td
test.lock.db test.lock.db
@features_1442_td @features_1443_td
Database lock file. Database lock file.
@features_1443_td @features_1444_td
Exists only while the database is open. Exists only while the database is open.
@features_1444_td @features_1445_td
Format: &lt;database&gt;.lock.db Format: &lt;database&gt;.lock.db
@features_1445_td @features_1446_td
1 per database 1 per database
@features_1446_td @features_1447_td
test.trace.db test.trace.db
@features_1447_td @features_1448_td
Trace file. Trace file.
@features_1448_td @features_1449_td
Contains trace information. Contains trace information.
@features_1449_td @features_1450_td
Format: &lt;database&gt;.trace.db Format: &lt;database&gt;.trace.db
@features_1450_td @features_1451_td
If the file is too big, it is renamed to &lt;database&gt;.trace.db.old If the file is too big, it is renamed to &lt;database&gt;.trace.db.old
@features_1451_td @features_1452_td
1 per database 1 per database
@features_1452_td @features_1453_td
test.lobs.db/1.t15.lob.db test.lobs.db/1.t15.lob.db
@features_1453_td @features_1454_td
Large object. Large object.
@features_1454_td @features_1455_td
Contains the data for BLOB or CLOB values. Contains the data for BLOB or CLOB values.
@features_1455_td @features_1456_td
Format: &lt;id&gt;.t&lt;tableId&gt;.lob.db Format: &lt;id&gt;.t&lt;tableId&gt;.lob.db
@features_1456_td @features_1457_td
1 per value 1 per value
@features_1457_td @features_1458_td
test.123.temp.db test.123.temp.db
@features_1458_td @features_1459_td
Temporary file. Temporary file.
@features_1459_td @features_1460_td
Contains a temporary blob or a large result set. Contains a temporary blob or a large result set.
@features_1460_td @features_1461_td
Format: &lt;database&gt;.&lt;id&gt;.temp.db Format: &lt;database&gt;.&lt;id&gt;.temp.db
@features_1461_td @features_1462_td
1 per object 1 per object
@features_1462_h3 @features_1463_h3
Moving and Renaming Database Files Moving and Renaming Database Files
@features_1463_p @features_1464_p
Database name and location are not stored inside the database files. Database name and location are not stored inside the database files.
@features_1464_p @features_1465_p
While a database is closed, the files can be moved to another directory, and they can be renamed as well (as long as all files start with the same name). While a database is closed, the files can be moved to another directory, and they can be renamed as well (as long as all files start with the same name).
@features_1465_p @features_1466_p
As there is no platform specific data in the files, they can be moved to other operating systems without problems. As there is no platform specific data in the files, they can be moved to other operating systems without problems.
@features_1466_h3 @features_1467_h3
Backup Backup
@features_1467_p @features_1468_p
When the database is closed, it is possible to backup the database files. Please note that index files do not need to be backed up, because they contain redundant data, and will be recreated automatically if they don't exist. When the database is closed, it is possible to backup the database files. Please note that index files do not need to be backed up, because they contain redundant data, and will be recreated automatically if they don't exist.
@features_1468_p @features_1469_p
To backup data while the database is running, the SQL command SCRIPT can be used. To backup data while the database is running, the SQL command SCRIPT can be used.
@features_1469_h2 @features_1470_h2
Logging and Recovery Logging and Recovery
@features_1470_p @features_1471_p
Whenever data is modified in the database and those changes are committed, the changes are logged to disk (except for in-memory objects). The changes to the data file itself are usually written later on, to optimize disk access. If there is a power failure, the data and index files are not up-to-date. But because the changes are in the log file, the next time the database is opened, the changes that are in the log file are re-applied automatically. Whenever data is modified in the database and those changes are committed, the changes are logged to disk (except for in-memory objects). The changes to the data file itself are usually written later on, to optimize disk access. If there is a power failure, the data and index files are not up-to-date. But because the changes are in the log file, the next time the database is opened, the changes that are in the log file are re-applied automatically.
@features_1471_p @features_1472_p
Please note that index file updates are not logged by default. If the database is opened and recovery is required, the index file is rebuilt from scratch. Please note that index file updates are not logged by default. If the database is opened and recovery is required, the index file is rebuilt from scratch.
@features_1472_p @features_1473_p
There is usually only one log file per database. This file grows until the database is closed successfully, and is then deleted. Or, if the file gets too big, the database switches to another log file (with a higher id). It is possible to force the log switching by using the CHECKPOINT command. There is usually only one log file per database. This file grows until the database is closed successfully, and is then deleted. Or, if the file gets too big, the database switches to another log file (with a higher id). It is possible to force the log switching by using the CHECKPOINT command.
@features_1473_p @features_1474_p
If the database file is corrupted, because the checksum of a record does not match (for example, if the file was edited with another application), the database can be opened in recovery mode. In this case, errors in the database are logged but not thrown. The database should be backed up to a script and re-built as soon as possible. To open the database in the recovery mode, use a database URL must contain RECOVER=1, as in jdbc:h2:~/test;RECOVER=1. Indexes are rebuilt in this case, and the summary (object allocation table) is not read in this case, so opening the database takes longer. If the database file is corrupted, because the checksum of a record does not match (for example, if the file was edited with another application), the database can be opened in recovery mode. In this case, errors in the database are logged but not thrown. The database should be backed up to a script and re-built as soon as possible. To open the database in the recovery mode, use a database URL must contain RECOVER=1, as in jdbc:h2:~/test;RECOVER=1. Indexes are rebuilt in this case, and the summary (object allocation table) is not read in this case, so opening the database takes longer.
@features_1474_h2 @features_1475_h2
Compatibility Compatibility
@features_1475_p @features_1476_p
All database engines behave a little bit different. Where possible, H2 supports the ANSI SQL standard, and tries to be compatible to other databases. There are still a few differences however: All database engines behave a little bit different. Where possible, H2 supports the ANSI SQL standard, and tries to be compatible to other databases. There are still a few differences however:
@features_1476_p @features_1477_p
In MySQL text columns are case insensitive by default, while in H2 they are case sensitive. However H2 supports case insensitive columns as well. To create the tables with case insensitive texts, append IGNORECASE=TRUE to the database URL (example: <code>jdbc:h2:~/test;IGNORECASE=TRUE</code> ). In MySQL text columns are case insensitive by default, while in H2 they are case sensitive. However H2 supports case insensitive columns as well. To create the tables with case insensitive texts, append IGNORECASE=TRUE to the database URL (example: <code>jdbc:h2:~/test;IGNORECASE=TRUE</code> ).
@features_1477_h3 @features_1478_h3
Compatibility Modes Compatibility Modes
@features_1478_p @features_1479_p
For certain features, this database can emulate the behavior of specific databases. Not all features or differences of those databases are implemented. Here is the list of currently supported modes and the differences to the regular mode: For certain features, this database can emulate the behavior of specific databases. Not all features or differences of those databases are implemented. Here is the list of currently supported modes and the differences to the regular mode:
@features_1479_h3 @features_1480_h3
DB2 Compatibility Mode DB2 Compatibility Mode
@features_1480_p @features_1481_p
To use the IBM DB2 mode, use the database URL <code>jdbc:h2:~/test;MODE=DB2</code> or the SQL statement <code>SET MODE DB2</code> . To use the IBM DB2 mode, use the database URL <code>jdbc:h2:~/test;MODE=DB2</code> or the SQL statement <code>SET MODE DB2</code> .
@features_1481_li @features_1482_li
For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1482_li @features_1483_li
Support for the syntax [OFFSET .. ROW] [FETCH ... ONLY] as an alternative for LIMIT .. OFFSET. Support for the syntax [OFFSET .. ROW] [FETCH ... ONLY] as an alternative for LIMIT .. OFFSET.
@features_1483_h3 @features_1484_h3
Derby Compatibility Mode Derby Compatibility Mode
@features_1484_p @features_1485_p
To use the Apache Derby mode, use the database URL <code>jdbc:h2:~/test;MODE=Derby</code> or the SQL statement <code>SET MODE Derby</code> . To use the Apache Derby mode, use the database URL <code>jdbc:h2:~/test;MODE=Derby</code> or the SQL statement <code>SET MODE Derby</code> .
@features_1485_li @features_1486_li
For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1486_li @features_1487_li
For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed. For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed.
@features_1487_h3 @features_1488_h3
HSQLDB Compatibility Mode HSQLDB Compatibility Mode
@features_1488_p @features_1489_p
To use the HSQLDB mode, use the database URL <code>jdbc:h2:~/test;MODE=HSQLDB</code> or the SQL statement <code>SET MODE HSQLDB</code> . To use the HSQLDB mode, use the database URL <code>jdbc:h2:~/test;MODE=HSQLDB</code> or the SQL statement <code>SET MODE HSQLDB</code> .
@features_1489_li @features_1490_li
For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1490_li @features_1491_li
When converting the scale of decimal data, the number is only converted if the new scale is smaller than the current scale. Usually, the scale is converted and 0s are added if required. When converting the scale of decimal data, the number is only converted if the new scale is smaller than the current scale. Usually, the scale is converted and 0s are added if required.
@features_1491_li @features_1492_li
Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL. Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL.
@features_1492_li @features_1493_li
For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed. For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed.
@features_1493_h3 @features_1494_h3
MS SQL Server Compatibility Mode MS SQL Server Compatibility Mode
@features_1494_p @features_1495_p
To use the MS SQL Server mode, use the database URL <code>jdbc:h2:~/test;MODE=MSSQLServer</code> or the SQL statement <code>SET MODE MSSQLServer</code> . To use the MS SQL Server mode, use the database URL <code>jdbc:h2:~/test;MODE=MSSQLServer</code> or the SQL statement <code>SET MODE MSSQLServer</code> .
@features_1495_li @features_1496_li
For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1496_li @features_1497_li
Identifiers may be quoted using square brackets as in [Test]. Identifiers may be quoted using square brackets as in [Test].
@features_1497_li @features_1498_li
For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed. For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed.
@features_1498_h3 @features_1499_h3
MySQL Compatibility Mode MySQL Compatibility Mode
@features_1499_p @features_1500_p
To use the MySQL mode, use the database URL <code>jdbc:h2:~/test;MODE=MySQL</code> or the SQL statement <code>SET MODE MySQL</code> . To use the MySQL mode, use the database URL <code>jdbc:h2:~/test;MODE=MySQL</code> or the SQL statement <code>SET MODE MySQL</code> .
@features_1500_li @features_1501_li
When inserting data, if a column is defined to be NOT NULL and NULL is inserted, then a 0 (or empty string, or the current timestamp for timestamp columns) value is used. Usually, this operation is not allowed and an exception is thrown. When inserting data, if a column is defined to be NOT NULL and NULL is inserted, then a 0 (or empty string, or the current timestamp for timestamp columns) value is used. Usually, this operation is not allowed and an exception is thrown.
@features_1501_li @features_1502_li
Creating indexes in the CREATE TABLE statement is allowed. Creating indexes in the CREATE TABLE statement is allowed.
@features_1502_li @features_1503_li
Meta data calls return identifiers in lower case. Meta data calls return identifiers in lower case.
@features_1503_li @features_1504_li
When converting a floating point number to an integer, the fractional digits are not truncated, but the value is rounded. When converting a floating point number to an integer, the fractional digits are not truncated, but the value is rounded.
@features_1504_h3 @features_1505_h3
Oracle Compatibility Mode Oracle Compatibility Mode
@features_1505_p @features_1506_p
To use the Oracle mode, use the database URL <code>jdbc:h2:~/test;MODE=Oracle</code> or the SQL statement <code>SET MODE Oracle</code> . To use the Oracle mode, use the database URL <code>jdbc:h2:~/test;MODE=Oracle</code> or the SQL statement <code>SET MODE Oracle</code> .
@features_1506_li @features_1507_li
For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1507_li @features_1508_li
When using unique indexes, multiple rows with NULL in all columns are allowed, however it is not allowed to have multiple rows with the same values otherwise. When using unique indexes, multiple rows with NULL in all columns are allowed, however it is not allowed to have multiple rows with the same values otherwise.
@features_1508_h3 @features_1509_h3
PostgreSQL Compatibility Mode PostgreSQL Compatibility Mode
@features_1509_p @features_1510_p
To use the PostgreSQL mode, use the database URL <code>jdbc:h2:~/test;MODE=PostgreSQL</code> or the SQL statement <code>SET MODE PostgreSQL</code> . To use the PostgreSQL mode, use the database URL <code>jdbc:h2:~/test;MODE=PostgreSQL</code> or the SQL statement <code>SET MODE PostgreSQL</code> .
@features_1510_li @features_1511_li
For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1511_li @features_1512_li
Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL. Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL.
@features_1512_li @features_1513_li
When converting a floating point number to an integer, the fractional digits are not be truncated, but the value is rounded. When converting a floating point number to an integer, the fractional digits are not be truncated, but the value is rounded.
@features_1513_li @features_1514_li
The system columns 'CTID' and 'OID' are supported. The system columns 'CTID' and 'OID' are supported.
@features_1514_h2 @features_1515_h2
Auto-Reconnect Auto-Reconnect
@features_1515_p @features_1516_p
The auto-reconnect feature causes the JDBC driver to reconnect to the database if the connection is lost. The automatic re-connect only occurs when auto-commit is enabled; if auto-commit is disabled, an exception is thrown. The auto-reconnect feature causes the JDBC driver to reconnect to the database if the connection is lost. The automatic re-connect only occurs when auto-commit is enabled; if auto-commit is disabled, an exception is thrown.
@features_1516_p @features_1517_p
Re-connecting will open a new session. After an automatic re-connect, variables and local temporary tables definitions (excluding data) are re-created. The contents of the system table INFORMATION_SCHEMA.SESSION_STATE contains all client side state that is re-created. Re-connecting will open a new session. After an automatic re-connect, variables and local temporary tables definitions (excluding data) are re-created. The contents of the system table INFORMATION_SCHEMA.SESSION_STATE contains all client side state that is re-created.
@features_1517_h2 @features_1518_h2
Automatic Mixed Mode Automatic Mixed Mode
@features_1518_p @features_1519_p
Multiple processes can access the same database without having to start the server manually. To do that, append <code>;AUTO_SERVER=TRUE</code> to the database URL. You can use the same database URL no matter if the database is already open or not. Multiple processes can access the same database without having to start the server manually. To do that, append <code>;AUTO_SERVER=TRUE</code> to the database URL. You can use the same database URL no matter if the database is already open or not.
@features_1519_p @features_1520_p
When using this mode, the first connection to the database is made in embedded mode, and additionally a server is started internally. If the database is already open in another process, the server mode is used automatically. When using this mode, the first connection to the database is made in embedded mode, and additionally a server is started internally. If the database is already open in another process, the server mode is used automatically.
@features_1520_p @features_1521_p
The application that opens the first connection to the database uses the embedded mode, which is faster than the server mode. Therefore the main application should open the database first if possible. The first connection automatically starts a server on a random port. This server allows remote connections, however only to this database (to ensure that, the client reads .lock.db file and sends the the random key that is stored there to the server). When the first connection is closed, the server stops. If other (remote) connections are still open, one of them will then start a server (auto-reconnect is enabled automatically). The application that opens the first connection to the database uses the embedded mode, which is faster than the server mode. Therefore the main application should open the database first if possible. The first connection automatically starts a server on a random port. This server allows remote connections, however only to this database (to ensure that, the client reads .lock.db file and sends the the random key that is stored there to the server). When the first connection is closed, the server stops. If other (remote) connections are still open, one of them will then start a server (auto-reconnect is enabled automatically).
@features_1521_p @features_1522_p
This mode has three disadvantages: All processes need to have access to the database files. Then, if the first connection is closed (the connection that started the server), open transactions of other connections will be rolled back. Also, explicit client/server connections (using jdbc:h2:tcp:// or ssl://) are not supported. This mode has three disadvantages: All processes need to have access to the database files. Then, if the first connection is closed (the connection that started the server), open transactions of other connections will be rolled back. Also, explicit client/server connections (using jdbc:h2:tcp:// or ssl://) are not supported.
@features_1522_p @features_1523_p
Here is an example how to use this mode. Application 1 and 2 are not necessarily started on the same computer, but they need to have access to the database files. Application 1 and 2 are typically two different processes (however they could run within the same process). Here is an example how to use this mode. Application 1 and 2 are not necessarily started on the same computer, but they need to have access to the database files. Application 1 and 2 are typically two different processes (however they could run within the same process).
@features_1523_h2 @features_1524_h2
Using the Trace Options Using the Trace Options
@features_1524_p @features_1525_p
To find problems in an application, it is sometimes good to see what database operations where executed. This database offers the following trace features: To find problems in an application, it is sometimes good to see what database operations where executed. This database offers the following trace features:
@features_1525_li @features_1526_li
Trace to System.out and/or a file Trace to System.out and/or a file
@features_1526_li @features_1527_li
Support for trace levels OFF, ERROR, INFO, and DEBUG Support for trace levels OFF, ERROR, INFO, and DEBUG
@features_1527_li @features_1528_li
The maximum size of the trace file can be set The maximum size of the trace file can be set
@features_1528_li @features_1529_li
It is possible to generate Java source code from the trace file It is possible to generate Java source code from the trace file
@features_1529_li @features_1530_li
Trace can be enabled at runtime by manually creating a file Trace can be enabled at runtime by manually creating a file
@features_1530_h3 @features_1531_h3
Trace Options Trace Options
@features_1531_p @features_1532_p
The simplest way to enable the trace option is setting it in the database URL. There are two settings, one for System.out (TRACE_LEVEL_SYSTEM_OUT) tracing, and one for file tracing (TRACE_LEVEL_FILE). The trace levels are 0 for OFF, 1 for ERROR (the default), 2 for INFO and 3 for DEBUG. A database URL with both levels set to DEBUG is: The simplest way to enable the trace option is setting it in the database URL. There are two settings, one for System.out (TRACE_LEVEL_SYSTEM_OUT) tracing, and one for file tracing (TRACE_LEVEL_FILE). The trace levels are 0 for OFF, 1 for ERROR (the default), 2 for INFO and 3 for DEBUG. A database URL with both levels set to DEBUG is:
@features_1532_p @features_1533_p
The trace level can be changed at runtime by executing the SQL command <code>SET TRACE_LEVEL_SYSTEM_OUT level</code> (for System.out tracing) or <code>SET TRACE_LEVEL_FILE level</code> (for file tracing). Example: The trace level can be changed at runtime by executing the SQL command <code>SET TRACE_LEVEL_SYSTEM_OUT level</code> (for System.out tracing) or <code>SET TRACE_LEVEL_FILE level</code> (for file tracing). Example:
@features_1533_h3 @features_1534_h3
Setting the Maximum Size of the Trace File Setting the Maximum Size of the Trace File
@features_1534_p @features_1535_p
When using a high trace level, the trace file can get very big quickly. The default size limit is 16 MB, if the trace file exceeds this limit, it is renamed to .old and a new file is created. If another .old file exists, it is deleted. The size limit can be changed using the SQL statement <code>SET TRACE_MAX_FILE_SIZE maximumFileSizeInMB</code> . Example: When using a high trace level, the trace file can get very big quickly. The default size limit is 16 MB, if the trace file exceeds this limit, it is renamed to .old and a new file is created. If another .old file exists, it is deleted. The size limit can be changed using the SQL statement <code>SET TRACE_MAX_FILE_SIZE maximumFileSizeInMB</code> . Example:
@features_1535_h3 @features_1536_h3
Java Code Generation Java Code Generation
@features_1536_p @features_1537_p
When setting the trace level to INFO or DEBUG, Java source code is generated as well. This allows to reproduce problems more easily. The trace file looks like this: When setting the trace level to INFO or DEBUG, Java source code is generated as well. This allows to reproduce problems more easily. The trace file looks like this:
@features_1537_p @features_1538_p
To filter the Java source code, use the ConvertTraceFile tool as follows: To filter the Java source code, use the ConvertTraceFile tool as follows:
@features_1538_p @features_1539_p
The generated file <code>Test.java</code> will contain the Java source code. The generated source code may be too large to compile (the size of a Java method is limited). If this is the case, the source code needs to be split in multiple methods. The password is not listed in the trace file and therefore not included in the source code. The generated file <code>Test.java</code> will contain the Java source code. The generated source code may be too large to compile (the size of a Java method is limited). If this is the case, the source code needs to be split in multiple methods. The password is not listed in the trace file and therefore not included in the source code.
@features_1539_h2 @features_1540_h2
Using Other Logging APIs Using Other Logging APIs
@features_1540_p @features_1541_p
By default, this database uses its own native 'trace' facility. This facility is called 'trace' and not 'log' within this database to avoid confusion with the transaction log. Trace messages can be written to both file and System.out. In most cases, this is sufficient, however sometimes it is better to use the same facility as the application, for example Log4j. To do that, this database support SLF4J. By default, this database uses its own native 'trace' facility. This facility is called 'trace' and not 'log' within this database to avoid confusion with the transaction log. Trace messages can be written to both file and System.out. In most cases, this is sufficient, however sometimes it is better to use the same facility as the application, for example Log4j. To do that, this database support SLF4J.
@features_1541_a @features_1542_a
SLF4J SLF4J
@features_1542_p @features_1543_p
is a simple facade for various logging APIs and allows to plug in the desired implementation at deployment time. SLF4J supports implementations such as Logback, Log4j, Jakarta Commons Logging (JCL), JDK 1.4 logging, x4juli, and Simple Log. is a simple facade for various logging APIs and allows to plug in the desired implementation at deployment time. SLF4J supports implementations such as Logback, Log4j, Jakarta Commons Logging (JCL), JDK 1.4 logging, x4juli, and Simple Log.
@features_1543_p @features_1544_p
To enable SLF4J, set the file trace level to 4 in the database URL: To enable SLF4J, set the file trace level to 4 in the database URL:
@features_1544_p @features_1545_p
Changing the log mechanism is not possible after the database is open, that means executing the SQL statement SET TRACE_LEVEL_FILE 4 when the database is already open will not have the desired effect. To use SLF4J, all required jar files need to be in the classpath. If it does not work, check the file &lt;database&gt;.trace.db for error messages. Changing the log mechanism is not possible after the database is open, that means executing the SQL statement SET TRACE_LEVEL_FILE 4 when the database is already open will not have the desired effect. To use SLF4J, all required jar files need to be in the classpath. If it does not work, check the file &lt;database&gt;.trace.db for error messages.
@features_1545_h2 @features_1546_h2
Read Only Databases Read Only Databases
@features_1546_p @features_1547_p
If the database files are read-only, then the database is read-only as well. It is not possible to create new tables, add or modify data in this database. Only SELECT and CALL statements are allowed. To create a read-only database, close the database so that the log file gets smaller. Do not delete the log file. Then, make the database files read-only using the operating system. When you open the database now, it is read-only. There are two ways an application can find out whether database is read-only: By calling Connection.isReadOnly() or by executing the SQL statement CALL READONLY(). If the database files are read-only, then the database is read-only as well. It is not possible to create new tables, add or modify data in this database. Only SELECT and CALL statements are allowed. To create a read-only database, close the database so that the log file gets smaller. Do not delete the log file. Then, make the database files read-only using the operating system. When you open the database now, it is read-only. There are two ways an application can find out whether database is read-only: By calling Connection.isReadOnly() or by executing the SQL statement CALL READONLY().
@features_1547_h2 @features_1548_h2
Read Only Databases in Zip or Jar File Read Only Databases in Zip or Jar File
@features_1548_p @features_1549_p
To create a read-only database in a zip file, first create a regular persistent database, and then create a backup. If you are using a database named 'test', an easy way to do that is using the Backup tool or the BACKUP SQL statement: To create a read-only database in a zip file, first create a regular persistent database, and then create a backup. If you are using a database named 'test', an easy way to do that is using the Backup tool or the BACKUP SQL statement:
@features_1549_p @features_1550_p
The database must not have pending changes, that means you need to close all connections to the database, open one single connection, and then execute the statement. Afterwards, you can log out, and directly open the database in the zip file using the following database URL: The database must not have pending changes, that means you need to close all connections to the database, open one single connection, and then execute the statement. Afterwards, you can log out, and directly open the database in the zip file using the following database URL:
@features_1550_p @features_1551_p
Databases in zip files are read-only. The performance for some queries will be slower than when using a regular database, because random access in zip files is not supported (only streaming). How much this affects the performance depends on the queries and the data. The database is not read in memory; therefore large databases are supported as well. The same indexes are used as when using a regular database. Databases in zip files are read-only. The performance for some queries will be slower than when using a regular database, because random access in zip files is not supported (only streaming). How much this affects the performance depends on the queries and the data. The database is not read in memory; therefore large databases are supported as well. The same indexes are used as when using a regular database.
@features_1551_h2 @features_1552_h2
Graceful Handling of Low Disk Space Situations Graceful Handling of Low Disk Space Situations
@features_1552_p @features_1553_p
If the database needs more disk space, it calls the database event listener if one is installed. The application may then delete temporary files, or display a message and wait until the user has resolved the problem. To install a listener, run the SQL statement SET DATABASE_EVENT_LISTENER or use a database URL of the form jdbc:h2:~/test;DATABASE_EVENT_LISTENER='com.acme.DbListener' (the quotes around the class name are required). See also the DatabaseEventListener API. If the database needs more disk space, it calls the database event listener if one is installed. The application may then delete temporary files, or display a message and wait until the user has resolved the problem. To install a listener, run the SQL statement SET DATABASE_EVENT_LISTENER or use a database URL of the form jdbc:h2:~/test;DATABASE_EVENT_LISTENER='com.acme.DbListener' (the quotes around the class name are required). See also the DatabaseEventListener API.
@features_1553_h3 @features_1554_h3
Opening a Corrupted Database Opening a Corrupted Database
@features_1554_p @features_1555_p
If a database cannot be opened because the boot info (the SQL script that is run at startup) is corrupted, then the database can be opened by specifying a database event listener. The exceptions are logged, but opening the database will continue. If a database cannot be opened because the boot info (the SQL script that is run at startup) is corrupted, then the database can be opened by specifying a database event listener. The exceptions are logged, but opening the database will continue.
@features_1555_h2 @features_1556_h2
Computed Columns / Function Based Index Computed Columns / Function Based Index
@features_1556_p @features_1557_p
Function indexes are not directly supported by this database, but they can be emulated by using computed columns. For example, if an index on the upper-case version of a column is required, create a computed column with the upper-case version of the original column, and create an index for this column: Function indexes are not directly supported by this database, but they can be emulated by using computed columns. For example, if an index on the upper-case version of a column is required, create a computed column with the upper-case version of the original column, and create an index for this column:
@features_1557_p @features_1558_p
When inserting data, it is not required (and not allowed) to specify a value for the upper-case version of the column, because the value is generated. But you can use the column when querying the table: When inserting data, it is not required (and not allowed) to specify a value for the upper-case version of the column, because the value is generated. But you can use the column when querying the table:
@features_1558_h2 @features_1559_h2
Multi-Dimensional Indexes Multi-Dimensional Indexes
@features_1559_p @features_1560_p
A tool is provided to execute efficient multi-dimension (spatial) range queries. This database does not support a specialized spatial index (R-Tree or similar). Instead, the B-Tree index is used. For each record, the multi-dimensional key is converted (mapped) to a single dimensional (scalar) value. This value specifies the location on a space-filling curve. A tool is provided to execute efficient multi-dimension (spatial) range queries. This database does not support a specialized spatial index (R-Tree or similar). Instead, the B-Tree index is used. For each record, the multi-dimensional key is converted (mapped) to a single dimensional (scalar) value. This value specifies the location on a space-filling curve.
@features_1560_p @features_1561_p
Currently, Z-order (also called N-order or Morton-order) is used; Hilbert curve could also be used, but the implementation is more complex. The algorithm to convert the multi-dimensional value is called bit-interleaving. The scalar value is indexed using a B-Tree index (usually using a computed column). Currently, Z-order (also called N-order or Morton-order) is used; Hilbert curve could also be used, but the implementation is more complex. The algorithm to convert the multi-dimensional value is called bit-interleaving. The scalar value is indexed using a B-Tree index (usually using a computed column).
@features_1561_p @features_1562_p
The method can result in a drastic performance improvement over just using an index on the first column. Depending on the data and number of dimensions, the improvement is usually higher than factor 5. The tool generates a SQL query from a specified multi-dimensional range. The method used is not database dependent, and the tool can easily be ported to other databases. For an example how to use the tool, please have a look at the sample code provided in TestMultiDimension.java. The method can result in a drastic performance improvement over just using an index on the first column. Depending on the data and number of dimensions, the improvement is usually higher than factor 5. The tool generates a SQL query from a specified multi-dimensional range. The method used is not database dependent, and the tool can easily be ported to other databases. For an example how to use the tool, please have a look at the sample code provided in TestMultiDimension.java.
@features_1562_h2 @features_1563_h2
Using Passwords Using Passwords
@features_1563_h3 @features_1564_h3
Using Secure Passwords Using Secure Passwords
@features_1564_p @features_1565_p
Remember that weak passwords can be broken no matter of the encryption and security protocol. Don't use passwords that can be found in a dictionary. Also appending numbers does not make them secure. A way to create good passwords that can be remembered is, take the first letters of a sentence, use upper and lower case characters, and creatively include special characters. Example: Remember that weak passwords can be broken no matter of the encryption and security protocol. Don't use passwords that can be found in a dictionary. Also appending numbers does not make them secure. A way to create good passwords that can be remembered is, take the first letters of a sentence, use upper and lower case characters, and creatively include special characters. Example:
@features_1565_p @features_1566_p
i'sE2rtPiUKtT (it's easy to remember this password if you know the trick) i'sE2rtPiUKtT (it's easy to remember this password if you know the trick)
@features_1566_h3 @features_1567_h3
Passwords: Using Char Arrays instead of Strings Passwords: Using Char Arrays instead of Strings
@features_1567_p @features_1568_p
Java Strings are immutable objects and cannot be safely 'destroyed' by the application. After creating a String, it will remain in the main memory of the computer at least until it is garbage collected. The garbage collection cannot be controlled by the application, and even if it is garbage collected the data may still remain in memory. It might also be possible that the part of memory containing the password is swapped to disk (because not enough main memory is available). Java Strings are immutable objects and cannot be safely 'destroyed' by the application. After creating a String, it will remain in the main memory of the computer at least until it is garbage collected. The garbage collection cannot be controlled by the application, and even if it is garbage collected the data may still remain in memory. It might also be possible that the part of memory containing the password is swapped to disk (because not enough main memory is available).
@features_1568_p @features_1569_p
An attacker might have access to the swap file of the operating system. It is therefore a good idea to use char arrays instead of Strings to store passwords. Char arrays can be cleared (filled with zeros) after use, and therefore the password will not be stored in the swap file. An attacker might have access to the swap file of the operating system. It is therefore a good idea to use char arrays instead of Strings to store passwords. Char arrays can be cleared (filled with zeros) after use, and therefore the password will not be stored in the swap file.
@features_1569_p @features_1570_p
This database supports using char arrays instead of String to pass user and file passwords. The following code can be used to do that: This database supports using char arrays instead of String to pass user and file passwords. The following code can be used to do that:
@features_1570_p @features_1571_p
This example requires Java 1.6. When using Swing, use javax.swing.JPasswordField. This example requires Java 1.6. When using Swing, use javax.swing.JPasswordField.
@features_1571_h3 @features_1572_h3
Passing the User Name and/or Password in the URL Passing the User Name and/or Password in the URL
@features_1572_p @features_1573_p
Instead of passing the user name as a separate parameter as in <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", "123");</code> the user name (and/or password) can be supplied in the URL itself: <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test;USER=sa;PASSWORD=123");</code> The settings in the URL override the settings passed as a separate parameter. Instead of passing the user name as a separate parameter as in <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", "123");</code> the user name (and/or password) can be supplied in the URL itself: <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test;USER=sa;PASSWORD=123");</code> The settings in the URL override the settings passed as a separate parameter.
@features_1573_h2 @features_1574_h2
User-Defined Functions and Stored Procedures User-Defined Functions and Stored Procedures
@features_1574_p @features_1575_p
In addition to the built-in functions, this database supports user-defined Java functions. In this database, Java functions can be used as stored procedures as well. A function must be declared (registered) before it can be used. Only static Java methods are supported; both the class and the method must be public. Example Java method: In addition to the built-in functions, this database supports user-defined Java functions. In this database, Java functions can be used as stored procedures as well. A function must be declared (registered) before it can be used. Only static Java methods are supported; both the class and the method must be public. Example Java method:
@features_1575_p @features_1576_p
The Java function must be registered in the database by calling CREATE ALIAS: The Java function must be registered in the database by calling CREATE ALIAS:
@features_1576_p @features_1577_p
For a complete sample application, see src/test/org/h2/samples/Function.java. For a complete sample application, see src/test/org/h2/samples/Function.java.
@features_1577_h3 @features_1578_h3
Function Data Type Mapping Function Data Type Mapping
@features_1578_p @features_1579_p
Functions that accept non-nullable parameters such as 'int' will not be called if one of those parameters is NULL. Instead, the result of the function is NULL. If the function should be called if a parameter is NULL, you need to use 'java.lang.Integer' instead of 'int'. Functions that accept non-nullable parameters such as 'int' will not be called if one of those parameters is NULL. Instead, the result of the function is NULL. If the function should be called if a parameter is NULL, you need to use 'java.lang.Integer' instead of 'int'.
@features_1579_h3 @features_1580_h3
Functions that require a Connection Functions that require a Connection
@features_1580_p @features_1581_p
If the first parameter of a Java function is a java.sql.Connection, then the connection to database is provided. This connection does not need to be closed before returning. When calling the method from within the SQL statement, this connection parameter does not need to be (can not be) specified. If the first parameter of a Java function is a java.sql.Connection, then the connection to database is provided. This connection does not need to be closed before returning. When calling the method from within the SQL statement, this connection parameter does not need to be (can not be) specified.
@features_1581_h3 @features_1582_h3
Functions throwing an Exception Functions throwing an Exception
@features_1582_p @features_1583_p
If a function throws an Exception, then the current statement is rolled back and the exception is thrown to the application. If a function throws an Exception, then the current statement is rolled back and the exception is thrown to the application.
@features_1583_h3 @features_1584_h3
Functions returning a Result Set Functions returning a Result Set
@features_1584_p @features_1585_p
Functions may returns a result set. Such a function can be called with the CALL statement: Functions may returns a result set. Such a function can be called with the CALL statement:
@features_1585_h3 @features_1586_h3
Using SimpleResultSet Using SimpleResultSet
@features_1586_p @features_1587_p
A function can create a result set using the SimpleResultSet tool: A function can create a result set using the SimpleResultSet tool:
@features_1587_h3 @features_1588_h3
Using a Function as a Table Using a Function as a Table
@features_1588_p @features_1589_p
A function that returns a result set can be used like a table. However, in this case the function is called at least twice: First while parsing the statement to collect the column names (with parameters set to null where not known at compile time). And then, while executing the statement to get the data (maybe multiple times if this is a join). If the function is called just to get the column list, the URL of the connection passed to the function is <code>jdbc:columnlist:connection</code> . Otherwise, the URL of the connection is <code>jdbc:default:connection</code> . A function that returns a result set can be used like a table. However, in this case the function is called at least twice: First while parsing the statement to collect the column names (with parameters set to null where not known at compile time). And then, while executing the statement to get the data (maybe multiple times if this is a join). If the function is called just to get the column list, the URL of the connection passed to the function is <code>jdbc:columnlist:connection</code> . Otherwise, the URL of the connection is <code>jdbc:default:connection</code> .
@features_1589_h2 @features_1590_h2
Triggers Triggers
@features_1590_p @features_1591_p
This database supports Java triggers that are called before or after a row is updated, inserted or deleted. Triggers can be used for complex consistency checks, or to update related data in the database. It is also possible to use triggers to simulate materialized views. For a complete sample application, see src/test/org/h2/samples/TriggerSample.java. A Java trigger must implement the interface org.h2.api.Trigger: This database supports Java triggers that are called before or after a row is updated, inserted or deleted. Triggers can be used for complex consistency checks, or to update related data in the database. It is also possible to use triggers to simulate materialized views. For a complete sample application, see src/test/org/h2/samples/TriggerSample.java. A Java trigger must implement the interface org.h2.api.Trigger:
@features_1591_p @features_1592_p
The connection can be used to query or update data in other tables. The trigger then needs to be defined in the database: The connection can be used to query or update data in other tables. The trigger then needs to be defined in the database:
@features_1592_p @features_1593_p
The trigger can be used to veto a change, by throwing a SQLException. The trigger can be used to veto a change, by throwing a SQLException.
@features_1593_h2 @features_1594_h2
Compacting a Database Compacting a Database
@features_1594_p @features_1595_p
Empty space in the database file is re-used automatically. To re-build the indexes, the simplest way is to delete the .index.db file while the database is closed. However in some situations (for example after deleting a lot of data in a database), one sometimes wants to shrink the size of the database (compact a database). Here is a sample function to do this: Empty space in the database file is re-used automatically. To re-build the indexes, the simplest way is to delete the .index.db file while the database is closed. However in some situations (for example after deleting a lot of data in a database), one sometimes wants to shrink the size of the database (compact a database). Here is a sample function to do this:
@features_1595_p @features_1596_p
See also the sample application org.h2.samples.Compact. The commands SCRIPT / RUNSCRIPT can be used as well to create a backup of a database and re-build the database from the script. See also the sample application org.h2.samples.Compact. The commands SCRIPT / RUNSCRIPT can be used as well to create a backup of a database and re-build the database from the script.
@features_1596_h2 @features_1597_h2
Cache Settings Cache Settings
@features_1597_p
The database keeps most frequently used data and index pages in the main memory. The amount of memory used for caching can be changed using the setting CACHE_SIZE. This setting can be set in the database connection URL (jdbc:h2:~/test;CACHE_SIZE=131072), or it can be changed at runtime using SET CACHE_SIZE size.
@features_1598_p @features_1598_p
This database supports two cache page replacement algorithms: LRU (the default) and 2Q. For LRU, the pages that were least frequently used are removed from the cache if it becomes full. The 2Q algorithm is a bit more complicated: basically two queues are used. The 2Q algorithm is more resistant to table scans, however the overhead is a bit higher compared to the LRU. To use the cache algorithm 2Q, use a database URL of the form jdbc:h2:~/test;CACHE_TYPE=TQ. The cache algorithm cannot be changed once the database is open. The database keeps most frequently used data and index pages in the main memory. The amount of memory used for caching can be changed using the setting CACHE_SIZE. This setting can be set in the database connection URL (jdbc:h2:~/test;CACHE_SIZE=131072), or it can be changed at runtime using SET CACHE_SIZE size.
@features_1599_p @features_1599_p
This database supports two cache page replacement algorithms: LRU (the default) and TQ. For LRU, the pages that were least frequently used are removed from the cache if it becomes full. The TQ (Two Queue, also called 2Q) algorithm is a bit more complicated: basically two queues are used. It is more resistant to table scans, however the overhead is a bit higher compared to the LRU. To use the cache algorithm TQ, use a database URL of the form jdbc:h2:~/test;CACHE_TYPE=TQ. The cache algorithm cannot be changed once the database is open.
@features_1600_p
Also supported is a second level soft reference cache. Rows in this cache are only garbage collected on low memory. By default the second level cache is disabled. To enable it, use the prefix SOFT_. Example: jdbc:h2:~/test;CACHE_TYPE=SOFT_LRU .
@features_1601_p
To get information about page reads and writes, and the current caching algorithm in use, call SELECT * FROM INFORMATION_SCHEMA.SETTINGS. The number of pages read / written is listed for the data and index file. To get information about page reads and writes, and the current caching algorithm in use, call SELECT * FROM INFORMATION_SCHEMA.SETTINGS. The number of pages read / written is listed for the data and index file.
@fragments_1000_b @fragments_1000_b
...@@ -7348,6 +7375,12 @@ Optimization Examples ...@@ -7348,6 +7375,12 @@ Optimization Examples
@performance_1414_p @performance_1414_p
See <code>src/test/org/h2/samples/optimizations.sql</code> for a few examples of queries that benefit from special optimizations built into the database. See <code>src/test/org/h2/samples/optimizations.sql</code> for a few examples of queries that benefit from special optimizations built into the database.
@performance_1415_h3
Cache Size and Type
@performance_1416_p
By default the cache size of H2 is quite small. Consider using a larger cache size, or enable the second level soft reference cache. See also <a href="features.html#cache_settings">Cache Settings</a> .
@quickstart_1000_h1 @quickstart_1000_h1
Quickstart Quickstart
...@@ -7967,52 +8000,52 @@ Updatable result set on table without primary key or unique index ...@@ -7967,52 +8000,52 @@ Updatable result set on table without primary key or unique index
Use LinkedList instead of ArrayList where applicable Use LinkedList instead of ArrayList where applicable
@roadmap_1173_li @roadmap_1173_li
Support % operator (modulo) Optimizer: use an index for IS NULL and IS NOT NULL (including linked tables). ID IS NOT NULL could be converted to ID >= Integer.MIN_VALUE.
@roadmap_1174_li @roadmap_1174_li
Support 1+'2'=3, '1'+'2'='12' (MS SQL Server compatibility) Support % operator (modulo)
@roadmap_1175_li @roadmap_1175_li
Support nested transactions Support 1+'2'=3, '1'+'2'='12' (MS SQL Server compatibility)
@roadmap_1176_li @roadmap_1176_li
Add a benchmark for big databases, and one for many users Support nested transactions
@roadmap_1177_li @roadmap_1177_li
Compression in the result set (repeating values in the same column) over TCP/IP Add a benchmark for big databases, and one for many users
@roadmap_1178_li @roadmap_1178_li
Support curtimestamp (like curtime, curdate) Compression in the result set (repeating values in the same column) over TCP/IP
@roadmap_1179_li @roadmap_1179_li
Support ANALYZE {TABLE|INDEX} tableName COMPUTE|ESTIMATE|DELETE STATISTICS ptnOption options Support curtimestamp (like curtime, curdate)
@roadmap_1180_li @roadmap_1180_li
Support Sequoia (Continuent.org) Support ANALYZE {TABLE|INDEX} tableName COMPUTE|ESTIMATE|DELETE STATISTICS ptnOption options
@roadmap_1181_li @roadmap_1181_li
Dynamic length numbers / special methods for DataPage.writeByte / writeShort / Ronni Nielsen Support Sequoia (Continuent.org)
@roadmap_1182_li @roadmap_1182_li
Pluggable ThreadPool, (AvalonDB / deebee / Paul Hammant) Dynamic length numbers / special methods for DataPage.writeByte / writeShort / Ronni Nielsen
@roadmap_1183_li @roadmap_1183_li
Release locks (shared or exclusive) on demand Pluggable ThreadPool, (AvalonDB / deebee / Paul Hammant)
@roadmap_1184_li @roadmap_1184_li
Support OUTER UNION Release locks (shared or exclusive) on demand
@roadmap_1185_li @roadmap_1185_li
Support parameterized views (similar to CSVREAD, but using just SQL for the definition) Support OUTER UNION
@roadmap_1186_li @roadmap_1186_li
A way (JDBC driver) to map an URL (jdbc:h2map:c1) to a connection object Support parameterized views (similar to CSVREAD, but using just SQL for the definition)
@roadmap_1187_li @roadmap_1187_li
Option for SCRIPT to only process one or a set of tables, and append to a file A way (JDBC driver) to map an URL (jdbc:h2map:c1) to a connection object
@roadmap_1188_li @roadmap_1188_li
Support using a unique index for IS NULL (including linked tables) Option for SCRIPT to only process one or a set of tables, and append to a file
@roadmap_1189_li @roadmap_1189_li
Support linked tables to the current database Support linked tables to the current database
...@@ -8599,13 +8632,19 @@ Improve SQL documentation, see http://www.w3schools.com/sql/ ...@@ -8599,13 +8632,19 @@ Improve SQL documentation, see http://www.w3schools.com/sql/
@roadmap_1383_li @roadmap_1383_li
MySQL compatibility: DatabaseMetaData.stores*() methods should return the same values. Test with SquirrelSQL. MySQL compatibility: DatabaseMetaData.stores*() methods should return the same values. Test with SquirrelSQL.
@roadmap_1384_h2 @roadmap_1384_li
Not Planned Support table partitioning.
@roadmap_1385_li @roadmap_1385_li
MS SQL Server compatibility: support DATEPART syntax.
@roadmap_1386_h2
Not Planned
@roadmap_1387_li
HSQLDB (did) support this: select id i from test where i&lt;0 (other databases don't). Supporting it may break compatibility. HSQLDB (did) support this: select id i from test where i&lt;0 (other databases don't). Supporting it may break compatibility.
@roadmap_1386_li @roadmap_1388_li
String.intern (so that Strings can be compared with ==) will not be used because some VMs have problems when used extensively. String.intern (so that Strings can be compared with ==) will not be used because some VMs have problems when used extensively.
@search_1000_b @search_1000_b
......
...@@ -1150,7 +1150,7 @@ Centralリポジトリの利用 ...@@ -1150,7 +1150,7 @@ Centralリポジトリの利用
#Automated Build #Automated Build
@build_1064_p @build_1064_p
#This build process is automated and runs regularly. The build process includes running the tests and code coverage. The last results are available here: #This build process is automated and runs regularly. The build process includes running the tests and code coverage, using the command line <code>./build.sh clean jar coverage -Dh2.ftpPassword=... uploadBuild</code> . The last results are available here:
@build_1065_a @build_1065_a
#Test Output #Test Output
...@@ -1161,6 +1161,12 @@ Centralリポジトリの利用 ...@@ -1161,6 +1161,12 @@ Centralリポジトリの利用
@build_1067_a @build_1067_a
#Code Coverage Details (download, 1.3 MB) #Code Coverage Details (download, 1.3 MB)
@build_1068_a
#Build Newsfeed
@build_1069_a
#Latest Jar File (download, 1 MB)
@changelog_1000_h1 @changelog_1000_h1
変更履歴 変更履歴
...@@ -1168,1053 +1174,1056 @@ Centralリポジトリの利用 ...@@ -1168,1053 +1174,1056 @@ Centralリポジトリの利用
#Next Version (unreleased) #Next Version (unreleased)
@changelog_1002_li @changelog_1002_li
#- #H2 Console: command line properties are now longer stored in the properties file. They are now only used for the current process, except if they are explicitly saved.
@changelog_1003_h2 @changelog_1003_li
#Cache: support for a second level soft-references cache. To enable it, append ;CACHE_TYPE=SOFT_LRU (or SOFT_TQ) to the database URL, or set the system property h2.cacheTypeDefault to "SOFT_LRU" / "SOFT_TQ". Enabling the second level cache reduces performance for small databases, but speeds up large databases. It makes sense to use it if the available memory size is unknown. Thanks a lot to Jan Kotek!
@changelog_1004_h2
#Version 1.1.112 (2009-05-01) #Version 1.1.112 (2009-05-01)
@changelog_1004_li @changelog_1005_li
#JdbcPreparedStatement.toString() could throw a NullPointerException. #JdbcPreparedStatement.toString() could throw a NullPointerException.
@changelog_1005_li @changelog_1006_li
#EclipseLink: Added H2Platform.supportsIdentity(). #EclipseLink: Added H2Platform.supportsIdentity().
@changelog_1006_li @changelog_1007_li
#Connection pool: the default login timeout is now 5 minutes. #Connection pool: the default login timeout is now 5 minutes.
@changelog_1007_li @changelog_1008_li
#After truncating tables, opening large databases could become slow because indexes were always re-built unnecessarily when opening. #After truncating tables, opening large databases could become slow because indexes were always re-built unnecessarily when opening.
@changelog_1008_li @changelog_1009_li
#More bugs in the server-less multi-connection mode have been fixed: Sometimes parameters of prepared statements were lost when a reconnecting. Concurrent read operations were slow. To improve performance, executeQuery(..) must be used for queries (execute(..) switches to the write mode, which is slow). #More bugs in the server-less multi-connection mode have been fixed: Sometimes parameters of prepared statements were lost when a reconnecting. Concurrent read operations were slow. To improve performance, executeQuery(..) must be used for queries (execute(..) switches to the write mode, which is slow).
@changelog_1009_li @changelog_1010_li
#GROUP BY queries with a self-join (join to the same table) that were grouped by columns with indexes returned the wrong result in some cases. #GROUP BY queries with a self-join (join to the same table) that were grouped by columns with indexes returned the wrong result in some cases.
@changelog_1010_li @changelog_1011_li
#Improved error message when the .lock.db file modification time is in the future. #Improved error message when the .lock.db file modification time is in the future.
@changelog_1011_li @changelog_1012_li
#The MERGE statement now returns 0 as the generated key if the row was updated. #The MERGE statement now returns 0 as the generated key if the row was updated.
@changelog_1012_li @changelog_1013_li
#Running code coverage is now automated. #Running code coverage is now automated.
@changelog_1013_li @changelog_1014_li
#A file system implementation can now be registered using FileSystem.register. #A file system implementation can now be registered using FileSystem.register.
@changelog_1014_li @changelog_1015_li
#The database file system is no longer included in the jar file, it moved to the test section. #The database file system is no longer included in the jar file, it moved to the test section.
@changelog_1015_h2 @changelog_1016_h2
#Version 1.1.111 (2009-04-10) #Version 1.1.111 (2009-04-10)
@changelog_1016_li @changelog_1017_li
#In-memory databases can now run inside the Google App Engine. #In-memory databases can now run inside the Google App Engine.
@changelog_1017_li @changelog_1018_li
#Queries that are ordered by an indexed column returned no rows in certain cases (if all rows were deleted from the table previously, and there is a low number of rows in the table, and when not using other conditions, and when using the default b tree index). #Queries that are ordered by an indexed column returned no rows in certain cases (if all rows were deleted from the table previously, and there is a low number of rows in the table, and when not using other conditions, and when using the default b tree index).
@changelog_1018_li @changelog_1019_li
#The wrong exception was thrown when using unquoted text for the SQL statements COMMENT, ALTER USER, and SET PASSWORD. #The wrong exception was thrown when using unquoted text for the SQL statements COMMENT, ALTER USER, and SET PASSWORD.
@changelog_1019_li @changelog_1020_li
#The built-in connection pool did not roll back transactions and enable autocommit enabled after closing a connection. #The built-in connection pool did not roll back transactions and enable autocommit enabled after closing a connection.
@changelog_1020_li @changelog_1021_li
#Sometimes a StackOverflow occurred when checking for deadlock. See also http://code.google.com/p/h2database/issues/detail?id=61 #Sometimes a StackOverflow occurred when checking for deadlock. See also http://code.google.com/p/h2database/issues/detail?id=61
@changelog_1021_li @changelog_1022_li
#The Shell tool no longer truncates results with only one column, and displays a message if data was truncated. #The Shell tool no longer truncates results with only one column, and displays a message if data was truncated.
@changelog_1022_h2 @changelog_1023_h2
#Version 1.1.110 (2009-04-03) #Version 1.1.110 (2009-04-03)
@changelog_1023_li @changelog_1024_li
#Support for not persistent in-memory tables in regular (persistent) databases using CREATE MEMORY TABLE(..) NOT PERSISTENT. Thanks a lot to Sergi Vladykin for the patch! #Support for not persistent in-memory tables in regular (persistent) databases using CREATE MEMORY TABLE(..) NOT PERSISTENT. Thanks a lot to Sergi Vladykin for the patch!
@changelog_1024_li @changelog_1025_li
#The H2 Console trimmed the password (removed leading and trailing spaces). This is no longer the case, to support encrypted H2 database with an empty user password. #The H2 Console trimmed the password (removed leading and trailing spaces). This is no longer the case, to support encrypted H2 database with an empty user password.
@changelog_1025_li @changelog_1026_li
#The data type of a SUBSTRING method was wrong. #The data type of a SUBSTRING method was wrong.
@changelog_1026_li @changelog_1027_li
#ResultSet.findColumn and get methods with column label parameters now also check for matching column names (like most databases except MySQL). #ResultSet.findColumn and get methods with column label parameters now also check for matching column names (like most databases except MySQL).
@changelog_1027_li @changelog_1028_li
#H2 Console: the browser system property now supports a list of arguments. Example: java -Dh2.browser="open,-a,Safari,%url" ... #H2 Console: the browser system property now supports a list of arguments. Example: java -Dh2.browser="open,-a,Safari,%url" ...
@changelog_1028_li @changelog_1029_li
#Improved Javadoc navigation (similar to Scaladoc). #Improved Javadoc navigation (similar to Scaladoc).
@changelog_1029_li @changelog_1030_li
#H2 Console: auto-complete of identifiers did not work correctly for H2 databases in MySQL mode. #H2 Console: auto-complete of identifiers did not work correctly for H2 databases in MySQL mode.
@changelog_1030_li @changelog_1031_li
#DISTINCT and GROUP BY on a CLOB column was broken. #DISTINCT and GROUP BY on a CLOB column was broken.
@changelog_1031_li @changelog_1032_li
#The FTP server moved to the tools section and is no longer included in the h2*.jar file. #The FTP server moved to the tools section and is no longer included in the h2*.jar file.
@changelog_1032_li @changelog_1033_li
#Improved error message for unsupported features: now the message says what exactly is not supported. #Improved error message for unsupported features: now the message says what exactly is not supported.
@changelog_1033_li @changelog_1034_li
#Improved OSGi support. #Improved OSGi support.
@changelog_1034_li @changelog_1035_li
#Some internal caches did not use the LRU mechanism. Fixed (LOB file list, optimizer cost cache, trace system, view indexes, collection keys, compressed in-memory file system). #Some internal caches did not use the LRU mechanism. Fixed (LOB file list, optimizer cost cache, trace system, view indexes, collection keys, compressed in-memory file system).
@changelog_1035_li @changelog_1036_li
#The API of the tools changed a bit (each tool now returns an exit code). #The API of the tools changed a bit (each tool now returns an exit code).
@changelog_1036_li @changelog_1037_li
#Command line help of the tools now match the javadocs. The build converts the javadocs to a resource that is read by the tool at runtime. This should not have an effect on using the database, but it reduces duplicate and out-of-sync documentation. #Command line help of the tools now match the javadocs. The build converts the javadocs to a resource that is read by the tool at runtime. This should not have an effect on using the database, but it reduces duplicate and out-of-sync documentation.
@changelog_1037_li @changelog_1038_li
#CREATE TABLE: improved compatibility (support for UNIQUE NOT NULL). #CREATE TABLE: improved compatibility (support for UNIQUE NOT NULL).
@changelog_1038_li @changelog_1039_li
#DatabaseMetaData.getSQLKeywords now returns the correct list. #DatabaseMetaData.getSQLKeywords now returns the correct list.
@changelog_1039_li @changelog_1040_li
#Deterministic user defined functions did not work when the parameter was a column. Fixed. #Deterministic user defined functions did not work when the parameter was a column. Fixed.
@changelog_1040_li @changelog_1041_li
#JdbcConnectionPool.setLoginTimeout with 0 now uses the default timeout. #JdbcConnectionPool.setLoginTimeout with 0 now uses the default timeout.
@changelog_1041_li @changelog_1042_li
#Creating a JdbcConnectionPool has been simplified a bit. #Creating a JdbcConnectionPool has been simplified a bit.
@changelog_1042_li @changelog_1043_li
#The built-in connection pool did not re-use connections. Getting a connection using the built-in JdbcConnectionPool is now about 70 times faster than opening connections using DriverManager.getConnection. #The built-in connection pool did not re-use connections. Getting a connection using the built-in JdbcConnectionPool is now about 70 times faster than opening connections using DriverManager.getConnection.
@changelog_1043_li @changelog_1044_li
#More bugs in the server-less multi-connection mode have been fixed: If a process terminated while writing, other open connections were blocked. If two processes were writing to the database, sometimes the database was corrupt after closing. #More bugs in the server-less multi-connection mode have been fixed: If a process terminated while writing, other open connections were blocked. If two processes were writing to the database, sometimes the database was corrupt after closing.
@changelog_1044_li @changelog_1045_li
#Linked tables to SQLite database can now be created. #Linked tables to SQLite database can now be created.
@changelog_1045_li @changelog_1046_li
#Nested IN(IN(...)) didn't work. #Nested IN(IN(...)) didn't work.
@changelog_1046_li @changelog_1047_li
#NIO storage: the nio: prefix was using memory mapped files instead of FileChannel. #NIO storage: the nio: prefix was using memory mapped files instead of FileChannel.
@changelog_1047_h2 @changelog_1048_h2
#Version 1.1.109 (2009-03-14) #Version 1.1.109 (2009-03-14)
@changelog_1048_li @changelog_1049_li
#The optimization for IN(...) is now only used if comparing a column with an index. #The optimization for IN(...) is now only used if comparing a column with an index.
@changelog_1049_li @changelog_1050_li
#User defined functions can now be deterministic (see CREATE ALIAS documentation). #User defined functions can now be deterministic (see CREATE ALIAS documentation).
@changelog_1050_li @changelog_1051_li
#Multiple nested queries in the FROM clause with parameters did not always work. #Multiple nested queries in the FROM clause with parameters did not always work.
@changelog_1051_li @changelog_1052_li
#When converting CLOB to BINARY, each character resulted in one byte. Now, the text is parsed as a hex as when converting VARCHAR. #When converting CLOB to BINARY, each character resulted in one byte. Now, the text is parsed as a hex as when converting VARCHAR.
@changelog_1052_li @changelog_1053_li
#New experimental NIO storage mechanism with both FileChannel and memory mapped files. To use it, use the file name prefix nio: or nioMapped: as in jdbc:h2:nio:~/test. So far it looks like NIO storage is faster on Mac OS but slower on some Windows systems. Thanks a lot to Jan Kotek for the patch! #New experimental NIO storage mechanism with both FileChannel and memory mapped files. To use it, use the file name prefix nio: or nioMapped: as in jdbc:h2:nio:~/test. So far it looks like NIO storage is faster on Mac OS but slower on some Windows systems. Thanks a lot to Jan Kotek for the patch!
@changelog_1053_li @changelog_1054_li
#The functions BITOR, BITAND, BITXOR, and MOD now accept and return BIGINT instead of INT. #The functions BITOR, BITAND, BITXOR, and MOD now accept and return BIGINT instead of INT.
@changelog_1054_li @changelog_1055_li
#Could not use the same linked table multiple times in the same query. #Could not use the same linked table multiple times in the same query.
@changelog_1055_li @changelog_1056_li
#Bugs in the server-less multi-connection mode have been fixed. #Bugs in the server-less multi-connection mode have been fixed.
@changelog_1056_li @changelog_1057_li
#Column names could not be named "UNIQUE" (with the quotes). #Column names could not be named "UNIQUE" (with the quotes).
@changelog_1057_li @changelog_1058_li
#New system function TRANSACTION_ID() to get the current transaction identifier for a session. #New system function TRANSACTION_ID() to get the current transaction identifier for a session.
@changelog_1058_h2 @changelog_1059_h2
#Version 1.1.108 (2009-02-28) #Version 1.1.108 (2009-02-28)
@changelog_1059_li @changelog_1060_li
#When the shutdown hook closed the database, the last log file was deleted too early. This could cause uncommitted changes to be persisted. In some cases, this could cause data corruption. #When the shutdown hook closed the database, the last log file was deleted too early. This could cause uncommitted changes to be persisted. In some cases, this could cause data corruption.
@changelog_1060_li @changelog_1061_li
#JdbcConnectionPool: it was possible to set a negative connection pool size. #JdbcConnectionPool: it was possible to set a negative connection pool size.
@changelog_1061_li @changelog_1062_li
#Fulltext search did not support table names with a backslash. #Fulltext search did not support table names with a backslash.
@changelog_1062_li @changelog_1063_li
#The internal IntArray class did not work correctly when initialized with a zero length array. #The internal IntArray class did not work correctly when initialized with a zero length array.
@changelog_1063_li @changelog_1064_li
#The H2 Console web application (war file) did only support ASCII characters. Now UTF-8 is supported. #The H2 Console web application (war file) did only support ASCII characters. Now UTF-8 is supported.
@changelog_1064_li @changelog_1065_li
#DATEADD does no longer require that the argument is a timestamp. #DATEADD does no longer require that the argument is a timestamp.
@changelog_1065_li @changelog_1066_li
#The database file locking mechanism didn't work correctly on Mac OS. #The database file locking mechanism didn't work correctly on Mac OS.
@changelog_1066_li @changelog_1067_li
#Some built-in functions reported the wrong precision, scale, and display size. #Some built-in functions reported the wrong precision, scale, and display size.
@changelog_1067_li @changelog_1068_li
#MySQL compatibility for CREATE TABLE is improved (UNSIGNED, KEY). #MySQL compatibility for CREATE TABLE is improved (UNSIGNED, KEY).
@changelog_1068_li @changelog_1069_li
#Recovery did not work if there were more than 255 lobs stored as files. #Recovery did not work if there were more than 255 lobs stored as files.
@changelog_1069_li @changelog_1070_li
#New experimental mode to support multiple read-write connections without starting a server. To enable this mode, append ;FILE_LOCK=SERIALIZED;OPEN_NEW=TRUE to the database URL. Don't expect high performance when multiple concurrent writers. #New experimental mode to support multiple read-write connections without starting a server. To enable this mode, append ;FILE_LOCK=SERIALIZED;OPEN_NEW=TRUE to the database URL. Don't expect high performance when multiple concurrent writers.
@changelog_1070_li @changelog_1071_li
#In a web application, the database classes are not unloaded if a connection is open. This may cause out of memory when re-deploying a web application. The DbStarter is changed to close all connections to the configured database (by executing SHUTDOWN). #In a web application, the database classes are not unloaded if a connection is open. This may cause out of memory when re-deploying a web application. The DbStarter is changed to close all connections to the configured database (by executing SHUTDOWN).
@changelog_1071_li @changelog_1072_li
#The WebServlet did not close the database when un-deploying the web application. #The WebServlet did not close the database when un-deploying the web application.
@changelog_1072_li @changelog_1073_li
#The exception message of failed INSERT or MERGE statements now includes all values and the row number. #The exception message of failed INSERT or MERGE statements now includes all values and the row number.
@changelog_1073_li @changelog_1074_li
#If opening a database failed with an out of memory exception, some files were not closed. #If opening a database failed with an out of memory exception, some files were not closed.
@changelog_1074_li @changelog_1075_li
#Optimizer: the expected runtime calculation was incorrect. The fixed calculation should give slightly better query plans when using many joins. #Optimizer: the expected runtime calculation was incorrect. The fixed calculation should give slightly better query plans when using many joins.
@changelog_1075_li @changelog_1076_li
#Improved exception message when connecting to a just started server fails. #Improved exception message when connecting to a just started server fails.
@changelog_1076_li @changelog_1077_li
#Connection.isValid is a bit faster. #Connection.isValid is a bit faster.
@changelog_1077_li @changelog_1078_li
#H2 Console: The autocomplete feature has been improved a bit. It can now better parse conditions. #H2 Console: The autocomplete feature has been improved a bit. It can now better parse conditions.
@changelog_1078_li @changelog_1079_li
#When restarting a web application in Tomcat, an exception was thrown sometimes. In most cases this was a NullPointerException. A workaround in H2 has been implemented. The root cause of the problem is now documented in the FAQ: Tomcat sets all static fields (final or non-final) to null when unloading a web application. A workaround is to put the h2.jar in the lib directory, or set the system property org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES to false. #When restarting a web application in Tomcat, an exception was thrown sometimes. In most cases this was a NullPointerException. A workaround in H2 has been implemented. The root cause of the problem is now documented in the FAQ: Tomcat sets all static fields (final or non-final) to null when unloading a web application. A workaround is to put the h2.jar in the lib directory, or set the system property org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES to false.
@changelog_1079_h2 @changelog_1080_h2
#Version 1.1.107 (2009-01-24) #Version 1.1.107 (2009-01-24)
@changelog_1080_li @changelog_1081_li
#Some DatabaseMetaData operations did not work for non-admin users for versions 1.1.x. #Some DatabaseMetaData operations did not work for non-admin users for versions 1.1.x.
@changelog_1081_li @changelog_1082_li
#The MySQL compatibility extension fromUnixTime now used the English locale. #The MySQL compatibility extension fromUnixTime now used the English locale.
@changelog_1082_li @changelog_1083_li
#When using LOG=2 and repeatedly updating the last row rows of a table, the index file grew quickly. #When using LOG=2 and repeatedly updating the last row rows of a table, the index file grew quickly.
@changelog_1083_li @changelog_1084_li
#In versions 1.1.105 and 1.1.106, encrypted script files of earlier versions could not be processed. This is now again possible. The problem was that such script files were stored in a special format (STORAGE=TEXT) but support for this format was removed in version 1.1.105. #In versions 1.1.105 and 1.1.106, encrypted script files of earlier versions could not be processed. This is now again possible. The problem was that such script files were stored in a special format (STORAGE=TEXT) but support for this format was removed in version 1.1.105.
@changelog_1084_li @changelog_1085_li
#Enabling the trace mechanism by creating a specially named file is no longer supported. #Enabling the trace mechanism by creating a specially named file is no longer supported.
@changelog_1085_h2 @changelog_1086_h2
#Version 1.1.106 (2009-01-04) #Version 1.1.106 (2009-01-04)
@changelog_1086_li @changelog_1087_li
#Statement.setQueryTimeout did not work correctly for some statements. #Statement.setQueryTimeout did not work correctly for some statements.
@changelog_1087_li @changelog_1088_li
#CREATE DOMAIN: Built-in data types can now only be changed if no tables exist. #CREATE DOMAIN: Built-in data types can now only be changed if no tables exist.
@changelog_1088_li @changelog_1089_li
#Linked tables: a workaround for Oracle DATE columns has been implemented. #Linked tables: a workaround for Oracle DATE columns has been implemented.
@changelog_1089_li @changelog_1090_li
#DatabaseMetaData.getPrimaryKeys: The column PK_NAME now contains the constraint name instead of the index name (compatibility for PostgreSQL and Derby). #DatabaseMetaData.getPrimaryKeys: The column PK_NAME now contains the constraint name instead of the index name (compatibility for PostgreSQL and Derby).
@changelog_1090_li @changelog_1091_li
#Using IN(..) inside a IN(SELECT..) did not always work. #Using IN(..) inside a IN(SELECT..) did not always work.
@changelog_1091_li @changelog_1092_li
#Views with IN(..) that used a view itself did not work. #Views with IN(..) that used a view itself did not work.
@changelog_1092_li @changelog_1093_li
#Union queries with LIMIT or ORDER BY that are used in a view or subquery did not work. #Union queries with LIMIT or ORDER BY that are used in a view or subquery did not work.
@changelog_1093_li @changelog_1094_li
#The license change a bit: so far the license was modified to say 'Swiss law'. This is now changed back to the original 'US law'. This was requested by a user, and I don't see a problem. #The license change a bit: so far the license was modified to say 'Swiss law'. This is now changed back to the original 'US law'. This was requested by a user, and I don't see a problem.
@changelog_1094_li @changelog_1095_li
#Constraints for local temporary tables now session scoped. So far they were global. Thanks a lot to Eric Faulhaber for finding and fixing this problem! #Constraints for local temporary tables now session scoped. So far they were global. Thanks a lot to Eric Faulhaber for finding and fixing this problem!
@changelog_1095_li @changelog_1096_li
#When using the auto-server mode, and if the lock file was modified in the future, the wrong exception was thrown ('Connection is broken' instead of 'Error opening database: Lock file modified in the future'). #When using the auto-server mode, and if the lock file was modified in the future, the wrong exception was thrown ('Connection is broken' instead of 'Error opening database: Lock file modified in the future').
@changelog_1096_h2 @changelog_1097_h2
#Version 1.1.105 (2008-12-19) #Version 1.1.105 (2008-12-19)
@changelog_1097_li @changelog_1098_li
#The setting STORAGE=TEXT is no longer supported. #The setting STORAGE=TEXT is no longer supported.
@changelog_1098_li @changelog_1099_li
#Deleting a database using the tool DeleteDbFiles deleted LOB files of other databases in the same directory. #Deleting a database using the tool DeleteDbFiles deleted LOB files of other databases in the same directory.
@changelog_1099_li @changelog_1100_li
#When used in a subquery, LIKE and IN(..) did not work correctly sometimes. #When used in a subquery, LIKE and IN(..) did not work correctly sometimes.
@changelog_1100_li @changelog_1101_li
#The fulltext search documentation has been improved. #The fulltext search documentation has been improved.
@changelog_1101_li @changelog_1102_li
#ARRAY_GET returned the wrong data type (ARRAY). Now it returns VARCHAR. #ARRAY_GET returned the wrong data type (ARRAY). Now it returns VARCHAR.
@changelog_1102_li @changelog_1103_li
#Natural join: the joined columns are not repeated any more when using SELECT *. #Natural join: the joined columns are not repeated any more when using SELECT *.
@changelog_1103_li @changelog_1104_li
#User defined aggregate functions: the method getType expected internal data types instead of SQL types. #User defined aggregate functions: the method getType expected internal data types instead of SQL types.
@changelog_1104_li @changelog_1105_li
#User defined aggregate functions did not work if there was no group by expression. #User defined aggregate functions did not work if there was no group by expression.
@changelog_1105_li @changelog_1106_li
#MySQL compatibility: support for := assignment as in @sum:=@sum+x #MySQL compatibility: support for := assignment as in @sum:=@sum+x
@changelog_1106_li @changelog_1107_li
#INSERT INTO TEST(SELECT * FROM TEST) is now supported. #INSERT INTO TEST(SELECT * FROM TEST) is now supported.
@changelog_1107_li @changelog_1108_li
#Each session threw an invisible exception when garbage collected. #Each session threw an invisible exception when garbage collected.
@changelog_1108_li @changelog_1109_li
#Foreign key constraints that refer to a quoted column did not work. #Foreign key constraints that refer to a quoted column did not work.
@changelog_1109_li @changelog_1110_li
#New meta data column INFORMATION_SCHEMA.TABLES.LAST_MODIFICATION to get the table modification counter. #New meta data column INFORMATION_SCHEMA.TABLES.LAST_MODIFICATION to get the table modification counter.
@changelog_1110_li @changelog_1111_li
#Shell: line comments didn't work correctly. #Shell: line comments didn't work correctly.
@changelog_1111_li @changelog_1112_li
#H2 Console: Columns are now listed for up to 500 tables instead of 100. #H2 Console: Columns are now listed for up to 500 tables instead of 100.
@changelog_1112_li @changelog_1113_li
#H2 Console: Cmd+Enter executes the current statement, Alt+Space for autocomplete. #H2 Console: Cmd+Enter executes the current statement, Alt+Space for autocomplete.
@changelog_1113_li @changelog_1114_li
#JaQu: the maximum length of a column can now be defined using maxLength. For an example, see Product.java (maxLength(category, 255)). #JaQu: the maximum length of a column can now be defined using maxLength. For an example, see Product.java (maxLength(category, 255)).
@changelog_1114_li @changelog_1115_li
#R&\#305;dvan A&\#287;ar has completed the Turkish translation of the H2 Console. Thanks a lot! #R&\#305;dvan A&\#287;ar has completed the Turkish translation of the H2 Console. Thanks a lot!
@changelog_1115_h2 @changelog_1116_h2
#Version 1.1.104 (2008-11-28) #Version 1.1.104 (2008-11-28)
@changelog_1116_li @changelog_1117_li
#If a query that was used like a table contained group by and was ordered by an expression that is not in the column list, an exception was thrown. #If a query that was used like a table contained group by and was ordered by an expression that is not in the column list, an exception was thrown.
@changelog_1117_li @changelog_1118_li
#JaQu: tables are now auto-created when running a query. #JaQu: tables are now auto-created when running a query.
@changelog_1118_li @changelog_1119_li
#The optimizer had problems with function tables (for example CSVREAD and FTL_SEARCH). A new system property h2.estimatedFunctionTableRows (default 1000) defines how many rows can be expected in the table. #The optimizer had problems with function tables (for example CSVREAD and FTL_SEARCH). A new system property h2.estimatedFunctionTableRows (default 1000) defines how many rows can be expected in the table.
@changelog_1119_li @changelog_1120_li
#The function SUM could overflow when using large values. It returns now a data type that is safe. #The function SUM could overflow when using large values. It returns now a data type that is safe.
@changelog_1120_li @changelog_1121_li
#The function AVG could overflow when using large values. Fixed. #The function AVG could overflow when using large values. Fixed.
@changelog_1121_li @changelog_1122_li
#The emergency reserve file has been removed. It didn't provide an appropriate solution for the problem. It is still possible for an application to detect and deal with the low disk space problem (deleting temporary files for example) using DatabaseEventListener.diskSpaceIsLow, but this method is now always called with stillAvailable=0. #The emergency reserve file has been removed. It didn't provide an appropriate solution for the problem. It is still possible for an application to detect and deal with the low disk space problem (deleting temporary files for example) using DatabaseEventListener.diskSpaceIsLow, but this method is now always called with stillAvailable=0.
@changelog_1122_li @changelog_1123_li
#Build: JAVA_HOME is now automatically detected on Mac OS X. #Build: JAVA_HOME is now automatically detected on Mac OS X.
@changelog_1123_li @changelog_1124_li
#Testing for local connections was very slow on some systems. #Testing for local connections was very slow on some systems.
@changelog_1124_li @changelog_1125_li
#The cache memory usage calculation is more conservative. #The cache memory usage calculation is more conservative.
@changelog_1125_li @changelog_1126_li
#Allocating space got slower and slower the larger the database. #Allocating space got slower and slower the larger the database.
@changelog_1126_li @changelog_1127_li
#ALTER TABLE ALTER COLUMN could throw the wrong exception in the last version (Table not found). #ALTER TABLE ALTER COLUMN could throw the wrong exception in the last version (Table not found).
@changelog_1127_li @changelog_1128_li
#Updatable result sets: the key columns can now be updated. #Updatable result sets: the key columns can now be updated.
@changelog_1128_li @changelog_1129_li
#The H2DatabaseProvider for ActiveObjects is now included in the tools section. #The H2DatabaseProvider for ActiveObjects is now included in the tools section.
@changelog_1129_li @changelog_1130_li
#The H2Platform for Oracle Toplink Essential has been improved a bit. #The H2Platform for Oracle Toplink Essential has been improved a bit.
@changelog_1130_li @changelog_1131_li
#The Windows service to start H2 didn't work in version 1.1. #The Windows service to start H2 didn't work in version 1.1.
@changelog_1131_li @changelog_1132_li
#File systems with a maximum file size (for example FAT) are now supported using the file prefix 'split:'. In this case the files are split in parts of 1 GB. Example URL: jdbc:h2:split:~/db/test. If you want to split into parts of 1 MB, use jdbc:h2:split:20:~/db/test (the part size is 1 &lt;&lt; x, the default is 30 meaning 1 GB). #File systems with a maximum file size (for example FAT) are now supported using the file prefix 'split:'. In this case the files are split in parts of 1 GB. Example URL: jdbc:h2:split:~/db/test. If you want to split into parts of 1 MB, use jdbc:h2:split:20:~/db/test (the part size is 1 &lt;&lt; x, the default is 30 meaning 1 GB).
@changelog_1132_li @changelog_1133_li
#The database now tries to detect if the classloader or virtual machine has almost shut down by checking if static final variables are set to null. This should help reduce exceptions when stopping the web application. #The database now tries to detect if the classloader or virtual machine has almost shut down by checking if static final variables are set to null. This should help reduce exceptions when stopping the web application.
@changelog_1133_li @changelog_1134_li
#Compatibility for MS SQL Server DATEDIFF(YYYY, .., ..) #Compatibility for MS SQL Server DATEDIFF(YYYY, .., ..)
@changelog_1134_li @changelog_1135_li
#ResultSet.getObject for CLOB or BLOB will return a java.sql.Clob / java.sql.Blob object instead of a java.io.Reader / java.io.InputStream as in version 1.0. This behavior can be changed using the system property h2.returnLobObjects (true by default for version 1.1). #ResultSet.getObject for CLOB or BLOB will return a java.sql.Clob / java.sql.Blob object instead of a java.io.Reader / java.io.InputStream as in version 1.0. This behavior can be changed using the system property h2.returnLobObjects (true by default for version 1.1).
@changelog_1135_li @changelog_1136_li
#The interface CloseListener has a new method 'remove' that is called when the trigger is dropped. #The interface CloseListener has a new method 'remove' that is called when the trigger is dropped.
@changelog_1136_li @changelog_1137_li
#Fulltext search: there was a memory leak when creating and dropping fulltext indexes in a loop. #Fulltext search: there was a memory leak when creating and dropping fulltext indexes in a loop.
@changelog_1137_h2 @changelog_1138_h2
#Version 1.1.103 (2008-11-07) #Version 1.1.103 (2008-11-07)
@changelog_1138_li @changelog_1139_li
#Could not order by a formula when the formula was in the group by list but not in the select list. #Could not order by a formula when the formula was in the group by list but not in the select list.
@changelog_1139_li @changelog_1140_li
#Date values that match the daylight saving time end were not allowed in times zones were the daylight saving time ends at midnight, for years larger than 2037. Example: timezone Brasilia, date 2042-10-12. This is a problem of Java, however a workaround is implemented in H2 that solves most problems (except the problems of java.util.Date itself). #Date values that match the daylight saving time end were not allowed in times zones were the daylight saving time ends at midnight, for years larger than 2037. Example: timezone Brasilia, date 2042-10-12. This is a problem of Java, however a workaround is implemented in H2 that solves most problems (except the problems of java.util.Date itself).
@changelog_1140_li @changelog_1141_li
#ALTER TABLE used a lot of memory when using multi-version concurrency. #ALTER TABLE used a lot of memory when using multi-version concurrency.
@changelog_1141_li @changelog_1142_li
#Referential integrity for in-memory databases didn't work in some cases in version 1.1.102. #Referential integrity for in-memory databases didn't work in some cases in version 1.1.102.
@changelog_1142_li @changelog_1143_li
#New column INFORMATION_SCHEMA.COLUMNS.SEQUENCE_NAME to get the name of the sequence for auto-increment columns. #New column INFORMATION_SCHEMA.COLUMNS.SEQUENCE_NAME to get the name of the sequence for auto-increment columns.
@changelog_1143_li @changelog_1144_li
#Aliases for built-in data types (such as MEDIUMBLOB which is an alias for BLOB) can now be re-mapped to another data type using CREATE DOMAIN. However main built-in data types (such as INTEGER) can not be re-mapped. #Aliases for built-in data types (such as MEDIUMBLOB which is an alias for BLOB) can now be re-mapped to another data type using CREATE DOMAIN. However main built-in data types (such as INTEGER) can not be re-mapped.
@changelog_1144_li @changelog_1145_li
#The Japanese translation has been completed by Masahiro Ikemoto. Thanks a lot! #The Japanese translation has been completed by Masahiro Ikemoto. Thanks a lot!
@changelog_1145_li @changelog_1146_li
#Improved PostgreSQL compatibility for NEXTVAL and CURRVAL. #Improved PostgreSQL compatibility for NEXTVAL and CURRVAL.
@changelog_1146_li @changelog_1147_li
#Less heap memory is needed when multiple databases are open at the same time: The memory reserve (used to rollback after out of memory) is now global and no longer allocated for each database separately. #Less heap memory is needed when multiple databases are open at the same time: The memory reserve (used to rollback after out of memory) is now global and no longer allocated for each database separately.
@changelog_1147_li @changelog_1148_li
#New system property h2.browser to set the browser to use. #New system property h2.browser to set the browser to use.
@changelog_1148_li @changelog_1149_li
#To start the browser, java.awt.Desktop.browse is now used if available. #To start the browser, java.awt.Desktop.browse is now used if available.
@changelog_1149_h2 @changelog_1150_h2
#Version 1.1.102 (2008-10-24) #Version 1.1.102 (2008-10-24)
@changelog_1150_li @changelog_1151_li
#The French translation of the H2 Console has been improved by Olivier Parent. Thanks a lot! #The French translation of the H2 Console has been improved by Olivier Parent. Thanks a lot!
@changelog_1151_li @changelog_1152_li
#There was a memory leak when creating and dropping tables and indexes in a loop (persistent database only). #There was a memory leak when creating and dropping tables and indexes in a loop (persistent database only).
@changelog_1152_li @changelog_1153_li
#SET LOG 2 was not effective if executed after opening the database. #SET LOG 2 was not effective if executed after opening the database.
@changelog_1153_li @changelog_1154_li
#Translating the H2 Console is now simpler. #Translating the H2 Console is now simpler.
@changelog_1154_li @changelog_1155_li
#Common exception (error code 23*) are no longer written to the .trace.db file by default. #Common exception (error code 23*) are no longer written to the .trace.db file by default.
@changelog_1155_li @changelog_1156_li
#In-memory databases don't write LOBs to files any longer. #In-memory databases don't write LOBs to files any longer.
@changelog_1156_li @changelog_1157_li
#Self referencing constraints didn't restrict deleting rows that reference itself if there is another row that references it. #Self referencing constraints didn't restrict deleting rows that reference itself if there is another row that references it.
@changelog_1157_li @changelog_1158_li
#ResultSetMetaData.getColumnName now returns the alias name except for columns. #ResultSetMetaData.getColumnName now returns the alias name except for columns.
@changelog_1158_li @changelog_1159_li
#Temporary files are now deleted when the database is closed, even if they were not garbage collected so far. #Temporary files are now deleted when the database is closed, even if they were not garbage collected so far.
@changelog_1159_h2 @changelog_1160_h2
#Version 1.1.101 (2008-10-17) #Version 1.1.101 (2008-10-17)
@changelog_1160_li @changelog_1161_li
#Errors with code 42000 - 42999 are no longer written to the trace file by default. #Errors with code 42000 - 42999 are no longer written to the trace file by default.
@changelog_1161_li @changelog_1162_li
#Queries with more than 10 tables are now faster. #Queries with more than 10 tables are now faster.
@changelog_1162_li @changelog_1163_li
#Opening a connection with AUTO_SERVER=TRUE is now fast when the database is already open in another process (less than 0.01 seconds instead of 2 seconds). #Opening a connection with AUTO_SERVER=TRUE is now fast when the database is already open in another process (less than 0.01 seconds instead of 2 seconds).
@changelog_1163_li @changelog_1164_li
#IF [NOT] EXISTS is supported for named constraints in ALTER TABLE ... ADD/DROP CONSTRAINT. #IF [NOT] EXISTS is supported for named constraints in ALTER TABLE ... ADD/DROP CONSTRAINT.
@changelog_1164_li @changelog_1165_li
#The error messages have been translated to Spanish by Dario V. Fassi. Thanks a lot! #The error messages have been translated to Spanish by Dario V. Fassi. Thanks a lot!
@changelog_1165_li @changelog_1166_li
#Linked tables: the automatic connection sharing didn't work. Actually the system property h2.shareLinkedConnections was working in the opposite direction: it was disabled when set to true. Now it works as expected. #Linked tables: the automatic connection sharing didn't work. Actually the system property h2.shareLinkedConnections was working in the opposite direction: it was disabled when set to true. Now it works as expected.
@changelog_1166_li @changelog_1167_li
#Opening large database is now faster. #Opening large database is now faster.
@changelog_1167_li @changelog_1168_li
#New system property h2.socketConnectTimeout, the timeout in milliseconds to connect to a server. The default is 2000 (2 seconds). #New system property h2.socketConnectTimeout, the timeout in milliseconds to connect to a server. The default is 2000 (2 seconds).
@changelog_1168_li @changelog_1169_li
#The wrong parameters were bound to subqueries with parameters, specially when using IN(SELECT ...) and IN(...). #The wrong parameters were bound to subqueries with parameters, specially when using IN(SELECT ...) and IN(...).
@changelog_1169_li @changelog_1170_li
#Unset parameters were not detected when the query was re-compiled. #Unset parameters were not detected when the query was re-compiled.
@changelog_1170_li @changelog_1171_li
#New functions ISO_YEAR, ISO_WEEK, ISO_DAY_OF_WEEK. Thanks a lot to Robert Rathsack for implementing those! #New functions ISO_YEAR, ISO_WEEK, ISO_DAY_OF_WEEK. Thanks a lot to Robert Rathsack for implementing those!
@changelog_1171_li @changelog_1172_li
#The date functions DAYOFYEAR, DAYOFMONTH, DAYOFWEEK are now called DAY_OF_YEAR, DAY_OF_MONTH, DAY_OF_WEEK (the old names still work). #The date functions DAYOFYEAR, DAYOFMONTH, DAYOFWEEK are now called DAY_OF_YEAR, DAY_OF_MONTH, DAY_OF_WEEK (the old names still work).
@changelog_1172_li @changelog_1173_li
#An out of memory error while deleting or updating many rows could result in a strange exception. #An out of memory error while deleting or updating many rows could result in a strange exception.
@changelog_1173_li @changelog_1174_li
#Linked tables: compatibility with MS SQL Server has been improved. #Linked tables: compatibility with MS SQL Server has been improved.
@changelog_1174_li @changelog_1175_li
#Renaming tables that have foreign keys with cascade didn't work correctly. #Renaming tables that have foreign keys with cascade didn't work correctly.
@changelog_1175_li @changelog_1176_li
#The auto-reconnect feature didn't work when using the auto-server mode. Fixed. #The auto-reconnect feature didn't work when using the auto-server mode. Fixed.
@changelog_1176_li @changelog_1177_li
#Fulltext search: new method FT_DROP_INDEX. #Fulltext search: new method FT_DROP_INDEX.
@changelog_1177_li @changelog_1178_li
#The optimization to group using an index didn't work in some cases in version 1.1 (see also system property h2.optimizeGroupSorted). #The optimization to group using an index didn't work in some cases in version 1.1 (see also system property h2.optimizeGroupSorted).
@changelog_1178_li @changelog_1179_li
#OSGi meta data is included in the manifest file. An OSGi BundleActivator is included: it loads the database driver when starting the bundle, and unloads it when stopping the bundle. #OSGi meta data is included in the manifest file. An OSGi BundleActivator is included: it loads the database driver when starting the bundle, and unloads it when stopping the bundle.
@changelog_1179_li @changelog_1180_li
#The default value for MAX_MEMORY_UNDO is now 50000. #The default value for MAX_MEMORY_UNDO is now 50000.
@changelog_1180_li @changelog_1181_li
#For alias columns, ResultSetMetaData.getTableName() and getColumnName() now return the real table and column name in the default mode. #For alias columns, ResultSetMetaData.getTableName() and getColumnName() now return the real table and column name in the default mode.
@changelog_1181_li @changelog_1182_li
#In SQL scripts created with SCRIPT TO, schemas are now only created if they don't exist yet. #In SQL scripts created with SCRIPT TO, schemas are now only created if they don't exist yet.
@changelog_1182_li @changelog_1183_li
#After re-connecting to a database, the database event listener (if set) is informed about it. #After re-connecting to a database, the database event listener (if set) is informed about it.
@changelog_1183_li @changelog_1184_li
#Local temporary tables now support indexes. Thanks a lot to Matt Roy! #Local temporary tables now support indexes. Thanks a lot to Matt Roy!
@changelog_1184_li @changelog_1185_li
#RUNSCRIPT no longer uses a temporary file. #RUNSCRIPT no longer uses a temporary file.
@changelog_1185_li @changelog_1186_li
#New system table INFORMATION_SCHEMA.SESSION_STATE containing the SQL statements that make up the session state. The list currently contains variables (SET @..) and local temporary tables (without data). #New system table INFORMATION_SCHEMA.SESSION_STATE containing the SQL statements that make up the session state. The list currently contains variables (SET @..) and local temporary tables (without data).
@changelog_1186_li @changelog_1187_li
#After an automatic re-connect, part of the session state stays (the part that is stored in the SESSION_STATE table). #After an automatic re-connect, part of the session state stays (the part that is stored in the SESSION_STATE table).
@changelog_1187_li @changelog_1188_li
#The build didn't work if the directory temp didn't exist before. #The build didn't work if the directory temp didn't exist before.
@changelog_1188_li @changelog_1189_li
#New system property h2.maxReconnect (default 3) to limit the number of re-connects for the same SQL statement (this is usually only important for SHUTDOWN). #New system property h2.maxReconnect (default 3) to limit the number of re-connects for the same SQL statement (this is usually only important for SHUTDOWN).
@changelog_1189_li @changelog_1190_li
#WHERE .. IN (SELECT ...) could throw a NullPointerException. #WHERE .. IN (SELECT ...) could throw a NullPointerException.
@changelog_1190_li @changelog_1191_li
#Improved Glassfish / Toplink support in H2Platform thanks to Marcio Borges from Brazil. Thanks a lot! #Improved Glassfish / Toplink support in H2Platform thanks to Marcio Borges from Brazil. Thanks a lot!
@changelog_1191_h2 @changelog_1192_h2
#Version 1.1.100 (2008-10-04) #Version 1.1.100 (2008-10-04)
@changelog_1192_li @changelog_1193_li
#In version 1.1, the following system properties are now enabled by default: h2.lobFilesInDirectories, h2.optimizeGroupSorted, h2.optimizeInJoin, h2.shareLinkedConnections #In version 1.1, the following system properties are now enabled by default: h2.lobFilesInDirectories, h2.optimizeGroupSorted, h2.optimizeInJoin, h2.shareLinkedConnections
@changelog_1193_li @changelog_1194_li
#The H2 Console tool now works with the JDBC-ODBC bridge. #The H2 Console tool now works with the JDBC-ODBC bridge.
@changelog_1194_li @changelog_1195_li
#The H2 Console tool now supports command line options to start things separately. #The H2 Console tool now supports command line options to start things separately.
@changelog_1195_li @changelog_1196_li
#Large objects did not work for in-memory databases in server mode in Linux. #Large objects did not work for in-memory databases in server mode in Linux.
@changelog_1196_li @changelog_1197_li
#Connections from a local address other than 'localhost' were not allowed if remote connections were disabled. This was always a problem, but only got visible in the last release because the server no longer connects to 'localhost' if networked. #Connections from a local address other than 'localhost' were not allowed if remote connections were disabled. This was always a problem, but only got visible in the last release because the server no longer connects to 'localhost' if networked.
@changelog_1197_li @changelog_1198_li
#The h2console.war can now be built using the Java build. #The h2console.war can now be built using the Java build.
@changelog_1198_li @changelog_1199_li
#By default, databases are shared in the same process. For read-only databases this causes unnecessary synchronization, but safes memory. If you want that each connection opens its own database, append ;OPEN_NEW=TRUE to the database URL. #By default, databases are shared in the same process. For read-only databases this causes unnecessary synchronization, but safes memory. If you want that each connection opens its own database, append ;OPEN_NEW=TRUE to the database URL.
@changelog_1199_li @changelog_1200_li
#New auto-reconnect feature will cause the JDBC driver to reconnect to the database if the connection is lost. To enable, append ;AUTO_RECONNECT=TRUE to the database URL. This is specially helpful when using AUTO_SERVER. AUTO_SERVER automatically uses auto-reconnect. #New auto-reconnect feature will cause the JDBC driver to reconnect to the database if the connection is lost. To enable, append ;AUTO_RECONNECT=TRUE to the database URL. This is specially helpful when using AUTO_SERVER. AUTO_SERVER automatically uses auto-reconnect.
@changelog_1200_li @changelog_1201_li
#CreateCluster: the property 'serverlist' is now called 'serverList'. #CreateCluster: the property 'serverlist' is now called 'serverList'.
@changelog_1201_li @changelog_1202_li
#The ConvertTraceFile tool could not parse some files because the trace mechanism did not encode prepared statement parameters. #The ConvertTraceFile tool could not parse some files because the trace mechanism did not encode prepared statement parameters.
@changelog_1202_li @changelog_1203_li
#Databases names can now be one character long (the minimum size used to be 2 characters). #Databases names can now be one character long (the minimum size used to be 2 characters).
@changelog_1203_h2 @changelog_1204_h2
#Version 1.0.79 (2008-09-26) #Version 1.0.79 (2008-09-26)
@changelog_1204_li @changelog_1205_li
#Linked tables that point to the same database can now share the connection within the same database. Access to the same connection is serialized. To enable this feature, set the system property h2.shareLinkedConnections to true. #Linked tables that point to the same database can now share the connection within the same database. Access to the same connection is serialized. To enable this feature, set the system property h2.shareLinkedConnections to true.
@changelog_1205_li @changelog_1206_li
#Multiple processes can now access the same database without having to explicitly start the server. To do that, append ;AUTO_SERVER=TRUE to the database URL. In this case, the server is started automatically if the connection is in embedded mode, and the server mode is used if a server is running. If the process that opened the first connection is closed, the other client need to reconnect (there is no automatic re-connect so far). Remote connections are allowed, but only to this database. #Multiple processes can now access the same database without having to explicitly start the server. To do that, append ;AUTO_SERVER=TRUE to the database URL. In this case, the server is started automatically if the connection is in embedded mode, and the server mode is used if a server is running. If the process that opened the first connection is closed, the other client need to reconnect (there is no automatic re-connect so far). Remote connections are allowed, but only to this database.
@changelog_1206_li @changelog_1207_li
#The server tool now displays the correct IP address if networked. #The server tool now displays the correct IP address if networked.
@changelog_1207_li @changelog_1208_li
#Can now start a TCP server with port 0 (automatically select a port). #Can now start a TCP server with port 0 (automatically select a port).
@changelog_1208_li @changelog_1209_li
#Result sets with just a unique index can now be updated (previously a primary key was required). #Result sets with just a unique index can now be updated (previously a primary key was required).
@changelog_1209_li @changelog_1210_li
#LINKED TABLE: the schema name can now be set. When multiple tables exist in different schema, and the schema name is not set, an exception is thrown. #LINKED TABLE: the schema name can now be set. When multiple tables exist in different schema, and the schema name is not set, an exception is thrown.
@changelog_1210_li @changelog_1211_li
#LINKED TABLE: worked around a bug in Oracle with the CHAR data type. #LINKED TABLE: worked around a bug in Oracle with the CHAR data type.
@changelog_1211_li @changelog_1212_li
#Faster hash code calculation for large binary arrays. #Faster hash code calculation for large binary arrays.
@changelog_1212_li @changelog_1213_li
#Faster storage re-use algorithm thanks to Greg Dhuse from cleversafe.com. #Faster storage re-use algorithm thanks to Greg Dhuse from cleversafe.com.
@changelog_1213_li @changelog_1214_li
#The database supports the SHOW command for better MySQL and PostgreSQL compatibility. #The database supports the SHOW command for better MySQL and PostgreSQL compatibility.
@changelog_1214_li @changelog_1215_li
#The H2 Console now abbreviates large texts in results. #The H2 Console now abbreviates large texts in results.
@changelog_1215_li @changelog_1216_li
#Multiple UNION queries could not be used in derived tables. #Multiple UNION queries could not be used in derived tables.
@changelog_1216_li @changelog_1217_li
#Linked tables can now be read-only. #Linked tables can now be read-only.
@changelog_1217_li @changelog_1218_li
#Temporary linked tables are now supported. #Temporary linked tables are now supported.
@changelog_1218_li @changelog_1219_li
#It was possible to create tables in read-only databases. #It was possible to create tables in read-only databases.
@changelog_1219_li @changelog_1220_li
#SET SCHEMA_SEARCH_PATH is now documented. #SET SCHEMA_SEARCH_PATH is now documented.
@changelog_1220_li @changelog_1221_li
#SET SCHEMA did not work for views. #SET SCHEMA did not work for views.
@changelog_1221_li @changelog_1222_li
#Row level locking for MVCC is now enabled. The exception 'Concurrent update in table ...' is still thrown, but only after the lock timeout. #Row level locking for MVCC is now enabled. The exception 'Concurrent update in table ...' is still thrown, but only after the lock timeout.
@changelog_1222_li @changelog_1223_li
#The maximum log file size setting was ignored for large databases. #The maximum log file size setting was ignored for large databases.
@changelog_1223_li @changelog_1224_li
#Multi-Version Concurrency (MVCC) may no longer be used when using the multi-threaded kernel feature (MULTI_THREADED). An exception is thrown when trying to connect with both settings. Additional synchronization is required before those features can be used together. #Multi-Version Concurrency (MVCC) may no longer be used when using the multi-threaded kernel feature (MULTI_THREADED). An exception is thrown when trying to connect with both settings. Additional synchronization is required before those features can be used together.
@changelog_1224_li @changelog_1225_li
#The data type JAVA_OBJECT could not be used in updatable result sets. #The data type JAVA_OBJECT could not be used in updatable result sets.
@changelog_1225_li @changelog_1226_li
#The system property h2.optimizeInJoin did not work correctly. #The system property h2.optimizeInJoin did not work correctly.
@changelog_1226_li @changelog_1227_li
#Conditions such as ID=? AND ID>? were slow. #Conditions such as ID=? AND ID>? were slow.
@changelog_1227_h2 @changelog_1228_h2
#Version 1.0.78 (2008-08-28) #Version 1.0.78 (2008-08-28)
@changelog_1228_li @changelog_1229_li
#The documentation no longer uses a frameset (except the Javadocs). #The documentation no longer uses a frameset (except the Javadocs).
@changelog_1229_li @changelog_1230_li
#When using DB_CLOSE_DELAY, sometimes a NullPointerException is thrown when the database is opened almost at the same time as it is closed automatically. Thanks a lot to Dmitry Pekar for finding this! #When using DB_CLOSE_DELAY, sometimes a NullPointerException is thrown when the database is opened almost at the same time as it is closed automatically. Thanks a lot to Dmitry Pekar for finding this!
@changelog_1230_li @changelog_1231_li
#Java methods with variable number of parameters can now be used (for Java 1.5 or newer). #Java methods with variable number of parameters can now be used (for Java 1.5 or newer).
@changelog_1231_li @changelog_1232_li
#The Japanese translation has been improved by Masahiro Ikemoto. Thanks a lot! #The Japanese translation has been improved by Masahiro Ikemoto. Thanks a lot!
@changelog_1232_li @changelog_1233_li
#The H2 Console replaced an empty user name with a single space. #The H2 Console replaced an empty user name with a single space.
@changelog_1233_li @changelog_1234_li
#The build target 'build jarSmall' now includes the embedded database. #The build target 'build jarSmall' now includes the embedded database.
@changelog_1234_li @changelog_1235_li
#JdbcDataSource now keeps the password in a char array where possible. #JdbcDataSource now keeps the password in a char array where possible.
@changelog_1235_li @changelog_1236_li
#ResultSet.absolute did not always work with large result sets. #ResultSet.absolute did not always work with large result sets.
@changelog_1236_li @changelog_1237_li
#Column aliases can now be used in GROUP BY and HAVING. #Column aliases can now be used in GROUP BY and HAVING.
@changelog_1237_li @changelog_1238_li
#Jason Brittain has contributed MySQL date functions. Thanks a lot! They are not in the h2.jar file currently, but in src/tools/org/h2/mode/FunctionsMySQL.java. To install, add this class to the classpath and call FunctionsMySQL.register(conn) in the Java code. #Jason Brittain has contributed MySQL date functions. Thanks a lot! They are not in the h2.jar file currently, but in src/tools/org/h2/mode/FunctionsMySQL.java. To install, add this class to the classpath and call FunctionsMySQL.register(conn) in the Java code.
@changelog_1238_h2 @changelog_1239_h2
#Version 1.0.77 (2008-08-16) #Version 1.0.77 (2008-08-16)
@changelog_1239_li @changelog_1240_li
#JaQu is now using prepared statements and supports Date, Time, Timestamp. #JaQu is now using prepared statements and supports Date, Time, Timestamp.
@changelog_1240_li @changelog_1241_li
#When using remote in-memory databases, large LOB objects did not work. #When using remote in-memory databases, large LOB objects did not work.
@changelog_1241_li @changelog_1242_li
#Timestamp columns such as TIMESTAMP(6) were not compatible to other database. #Timestamp columns such as TIMESTAMP(6) were not compatible to other database.
@changelog_1242_li @changelog_1243_li
#Opening a large database was slow if there was a problem opening the previous time. #Opening a large database was slow if there was a problem opening the previous time.
@changelog_1243_li @changelog_1244_li
#NOT IN(SELECT ...) was incorrect if the subquery returns no rows. #NOT IN(SELECT ...) was incorrect if the subquery returns no rows.
@changelog_1244_li @changelog_1245_li
#CREATE TABLE AS SELECT did not work correctly in the multi-version concurrency mode. #CREATE TABLE AS SELECT did not work correctly in the multi-version concurrency mode.
@changelog_1245_li @changelog_1246_li
#Support a comma before closing a list, as in: create table test(id int,) #Support a comma before closing a list, as in: create table test(id int,)
@changelog_1246_li @changelog_1247_li
#MySQL compatibility: linked tables had lower case column names on some systems. #MySQL compatibility: linked tables had lower case column names on some systems.
@changelog_1247_li @changelog_1248_li
#DB2 compatibility: the DB2 fetch-first-clause is supported. #DB2 compatibility: the DB2 fetch-first-clause is supported.
@changelog_1248_li @changelog_1249_li
#Oracle compatibility: old style outer join syntax using (+) did work correctly sometimes. #Oracle compatibility: old style outer join syntax using (+) did work correctly sometimes.
@changelog_1249_li @changelog_1250_li
#ResultSet.setFetchSize is now supported. #ResultSet.setFetchSize is now supported.
@changelog_1250_li @changelog_1251_li
#It has been reported that when using Install4j on some Linux systems and enabling the 'pack200' option, the h2.jar becomes corrupted by the install process, causing application failure. A workaround is to add an empty file h2.jar.nopack next to the h2.jar file. The reason for this problem is not known. #It has been reported that when using Install4j on some Linux systems and enabling the 'pack200' option, the h2.jar becomes corrupted by the install process, causing application failure. A workaround is to add an empty file h2.jar.nopack next to the h2.jar file. The reason for this problem is not known.
@changelog_1251_h2 @changelog_1252_h2
#Version 1.0.76 (2008-07-27) #Version 1.0.76 (2008-07-27)
@changelog_1252_li @changelog_1253_li
#The comment of a domain (user defined data type) is now used as the default column comment when creating a column with this domain. #The comment of a domain (user defined data type) is now used as the default column comment when creating a column with this domain.
@changelog_1253_li @changelog_1254_li
#Invalid database names are now detected and a better error message is thrown. #Invalid database names are now detected and a better error message is thrown.
@changelog_1254_li @changelog_1255_li
#ResultSetMetaData.getColumnClassName now returns the correct class name for BLOB and CLOB. #ResultSetMetaData.getColumnClassName now returns the correct class name for BLOB and CLOB.
@changelog_1255_li @changelog_1256_li
#Fixed the Oracle mode: Oracle allows multiple rows only where all columns of the unique index are NULL. #Fixed the Oracle mode: Oracle allows multiple rows only where all columns of the unique index are NULL.
@changelog_1256_li @changelog_1257_li
#There is a problem with Hibernate when using Boolean columns. A patch for Hibernate has been submitted at http://opensource.atlassian.com/projects/hibernate/browse/HHH-3401 #There is a problem with Hibernate when using Boolean columns. A patch for Hibernate has been submitted at http://opensource.atlassian.com/projects/hibernate/browse/HHH-3401
@changelog_1257_li @changelog_1258_li
#ORDER BY on tableName.columnName didn't work correctly if the column name was also used as an alias. #ORDER BY on tableName.columnName didn't work correctly if the column name was also used as an alias.
@changelog_1258_li @changelog_1259_li
#H2 Console: The progress display when opening a database has been improved. #H2 Console: The progress display when opening a database has been improved.
@changelog_1259_li @changelog_1260_li
#The error message when the server doesn't start has been improved. #The error message when the server doesn't start has been improved.
@changelog_1260_li @changelog_1261_li
#Key values can now be changed in updatable result sets. #Key values can now be changed in updatable result sets.
@changelog_1261_li @changelog_1262_li
#Changes in updatable result sets are now visible even when resetting the result set. #Changes in updatable result sets are now visible even when resetting the result set.
@changelog_1262_li @changelog_1263_li
#Temporary files were sometimes deleted too late when executing large insert, update, or delete operations. #Temporary files were sometimes deleted too late when executing large insert, update, or delete operations.
@changelog_1263_li @changelog_1264_li
#The database file was growing after deleting many rows, and after large update operations. #The database file was growing after deleting many rows, and after large update operations.
@changelog_1264_h2 @changelog_1265_h2
#Version 1.0.75 (2008-07-14) #Version 1.0.75 (2008-07-14)
@changelog_1265_li @changelog_1266_li
#Multi version concurrency (MVCC): when a row was updated or deleted, but this change was rolled back, the row was not visible by other sessions if no index was used to access it. Fixed. #Multi version concurrency (MVCC): when a row was updated or deleted, but this change was rolled back, the row was not visible by other sessions if no index was used to access it. Fixed.
@changelog_1266_li @changelog_1267_li
#Views with multiple joined tables (where one was an outer join) couldn't be used in some cases. Fixed. #Views with multiple joined tables (where one was an outer join) couldn't be used in some cases. Fixed.
@changelog_1267_li @changelog_1268_li
#The CSVREAD method did not process NULL correctly when using a whitespace field separator. #The CSVREAD method did not process NULL correctly when using a whitespace field separator.
@changelog_1268_li @changelog_1269_li
#Fixed the Oracle mode: Oracle allows multiple rows with NULL in a unique index. #Fixed the Oracle mode: Oracle allows multiple rows with NULL in a unique index.
@changelog_1269_li @changelog_1270_li
#Running out of memory could result in incomplete transactions or corrupted databases. Fixed. #Running out of memory could result in incomplete transactions or corrupted databases. Fixed.
@changelog_1270_li @changelog_1271_li
#When using order by in a query that uses the same table multiple times, the order could be incorrect. Fixed. #When using order by in a query that uses the same table multiple times, the order could be incorrect. Fixed.
@changelog_1271_li @changelog_1272_li
#Referential constraint checking improvement: now the constraint is only checked if the key column values change. #Referential constraint checking improvement: now the constraint is only checked if the key column values change.
@changelog_1272_li @changelog_1273_li
#Some database metadata calls returned the wrong data type for DATA_TYPE columns. #Some database metadata calls returned the wrong data type for DATA_TYPE columns.
@changelog_1273_li @changelog_1274_li
#The Lucene fulltext index was empty when opening a database with fulltext index enabled, and re-indexing it didn't work. Fixed. #The Lucene fulltext index was empty when opening a database with fulltext index enabled, and re-indexing it didn't work. Fixed.
@changelog_1274_li @changelog_1275_li
#The character '$' could not be used in identifier names (table name, column names and so on). Fixed. #The character '$' could not be used in identifier names (table name, column names and so on). Fixed.
@changelog_1275_li @changelog_1276_li
#The new method org.h2.tools.Server.startWebServer(conn) starts the H2 Console to inspect a database while debugging. #The new method org.h2.tools.Server.startWebServer(conn) starts the H2 Console to inspect a database while debugging.
@changelog_1276_li @changelog_1277_li
#Stopping a WebServer didn't always work. Fixed. #Stopping a WebServer didn't always work. Fixed.
@changelog_1277_h2 @changelog_1278_h2
#Version 1.0.74 (2008-06-21) #Version 1.0.74 (2008-06-21)
@changelog_1278_li @changelog_1279_li
#Work on row level locking has been started (but there is nothing usable yet). #Work on row level locking has been started (but there is nothing usable yet).
@changelog_1279_li @changelog_1280_li
#JaQu (Java Query), a tool similar to LINQ (Language Integrated Query; from Microsoft) is now included under src/tools/org/h2/jaqu. A small sample application is included under src/test/org/h2/test/jaqu. #JaQu (Java Query), a tool similar to LINQ (Language Integrated Query; from Microsoft) is now included under src/tools/org/h2/jaqu. A small sample application is included under src/test/org/h2/test/jaqu.
@changelog_1280_li @changelog_1281_li
#The source code is now switched to Java 1.6 by default. To switch back to Java 1.4, run 'build compile'. The h2.jar file is still Java 1.4. #The source code is now switched to Java 1.6 by default. To switch back to Java 1.4, run 'build compile'. The h2.jar file is still Java 1.4.
@changelog_1281_li @changelog_1282_li
#The ChangePassword tool is now called ChangeFileEncryption. #The ChangePassword tool is now called ChangeFileEncryption.
@changelog_1282_li @changelog_1283_li
#It is no longer allowed to create columns with the data type NULL. Also, it is no longer allowed to convert a column to the data type NULL. This was possible before but caused data loss. #It is no longer allowed to create columns with the data type NULL. Also, it is no longer allowed to convert a column to the data type NULL. This was possible before but caused data loss.
@changelog_1283_li @changelog_1284_li
#When using computed columns or default values with a different data type than the column data type, a class cast exception could occur. Fixed. #When using computed columns or default values with a different data type than the column data type, a class cast exception could occur. Fixed.
@changelog_1284_li @changelog_1285_li
#Opening databases larger than 1 GB was sometimes very slow if a lot of data was deleted previously. Fixed. #Opening databases larger than 1 GB was sometimes very slow if a lot of data was deleted previously. Fixed.
@changelog_1285_li @changelog_1286_li
#RUNSCRIPT could throw a NullPointerException if the script name was an expression. #RUNSCRIPT could throw a NullPointerException if the script name was an expression.
@changelog_1286_li @changelog_1287_li
#Improved compatibility. New compatibility modes for Oracle and Derby. New compatibility flag uniqueIndexNullDistinct to only allow one row with 'NULL' in a unique index. This flag is enabled for Derby, Oracle, MSSQLServer, and HSQLDB. #Improved compatibility. New compatibility modes for Oracle and Derby. New compatibility flag uniqueIndexNullDistinct to only allow one row with 'NULL' in a unique index. This flag is enabled for Derby, Oracle, MSSQLServer, and HSQLDB.
@changelog_1287_li @changelog_1288_li
#Linked tables: To view the statements that are executed against the target table, set the trace level to 3. #Linked tables: To view the statements that are executed against the target table, set the trace level to 3.
@changelog_1288_li @changelog_1289_li
#RunScript tool: new options to show and check the results of queries. #RunScript tool: new options to show and check the results of queries.
@changelog_1289_li @changelog_1290_li
#Deadlocks are now detected. One transaction is rolled back automatically. #Deadlocks are now detected. One transaction is rolled back automatically.
@changelog_1290_li @changelog_1291_li
#The Lucene fulltext index was always re-created when opening a database with fulltext index enabled. #The Lucene fulltext index was always re-created when opening a database with fulltext index enabled.
@changelog_1291_li @changelog_1292_li
#Support for overloaded Java methods. A user defined function can now be bound to multiple Java methods, if the Java methods have the same name but a different number of parameters. Thanks to Gary Tong for providing a patch! #Support for overloaded Java methods. A user defined function can now be bound to multiple Java methods, if the Java methods have the same name but a different number of parameters. Thanks to Gary Tong for providing a patch!
@changelog_1292_h2 @changelog_1293_h2
#Version 1.0.73 (2008-05-31) #Version 1.0.73 (2008-05-31)
@changelog_1293_li @changelog_1294_li
#ParameterMetaData now returns the right data type for most conditions, as in WHERE ID=?. #ParameterMetaData now returns the right data type for most conditions, as in WHERE ID=?.
@changelog_1294_li @changelog_1295_li
#The table SYSTEM_RANGE now supports expressions and parameters. #The table SYSTEM_RANGE now supports expressions and parameters.
@changelog_1295_li @changelog_1296_li
#New column INFORMATION_SCHEMA.CONSTRAINTS.UNIQUE_INDEX_NAME that contains the name of the unique index used to enforce this constraint, if there is such an index. #New column INFORMATION_SCHEMA.CONSTRAINTS.UNIQUE_INDEX_NAME that contains the name of the unique index used to enforce this constraint, if there is such an index.
@changelog_1296_li @changelog_1297_li
#SET QUERY_TIMEOUT and Statement.setQueryTimeout no longer commits a transaction. The same applies to SET @VARIABLE, SET LOCK_TIMEOUT, SET TRACE_LEVEL_*, SET THROTTLE, and SET PATH. #SET QUERY_TIMEOUT and Statement.setQueryTimeout no longer commits a transaction. The same applies to SET @VARIABLE, SET LOCK_TIMEOUT, SET TRACE_LEVEL_*, SET THROTTLE, and SET PATH.
@changelog_1297_li @changelog_1298_li
#The SCRIPT command does now emit IF NOT EXISTS for CREATE ROLE. #The SCRIPT command does now emit IF NOT EXISTS for CREATE ROLE.
@changelog_1298_li @changelog_1299_li
#MySQL compatibility: auto_increment column are no longer automatically converted to primary key columns. #MySQL compatibility: auto_increment column are no longer automatically converted to primary key columns.
@changelog_1299_li @changelog_1300_li
#PostgreSQL compatibility: support for BOOL_OR and BOOL_AND aggregate functions. #PostgreSQL compatibility: support for BOOL_OR and BOOL_AND aggregate functions.
@changelog_1300_li @changelog_1301_li
#Negative scale values for DECIMAL or NUMBER columns are now supported in regular tables and in linked tables. #Negative scale values for DECIMAL or NUMBER columns are now supported in regular tables and in linked tables.
@changelog_1301_li @changelog_1302_li
#A role or right can now be granted or revoked multiple times without getting an exception. #A role or right can now be granted or revoked multiple times without getting an exception.
@changelog_1302_li @changelog_1303_li
#Infinite numbers in SQL scripts are listed as POWER(0, -1)), negative infinite as (-POWER(0, -1)), and NaN (not a number) as SQRT(-1). #Infinite numbers in SQL scripts are listed as POWER(0, -1)), negative infinite as (-POWER(0, -1)), and NaN (not a number) as SQRT(-1).
@changelog_1303_li @changelog_1304_li
#The special double and float values 'NaN' (not a number) did not work correctly when sorting or comparing. #The special double and float values 'NaN' (not a number) did not work correctly when sorting or comparing.
@changelog_1304_li @changelog_1305_li
#The fulltext search did not support CLOB data types. #The fulltext search did not support CLOB data types.
@changelog_1305_li @changelog_1306_li
#If the drive with the database files was disconnected or unmounted while writing, sometimes a stack overflow exception was thrown instead of a IO exception. #If the drive with the database files was disconnected or unmounted while writing, sometimes a stack overflow exception was thrown instead of a IO exception.
@changelog_1306_li @changelog_1307_li
#The H2 Console could not be shut down from within the tool if the browser supports keepAlive (most browsers do). #The H2 Console could not be shut down from within the tool if the browser supports keepAlive (most browsers do).
@changelog_1307_li @changelog_1308_li
#If the password was passed as a char array, it was kept in an internal buffer longer than required. Theoretically the password could have been stolen if the main memory was swapped to disk before the garbage collection was run. #If the password was passed as a char array, it was kept in an internal buffer longer than required. Theoretically the password could have been stolen if the main memory was swapped to disk before the garbage collection was run.
@changelog_1308_h2 @changelog_1309_h2
#Version 1.0.72 (2008-05-10) #Version 1.0.72 (2008-05-10)
@changelog_1309_li @changelog_1310_li
#Some databases could not be opened when appending ;RECOVER=1 to the database URL. #Some databases could not be opened when appending ;RECOVER=1 to the database URL.
@changelog_1310_li @changelog_1311_li
#The Japanese translation of the error messages and the H2 Console has been completed by Masahiro Ikemoto (Arizona Design Inc.) #The Japanese translation of the error messages and the H2 Console has been completed by Masahiro Ikemoto (Arizona Design Inc.)
@changelog_1311_li @changelog_1312_li
#Updates made to updatable rows are now visible within the same result set. DatabaseMetaData.ownUpdatesAreVisible now returns true. #Updates made to updatable rows are now visible within the same result set. DatabaseMetaData.ownUpdatesAreVisible now returns true.
@changelog_1312_li @changelog_1313_li
#ParameterMetaData now returns the correct data for INSERT and UPDATE statements. #ParameterMetaData now returns the correct data for INSERT and UPDATE statements.
@changelog_1313_li @changelog_1314_li
#H2 Shell: DESCRIBE now supports an schema name. #H2 Shell: DESCRIBE now supports an schema name.
@changelog_1314_li @changelog_1315_li
#A subset of the PostgreSQL 'dollar quoting' feature is now supported. #A subset of the PostgreSQL 'dollar quoting' feature is now supported.
@changelog_1315_li @changelog_1316_li
#SLF4J is now supported by using adding TRACE_LEVEL_FILE=4 to the database URL. #SLF4J is now supported by using adding TRACE_LEVEL_FILE=4 to the database URL.
@changelog_1316_li @changelog_1317_li
#The recovery tool did not work if the table name contained spaces or if there was a comment on the table. #The recovery tool did not work if the table name contained spaces or if there was a comment on the table.
@changelog_1317_li @changelog_1318_li
#Triggers are no longer executed when changing the table structure (ALTER TABLE). #Triggers are no longer executed when changing the table structure (ALTER TABLE).
@changelog_1318_li @changelog_1319_li
#When setting BLOB or CLOB values larger than 65 KB using a remote connection, temporary files were kept on the client longer than required (until the connection was closed or the object is garbage collected). Now they are removed as soon as the PreparedStatement is closed, or when the value is overwritten. #When setting BLOB or CLOB values larger than 65 KB using a remote connection, temporary files were kept on the client longer than required (until the connection was closed or the object is garbage collected). Now they are removed as soon as the PreparedStatement is closed, or when the value is overwritten.
@changelog_1319_li @changelog_1320_li
#Statements can now be canceled remotely (when using remote connections). #Statements can now be canceled remotely (when using remote connections).
@changelog_1320_li @changelog_1321_li
#The Shell tool now uses java.io.Console to read the password when using JDK 1.6 #The Shell tool now uses java.io.Console to read the password when using JDK 1.6
@changelog_1321_li @changelog_1322_li
#When using read-only databases and setting LOG=2, an exception was written to the trace file when closing the database. Fixed. #When using read-only databases and setting LOG=2, an exception was written to the trace file when closing the database. Fixed.
@changelog_1322_h2 @changelog_1323_h2
#Version 1.0.71 (2008-04-25) #Version 1.0.71 (2008-04-25)
@changelog_1323_li @changelog_1324_li
#H2 is now dual-licensed under the Eclipse Public License (EPL) and the old 'H2 License' (which is basically MPL). #H2 is now dual-licensed under the Eclipse Public License (EPL) and the old 'H2 License' (which is basically MPL).
@changelog_1324_li @changelog_1325_li
#Sometimes an exception 'File ID mismatch' or 'try to add a record twice' occurred after large records (8 KB or larger) are updated or deleted. See also http://code.google.com/p/h2database/issues/detail?id=22 #Sometimes an exception 'File ID mismatch' or 'try to add a record twice' occurred after large records (8 KB or larger) are updated or deleted. See also http://code.google.com/p/h2database/issues/detail?id=22
@changelog_1325_li @changelog_1326_li
#H2 Console: The tools can now be translated (it didn't work in the last release). #H2 Console: The tools can now be translated (it didn't work in the last release).
@changelog_1326_li @changelog_1327_li
#New traditional Chinese translation. Thanks a lot to Derek Chao! #New traditional Chinese translation. Thanks a lot to Derek Chao!
@changelog_1327_li @changelog_1328_li
#Indexes were not used when enabling the optimization for IN(SELECT...) (system property h2.optimizeInJoin). #Indexes were not used when enabling the optimization for IN(SELECT...) (system property h2.optimizeInJoin).
@changelog_1328_h2 @changelog_1329_h2
#Version 1.0.70 (2008-04-20) #Version 1.0.70 (2008-04-20)
@changelog_1329_li
#The plan is to dual-license H2. The additional license is EPL (Eclipse Public License). The current license (MPL, Mozilla Public License) will stay. Current users are not affected because they can keep MPL. EPL is very similar to MPL, the only bigger difference is related to patents (EPL is a bit more business friendly in this regard). See also http://opensource.org/licenses/eclipse-1.0.php, http://www.eclipse.org/legal/eplfaq.php (FAQ), http://blogs.zdnet.com/Burnette/?p=131
@changelog_1330_li @changelog_1330_li
#Multi version concurrency (MVCC): when a row was updated, and the updated column was not indexed, this update was visible sometimes for other sessions even if it was not committed. #The plan is to dual-license H2. The additional license is EPL (Eclipse Public License). The current license (MPL, Mozilla Public License) will stay. Current users are not affected because they can keep MPL. EPL is very similar to MPL, the only bigger difference is related to patents (EPL is a bit more business friendly in this regard). See also http://opensource.org/licenses/eclipse-1.0.php, http://www.eclipse.org/legal/eplfaq.php (FAQ), http://blogs.zdnet.com/Burnette/?p=131
@changelog_1331_li @changelog_1331_li
#Calling SHUTDOWN on one connection and starting a query on another connection concurrently could result in a Java level deadlock. #Multi version concurrency (MVCC): when a row was updated, and the updated column was not indexed, this update was visible sometimes for other sessions even if it was not committed.
@changelog_1332_li @changelog_1332_li
#New system property h2.enableAnonymousSSL (default: true) to enable anonymous SSL connections. #Calling SHUTDOWN on one connection and starting a query on another connection concurrently could result in a Java level deadlock.
@changelog_1333_li @changelog_1333_li
#The precision if SUBSTR is now calculated if possible. #New system property h2.enableAnonymousSSL (default: true) to enable anonymous SSL connections.
@changelog_1334_li @changelog_1334_li
#The autocomplete in the H2 Console has been improved a bit. #The precision if SUBSTR is now calculated if possible.
@changelog_1335_li @changelog_1335_li
#The tools in the H2 Console are now translatable. #The autocomplete in the H2 Console has been improved a bit.
@changelog_1336_li @changelog_1336_li
#The servlet and lucene jar files are now automatically downloaded when building. #The tools in the H2 Console are now translatable.
@changelog_1337_li @changelog_1337_li
#The code switch tool has been replaced by a simpler tool called SwitchSource that just uses find and replace. #The servlet and lucene jar files are now automatically downloaded when building.
@changelog_1338_li @changelog_1338_li
#Started to write a Ant replacement ('JAnt') that uses pure Java build definitions. Advantages: ability to debug the build, extensible, flexible, no XML, a bit faster. Future plan: support creating custom h2 distributions (for embedded use). Maybe create a new project 'Jant' or 'Javen' if other people are interested. #The code switch tool has been replaced by a simpler tool called SwitchSource that just uses find and replace.
@changelog_1339_li @changelog_1339_li
#The jar file is now about 10% smaller because the variable debugging info is no longer included. The source file and line number debugging info is still included. If required, the jar file size of the full version can be further reduced to about 720 KB using 'build jarSmall' or even more by removing unneeded components. #Started to write a Ant replacement ('JAnt') that uses pure Java build definitions. Advantages: ability to debug the build, extensible, flexible, no XML, a bit faster. Future plan: support creating custom h2 distributions (for embedded use). Maybe create a new project 'Jant' or 'Javen' if other people are interested.
@changelog_1340_li @changelog_1340_li
#Added shell scripts run.sh and build.sh. chmod +x is required, but otherwise it should work. Feedback or improvements are welcome! #The jar file is now about 10% smaller because the variable debugging info is no longer included. The source file and line number debugging info is still included. If required, the jar file size of the full version can be further reduced to about 720 KB using 'build jarSmall' or even more by removing unneeded components.
@changelog_1341_li @changelog_1341_li
#Databases in zip files: large queries are now supported. Temp files are created in the temp directory if required. The documentation how to create the zip file has been corrected. #Added shell scripts run.sh and build.sh. chmod +x is required, but otherwise it should work. Feedback or improvements are welcome!
@changelog_1342_li @changelog_1342_li
#Invalid inline views threw confusing SQL exceptions. #Databases in zip files: large queries are now supported. Temp files are created in the temp directory if required. The documentation how to create the zip file has been corrected.
@changelog_1343_li @changelog_1343_li
#The Japanese translation of the error messages and the H2 Console has been improved. Thanks a lot to Masahiro IKEMOTO. #Invalid inline views threw confusing SQL exceptions.
@changelog_1344_li @changelog_1344_li
#Optimization for MIN() and MAX() when using MVCC. #The Japanese translation of the error messages and the H2 Console has been improved. Thanks a lot to Masahiro IKEMOTO.
@changelog_1345_li @changelog_1345_li
#To protect against remote brute force password attacks, the delay after each unsuccessful login now gets double as long. New system properties h2.delayWrongPasswordMin and h2.delayWrongPasswordMax. #Optimization for MIN() and MAX() when using MVCC.
@changelog_1346_li @changelog_1346_li
#After setting the query timeout and then resetting it, the next query would still timeout. Fixed. #To protect against remote brute force password attacks, the delay after each unsuccessful login now gets double as long. New system properties h2.delayWrongPasswordMin and h2.delayWrongPasswordMax.
@changelog_1347_li @changelog_1347_li
#Adding a IDENTITY column to a table with data threw a lock timeout. #After setting the query timeout and then resetting it, the next query would still timeout. Fixed.
@changelog_1348_li @changelog_1348_li
#OutOfMemoryError could occur when using EXISTS or IN(SELECT ..). #Adding a IDENTITY column to a table with data threw a lock timeout.
@changelog_1349_li @changelog_1349_li
#The built-in connection pool is not called JdbcConnectionPool. The API and documentation has been changed. #OutOfMemoryError could occur when using EXISTS or IN(SELECT ..).
@changelog_1350_li @changelog_1350_li
#The ConvertTraceFile tool now generates SQL statement statistics at the end of the SQL script file (similar to the profiling data generated when using java -Xrunhprof). #The built-in connection pool is not called JdbcConnectionPool. The API and documentation has been changed.
@changelog_1351_li @changelog_1351_li
#The ConvertTraceFile tool now generates SQL statement statistics at the end of the SQL script file (similar to the profiling data generated when using java -Xrunhprof).
@changelog_1352_li
#Nested joins are now supported (A JOIN B JOIN C ON .. ON ..) #Nested joins are now supported (A JOIN B JOIN C ON .. ON ..)
@download_1000_h1 @download_1000_h1
...@@ -2245,12 +2254,24 @@ Platform-Independent Zip ...@@ -2245,12 +2254,24 @@ Platform-Independent Zip
Platform-Independent Zip Platform-Independent Zip
@download_1009_h3 @download_1009_h3
サブバージョンのソースリポジトリ #Jar File
@download_1010_a @download_1010_a
#Maven.org
@download_1011_a
#Sourceforge.net
@download_1012_a
#Latest Automated Build (not released)
@download_1013_h3
サブバージョンのソースリポジトリ
@download_1014_a
Google Code Google Code
@download_1011_p @download_1015_p
#For details about changes, see the <a href="changelog.html">Change Log</a> . #For details about changes, see the <a href="changelog.html">Change Log</a> .
@faq_1000_h1 @faq_1000_h1
...@@ -3643,600 +3664,606 @@ jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 ...@@ -3643,600 +3664,606 @@ jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3
ロック、ロックタイムアウト、デッドロック ロック、ロックタイムアウト、デッドロック
@features_1401_p @features_1401_p
#The database uses table level locks to give each connection a consistent state of the data. There are two kinds of locks: read locks (shared locks) and write locks (exclusive locks). If a connection wants to reads from a table, and there is no write lock on the table, then a read lock is added to the table. If there is a write lock, then this connection waits for the other connection to release the lock. If a connection cannot get a lock for a specified time, then a lock timeout exception is thrown. #The database uses table level locks to give each connection a consistent state of the data. There are two kinds of locks: read locks (shared locks) and write locks (exclusive locks). All locks are released when the transaction commits or rolls back. When using the default transaction isolation level 'read committed', read locks are already released after each statement.
@features_1402_p @features_1402_p
#If a connection wants to reads from a table, and there is no write lock on the table, then a read lock is added to the table. If there is a write lock, then this connection waits for the other connection to release the lock. If a connection cannot get a lock for a specified time, then a lock timeout exception is thrown.
@features_1403_p
#Usually, SELECT statements will generate read locks. This includes subqueries. Statements that modify data use write locks. It is also possible to lock a table exclusively without modifying data, using the statement SELECT ... FOR UPDATE. The statements COMMIT and ROLLBACK releases all open locks. The commands SAVEPOINT and ROLLBACK TO SAVEPOINT don't affect locks. The locks are also released when the autocommit mode changes, and for connections with autocommit set to true (this is the default), locks are released after each statement. The following statements generate locks: #Usually, SELECT statements will generate read locks. This includes subqueries. Statements that modify data use write locks. It is also possible to lock a table exclusively without modifying data, using the statement SELECT ... FOR UPDATE. The statements COMMIT and ROLLBACK releases all open locks. The commands SAVEPOINT and ROLLBACK TO SAVEPOINT don't affect locks. The locks are also released when the autocommit mode changes, and for connections with autocommit set to true (this is the default), locks are released after each statement. The following statements generate locks:
@features_1403_th @features_1404_th
ロックの種類 ロックの種類
@features_1404_th @features_1405_th
SQLステートメント SQLステートメント
@features_1405_td @features_1406_td
Read Read
@features_1406_td @features_1407_td
#SELECT * FROM TEST; #SELECT * FROM TEST;
@features_1407_td @features_1408_td
#CALL SELECT MAX(ID) FROM TEST; #CALL SELECT MAX(ID) FROM TEST;
@features_1408_td @features_1409_td
#SCRIPT; #SCRIPT;
@features_1409_td @features_1410_td
Write Write
@features_1410_td @features_1411_td
#SELECT * FROM TEST WHERE 1=0 FOR UPDATE; #SELECT * FROM TEST WHERE 1=0 FOR UPDATE;
@features_1411_td @features_1412_td
Write Write
@features_1412_td @features_1413_td
#INSERT INTO TEST VALUES(1, 'Hello'); #INSERT INTO TEST VALUES(1, 'Hello');
@features_1413_td @features_1414_td
#INSERT INTO TEST SELECT * FROM TEST; #INSERT INTO TEST SELECT * FROM TEST;
@features_1414_td @features_1415_td
#UPDATE TEST SET NAME='Hi'; #UPDATE TEST SET NAME='Hi';
@features_1415_td @features_1416_td
#DELETE FROM TEST; #DELETE FROM TEST;
@features_1416_td @features_1417_td
Write Write
@features_1417_td @features_1418_td
#ALTER TABLE TEST ...; #ALTER TABLE TEST ...;
@features_1418_td @features_1419_td
#CREATE INDEX ... ON TEST ...; #CREATE INDEX ... ON TEST ...;
@features_1419_td @features_1420_td
#DROP INDEX ...; #DROP INDEX ...;
@features_1420_p @features_1421_p
SQLコマンド SET LOCK_TIMEOUT &lt;milliseconds&gt; を使用して、ロックタイムアウトの例外が投げられるまでの秒数を、それぞれの接続ごとに別々に設定することができます。SQLコマンド SET DEFAULT_LOCK_TIMEOUT &lt;milliseconds&gt; を使用して、初期のロックタイムアウト (新しい接続に使用されるタイムアウト) を設定することができます。デフォルトのロックタイムアウトは永続的です。 SQLコマンド SET LOCK_TIMEOUT &lt;milliseconds&gt; を使用して、ロックタイムアウトの例外が投げられるまでの秒数を、それぞれの接続ごとに別々に設定することができます。SQLコマンド SET DEFAULT_LOCK_TIMEOUT &lt;milliseconds&gt; を使用して、初期のロックタイムアウト (新しい接続に使用されるタイムアウト) を設定することができます。デフォルトのロックタイムアウトは永続的です。
@features_1421_h2 @features_1422_h2
データベースファイルレイアウト データベースファイルレイアウト
@features_1422_p @features_1423_p
#There are a number of files created for persistent databases. Unlike some other databases, not every table and/or index is stored in its own file. Instead, usually only the following files are created: A data file, an index file, a log file, and a database lock file (exists only while the database is in use). In addition to that, a file is created for each large object (CLOB/BLOB) larger than a certain size, and temporary files for large result sets. If the database trace option is enabled, trace files are created. The following files can be created by the database: #There are a number of files created for persistent databases. Unlike some other databases, not every table and/or index is stored in its own file. Instead, usually only the following files are created: A data file, an index file, a log file, and a database lock file (exists only while the database is in use). In addition to that, a file is created for each large object (CLOB/BLOB) larger than a certain size, and temporary files for large result sets. If the database trace option is enabled, trace files are created. The following files can be created by the database:
@features_1423_th @features_1424_th
ファイル名 ファイル名
@features_1424_th @features_1425_th
説明 説明
@features_1425_th @features_1426_th
ファイル数 ファイル数
@features_1426_td @features_1427_td
test.data.db test.data.db
@features_1427_td @features_1428_td
#Data file. #Data file.
@features_1428_td @features_1429_td
#Contains the data for all tables. #Contains the data for all tables.
@features_1429_td @features_1430_td
フォーマット: &lt;database&gt;.data.db フォーマット: &lt;database&gt;.data.db
@features_1430_td @features_1431_td
データベースごとに1ファイル データベースごとに1ファイル
@features_1431_td @features_1432_td
test.index.db test.index.db
@features_1432_td @features_1433_td
#Index file. #Index file.
@features_1433_td @features_1434_td
#Contains the data for all (b tree) indexes. #Contains the data for all (b tree) indexes.
@features_1434_td @features_1435_td
フォーマット: &lt;database&gt;.index.db フォーマット: &lt;database&gt;.index.db
@features_1435_td @features_1436_td
データベースごとに1ファイル データベースごとに1ファイル
@features_1436_td @features_1437_td
test.0.log.db test.0.log.db
@features_1437_td @features_1438_td
#Transaction log file. #Transaction log file.
@features_1438_td @features_1439_td
#The transaction log is used for recovery. #The transaction log is used for recovery.
@features_1439_td @features_1440_td
フォーマット: &lt;database&gt;.&lt;id&gt;.log.db フォーマット: &lt;database&gt;.&lt;id&gt;.log.db
@features_1440_td @features_1441_td
データベースごとに0ファイル以上 データベースごとに0ファイル以上
@features_1441_td @features_1442_td
test.lock.db test.lock.db
@features_1442_td @features_1443_td
#Database lock file. #Database lock file.
@features_1443_td @features_1444_td
#Exists only while the database is open. #Exists only while the database is open.
@features_1444_td @features_1445_td
フォーマット: &lt;database&gt;.lock.db フォーマット: &lt;database&gt;.lock.db
@features_1445_td @features_1446_td
データベースごとに1ファイル データベースごとに1ファイル
@features_1446_td @features_1447_td
test.trace.db test.trace.db
@features_1447_td @features_1448_td
#Trace file. #Trace file.
@features_1448_td @features_1449_td
#Contains trace information. #Contains trace information.
@features_1449_td @features_1450_td
フォーマット: &lt;database&gt;.trace.db フォーマット: &lt;database&gt;.trace.db
@features_1450_td @features_1451_td
ファイルが大きすぎる場合、&lt;database&gt;.trace.db.old に改名される ファイルが大きすぎる場合、&lt;database&gt;.trace.db.old に改名される
@features_1451_td @features_1452_td
データベースごとに1ファイル データベースごとに1ファイル
@features_1452_td @features_1453_td
#test.lobs.db/1.t15.lob.db #test.lobs.db/1.t15.lob.db
@features_1453_td @features_1454_td
#Large object. #Large object.
@features_1454_td @features_1455_td
#Contains the data for BLOB or CLOB values. #Contains the data for BLOB or CLOB values.
@features_1455_td @features_1456_td
#Format: &lt;id&gt;.t&lt;tableId&gt;.lob.db #Format: &lt;id&gt;.t&lt;tableId&gt;.lob.db
@features_1456_td @features_1457_td
#1 per value #1 per value
@features_1457_td @features_1458_td
test.123.temp.db test.123.temp.db
@features_1458_td @features_1459_td
#Temporary file. #Temporary file.
@features_1459_td @features_1460_td
#Contains a temporary blob or a large result set. #Contains a temporary blob or a large result set.
@features_1460_td @features_1461_td
#Format: &lt;database&gt;.&lt;id&gt;.temp.db #Format: &lt;database&gt;.&lt;id&gt;.temp.db
@features_1461_td @features_1462_td
オブジェクトごとに1ファイル オブジェクトごとに1ファイル
@features_1462_h3 @features_1463_h3
データベースファイルの移動と改名 データベースファイルの移動と改名
@features_1463_p @features_1464_p
#Database name and location are not stored inside the database files. #Database name and location are not stored inside the database files.
@features_1464_p @features_1465_p
データベースが閉じられている間、ファイルは他のディレクトリに移動することができ、同様にファイル名を変えることもできます (全てのファイルが同じ名前で始まる必要があります)。 データベースが閉じられている間、ファイルは他のディレクトリに移動することができ、同様にファイル名を変えることもできます (全てのファイルが同じ名前で始まる必要があります)。
@features_1465_p @features_1466_p
ファイルにはプラットホーム固有のデータがないので、問題なく他のオペレーティングシステムに移動することができます。 ファイルにはプラットホーム固有のデータがないので、問題なく他のオペレーティングシステムに移動することができます。
@features_1466_h3 @features_1467_h3
バックアップ バックアップ
@features_1467_p @features_1468_p
データベースが閉じられている時、データベースファイルのバックアップをとることが可能です。インデックスファイルはバックアップをとる必要はありません。なぜなら、インデックスファイルは冗長なデータを含み、もしファイルが存在しなければ自動的に再作成されるからです。 データベースが閉じられている時、データベースファイルのバックアップをとることが可能です。インデックスファイルはバックアップをとる必要はありません。なぜなら、インデックスファイルは冗長なデータを含み、もしファイルが存在しなければ自動的に再作成されるからです。
@features_1468_p @features_1469_p
データベースが動作している間にバックアップデータをとるために、SQLコマンド SCRIPTを使うことができます。 データベースが動作している間にバックアップデータをとるために、SQLコマンド SCRIPTを使うことができます。
@features_1469_h2 @features_1470_h2
ログとリカバリー ログとリカバリー
@features_1470_p @features_1471_p
データベースでデータが修正され、それらの変更がコミットされた時はいつでも、変更はディスクに記録されます (インメモリオブジェクトを除いて)。データファイル自体への変更は通常、ディスクアクセスを最適化するために後で書かれています。もし電源異常があった場合、データファイルとインデックスファイルはアップデートされません。しかし、変更がログファイルに書かれていれば、次回データベースを開いた時に、ログファイルに書かれた変更は自動的に再び適用されます。 データベースでデータが修正され、それらの変更がコミットされた時はいつでも、変更はディスクに記録されます (インメモリオブジェクトを除いて)。データファイル自体への変更は通常、ディスクアクセスを最適化するために後で書かれています。もし電源異常があった場合、データファイルとインデックスファイルはアップデートされません。しかし、変更がログファイルに書かれていれば、次回データベースを開いた時に、ログファイルに書かれた変更は自動的に再び適用されます。
@features_1471_p @features_1472_p
インデックスファイルのアップデートはデフォルトでは記録されないことに注意して下さい。もしデータベースが開かれて、リカバリーが必要だとされたら、インデックスファイルは最初から作り替えられます。 インデックスファイルのアップデートはデフォルトでは記録されないことに注意して下さい。もしデータベースが開かれて、リカバリーが必要だとされたら、インデックスファイルは最初から作り替えられます。
@features_1472_p @features_1473_p
通常、データベースごとにたったひとつのログファイルがあります。このファイルは、データベースが正常に終了されるまで増大し、削除されます。また、ファイルが大きくなりすぎたら、データベースは別のログファイルに交換します (より大きなIDで)。CHECKPOINT コマンドを使用することによって、ログの切り替えを強制することが可能です。 通常、データベースごとにたったひとつのログファイルがあります。このファイルは、データベースが正常に終了されるまで増大し、削除されます。また、ファイルが大きくなりすぎたら、データベースは別のログファイルに交換します (より大きなIDで)。CHECKPOINT コマンドを使用することによって、ログの切り替えを強制することが可能です。
@features_1473_p @features_1474_p
checksumのレコードが合わないために (例えば、別のアプリケーションからファイルが編集された場合) データベースファイルが破損したら、データベースをリカバリーモードで開くことができます。このケースでは、データベースのエラーは記録されますが、投げられません。データベースはスクリプトまでバックアップをとり、可能な限り早く再構築します。データベースをリカバリーモードで開くために、jdbc:h2:~/test;RECOVER=1 のように、RECOVER=1 を含むデータベースURLを使用します。この場合、インデックスは再構築され、サマリー (アロケーションテーブルのオブジェクト)は読まれないため、データベースを開くのに時間がかかります。 checksumのレコードが合わないために (例えば、別のアプリケーションからファイルが編集された場合) データベースファイルが破損したら、データベースをリカバリーモードで開くことができます。このケースでは、データベースのエラーは記録されますが、投げられません。データベースはスクリプトまでバックアップをとり、可能な限り早く再構築します。データベースをリカバリーモードで開くために、jdbc:h2:~/test;RECOVER=1 のように、RECOVER=1 を含むデータベースURLを使用します。この場合、インデックスは再構築され、サマリー (アロケーションテーブルのオブジェクト)は読まれないため、データベースを開くのに時間がかかります。
@features_1474_h2 @features_1475_h2
互換性 互換性
@features_1475_p @features_1476_p
#All database engines behave a little bit different. Where possible, H2 supports the ANSI SQL standard, and tries to be compatible to other databases. There are still a few differences however: #All database engines behave a little bit different. Where possible, H2 supports the ANSI SQL standard, and tries to be compatible to other databases. There are still a few differences however:
@features_1476_p @features_1477_p
#In MySQL text columns are case insensitive by default, while in H2 they are case sensitive. However H2 supports case insensitive columns as well. To create the tables with case insensitive texts, append IGNORECASE=TRUE to the database URL (example: <code>jdbc:h2:~/test;IGNORECASE=TRUE</code> ). #In MySQL text columns are case insensitive by default, while in H2 they are case sensitive. However H2 supports case insensitive columns as well. To create the tables with case insensitive texts, append IGNORECASE=TRUE to the database URL (example: <code>jdbc:h2:~/test;IGNORECASE=TRUE</code> ).
@features_1477_h3 @features_1478_h3
互換モード 互換モード
@features_1478_p @features_1479_p
#For certain features, this database can emulate the behavior of specific databases. Not all features or differences of those databases are implemented. Here is the list of currently supported modes and the differences to the regular mode: #For certain features, this database can emulate the behavior of specific databases. Not all features or differences of those databases are implemented. Here is the list of currently supported modes and the differences to the regular mode:
@features_1479_h3 @features_1480_h3
#DB2 Compatibility Mode #DB2 Compatibility Mode
@features_1480_p @features_1481_p
#To use the IBM DB2 mode, use the database URL <code>jdbc:h2:~/test;MODE=DB2</code> or the SQL statement <code>SET MODE DB2</code> . #To use the IBM DB2 mode, use the database URL <code>jdbc:h2:~/test;MODE=DB2</code> or the SQL statement <code>SET MODE DB2</code> .
@features_1481_li @features_1482_li
#For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. #For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1482_li @features_1483_li
#Support for the syntax [OFFSET .. ROW] [FETCH ... ONLY] as an alternative for LIMIT .. OFFSET. #Support for the syntax [OFFSET .. ROW] [FETCH ... ONLY] as an alternative for LIMIT .. OFFSET.
@features_1483_h3 @features_1484_h3
#Derby Compatibility Mode #Derby Compatibility Mode
@features_1484_p @features_1485_p
#To use the Apache Derby mode, use the database URL <code>jdbc:h2:~/test;MODE=Derby</code> or the SQL statement <code>SET MODE Derby</code> . #To use the Apache Derby mode, use the database URL <code>jdbc:h2:~/test;MODE=Derby</code> or the SQL statement <code>SET MODE Derby</code> .
@features_1485_li @features_1486_li
#For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. #For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1486_li @features_1487_li
#For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed. #For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed.
@features_1487_h3 @features_1488_h3
#HSQLDB Compatibility Mode #HSQLDB Compatibility Mode
@features_1488_p @features_1489_p
#To use the HSQLDB mode, use the database URL <code>jdbc:h2:~/test;MODE=HSQLDB</code> or the SQL statement <code>SET MODE HSQLDB</code> . #To use the HSQLDB mode, use the database URL <code>jdbc:h2:~/test;MODE=HSQLDB</code> or the SQL statement <code>SET MODE HSQLDB</code> .
@features_1489_li @features_1490_li
#For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. #For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1490_li @features_1491_li
#When converting the scale of decimal data, the number is only converted if the new scale is smaller than the current scale. Usually, the scale is converted and 0s are added if required. #When converting the scale of decimal data, the number is only converted if the new scale is smaller than the current scale. Usually, the scale is converted and 0s are added if required.
@features_1491_li @features_1492_li
#Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL. #Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL.
@features_1492_li @features_1493_li
#For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed. #For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed.
@features_1493_h3 @features_1494_h3
#MS SQL Server Compatibility Mode #MS SQL Server Compatibility Mode
@features_1494_p @features_1495_p
#To use the MS SQL Server mode, use the database URL <code>jdbc:h2:~/test;MODE=MSSQLServer</code> or the SQL statement <code>SET MODE MSSQLServer</code> . #To use the MS SQL Server mode, use the database URL <code>jdbc:h2:~/test;MODE=MSSQLServer</code> or the SQL statement <code>SET MODE MSSQLServer</code> .
@features_1495_li @features_1496_li
#For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. #For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1496_li @features_1497_li
#Identifiers may be quoted using square brackets as in [Test]. #Identifiers may be quoted using square brackets as in [Test].
@features_1497_li @features_1498_li
#For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed. #For unique indexes, NULL is distinct. That means only one row with NULL in one of the columns is allowed.
@features_1498_h3 @features_1499_h3
#MySQL Compatibility Mode #MySQL Compatibility Mode
@features_1499_p @features_1500_p
#To use the MySQL mode, use the database URL <code>jdbc:h2:~/test;MODE=MySQL</code> or the SQL statement <code>SET MODE MySQL</code> . #To use the MySQL mode, use the database URL <code>jdbc:h2:~/test;MODE=MySQL</code> or the SQL statement <code>SET MODE MySQL</code> .
@features_1500_li @features_1501_li
#When inserting data, if a column is defined to be NOT NULL and NULL is inserted, then a 0 (or empty string, or the current timestamp for timestamp columns) value is used. Usually, this operation is not allowed and an exception is thrown. #When inserting data, if a column is defined to be NOT NULL and NULL is inserted, then a 0 (or empty string, or the current timestamp for timestamp columns) value is used. Usually, this operation is not allowed and an exception is thrown.
@features_1501_li @features_1502_li
#Creating indexes in the CREATE TABLE statement is allowed. #Creating indexes in the CREATE TABLE statement is allowed.
@features_1502_li @features_1503_li
#Meta data calls return identifiers in lower case. #Meta data calls return identifiers in lower case.
@features_1503_li @features_1504_li
#When converting a floating point number to an integer, the fractional digits are not truncated, but the value is rounded. #When converting a floating point number to an integer, the fractional digits are not truncated, but the value is rounded.
@features_1504_h3 @features_1505_h3
#Oracle Compatibility Mode #Oracle Compatibility Mode
@features_1505_p @features_1506_p
#To use the Oracle mode, use the database URL <code>jdbc:h2:~/test;MODE=Oracle</code> or the SQL statement <code>SET MODE Oracle</code> . #To use the Oracle mode, use the database URL <code>jdbc:h2:~/test;MODE=Oracle</code> or the SQL statement <code>SET MODE Oracle</code> .
@features_1506_li @features_1507_li
#For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. #For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1507_li @features_1508_li
#When using unique indexes, multiple rows with NULL in all columns are allowed, however it is not allowed to have multiple rows with the same values otherwise. #When using unique indexes, multiple rows with NULL in all columns are allowed, however it is not allowed to have multiple rows with the same values otherwise.
@features_1508_h3 @features_1509_h3
#PostgreSQL Compatibility Mode #PostgreSQL Compatibility Mode
@features_1509_p @features_1510_p
#To use the PostgreSQL mode, use the database URL <code>jdbc:h2:~/test;MODE=PostgreSQL</code> or the SQL statement <code>SET MODE PostgreSQL</code> . #To use the PostgreSQL mode, use the database URL <code>jdbc:h2:~/test;MODE=PostgreSQL</code> or the SQL statement <code>SET MODE PostgreSQL</code> .
@features_1510_li @features_1511_li
#For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null. #For aliased columns, ResultSetMetaData.getColumnName() returns the alias name and getTableName() returns null.
@features_1511_li @features_1512_li
#Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL. #Concatenation with NULL results in NULL. Usually, NULL is treated as an empty string if only one of the operands is NULL, and NULL is only returned if both operands are NULL.
@features_1512_li @features_1513_li
#When converting a floating point number to an integer, the fractional digits are not be truncated, but the value is rounded. #When converting a floating point number to an integer, the fractional digits are not be truncated, but the value is rounded.
@features_1513_li @features_1514_li
#The system columns 'CTID' and 'OID' are supported. #The system columns 'CTID' and 'OID' are supported.
@features_1514_h2 @features_1515_h2
#Auto-Reconnect #Auto-Reconnect
@features_1515_p @features_1516_p
#The auto-reconnect feature causes the JDBC driver to reconnect to the database if the connection is lost. The automatic re-connect only occurs when auto-commit is enabled; if auto-commit is disabled, an exception is thrown. #The auto-reconnect feature causes the JDBC driver to reconnect to the database if the connection is lost. The automatic re-connect only occurs when auto-commit is enabled; if auto-commit is disabled, an exception is thrown.
@features_1516_p @features_1517_p
#Re-connecting will open a new session. After an automatic re-connect, variables and local temporary tables definitions (excluding data) are re-created. The contents of the system table INFORMATION_SCHEMA.SESSION_STATE contains all client side state that is re-created. #Re-connecting will open a new session. After an automatic re-connect, variables and local temporary tables definitions (excluding data) are re-created. The contents of the system table INFORMATION_SCHEMA.SESSION_STATE contains all client side state that is re-created.
@features_1517_h2 @features_1518_h2
#Automatic Mixed Mode #Automatic Mixed Mode
@features_1518_p @features_1519_p
#Multiple processes can access the same database without having to start the server manually. To do that, append <code>;AUTO_SERVER=TRUE</code> to the database URL. You can use the same database URL no matter if the database is already open or not. #Multiple processes can access the same database without having to start the server manually. To do that, append <code>;AUTO_SERVER=TRUE</code> to the database URL. You can use the same database URL no matter if the database is already open or not.
@features_1519_p @features_1520_p
#When using this mode, the first connection to the database is made in embedded mode, and additionally a server is started internally. If the database is already open in another process, the server mode is used automatically. #When using this mode, the first connection to the database is made in embedded mode, and additionally a server is started internally. If the database is already open in another process, the server mode is used automatically.
@features_1520_p @features_1521_p
#The application that opens the first connection to the database uses the embedded mode, which is faster than the server mode. Therefore the main application should open the database first if possible. The first connection automatically starts a server on a random port. This server allows remote connections, however only to this database (to ensure that, the client reads .lock.db file and sends the the random key that is stored there to the server). When the first connection is closed, the server stops. If other (remote) connections are still open, one of them will then start a server (auto-reconnect is enabled automatically). #The application that opens the first connection to the database uses the embedded mode, which is faster than the server mode. Therefore the main application should open the database first if possible. The first connection automatically starts a server on a random port. This server allows remote connections, however only to this database (to ensure that, the client reads .lock.db file and sends the the random key that is stored there to the server). When the first connection is closed, the server stops. If other (remote) connections are still open, one of them will then start a server (auto-reconnect is enabled automatically).
@features_1521_p @features_1522_p
#This mode has three disadvantages: All processes need to have access to the database files. Then, if the first connection is closed (the connection that started the server), open transactions of other connections will be rolled back. Also, explicit client/server connections (using jdbc:h2:tcp:// or ssl://) are not supported. #This mode has three disadvantages: All processes need to have access to the database files. Then, if the first connection is closed (the connection that started the server), open transactions of other connections will be rolled back. Also, explicit client/server connections (using jdbc:h2:tcp:// or ssl://) are not supported.
@features_1522_p @features_1523_p
#Here is an example how to use this mode. Application 1 and 2 are not necessarily started on the same computer, but they need to have access to the database files. Application 1 and 2 are typically two different processes (however they could run within the same process). #Here is an example how to use this mode. Application 1 and 2 are not necessarily started on the same computer, but they need to have access to the database files. Application 1 and 2 are typically two different processes (however they could run within the same process).
@features_1523_h2 @features_1524_h2
トレースオプションを使用する トレースオプションを使用する
@features_1524_p @features_1525_p
アプリケーション内の問題を見つけるために、時々、何のデータベースオペレーションがどこで実行されているかを知るのは良い方法です。このデータベースは次のトレースの特徴を提供します: アプリケーション内の問題を見つけるために、時々、何のデータベースオペレーションがどこで実行されているかを知るのは良い方法です。このデータベースは次のトレースの特徴を提供します:
@features_1525_li @features_1526_li
System.out と (または) ファイルをトレースする System.out と (または) ファイルをトレースする
@features_1526_li @features_1527_li
トレースレベル OFF、ERROR、INFO と DEBUG をサポート トレースレベル OFF、ERROR、INFO と DEBUG をサポート
@features_1527_li @features_1528_li
トレースファイルの最大サイズの設定が可能 トレースファイルの最大サイズの設定が可能
@features_1528_li @features_1529_li
#It is possible to generate Java source code from the trace file #It is possible to generate Java source code from the trace file
@features_1529_li @features_1530_li
手動でファイルを作成することによって、ランタイムでトレースが可能 手動でファイルを作成することによって、ランタイムでトレースが可能
@features_1530_h3 @features_1531_h3
トレースオプション トレースオプション
@features_1531_p @features_1532_p
トレースオプションを可能にする簡単な方法は、データベースURLにトレースオプションを設定することです。二つの設定があり、ひとつは、System.out (TRACE_LEVEL_SYSTEM_OUT) トレーシングで、もうひとつはファイルトレーシング(TRACE_LEVEL_FILE)です。トレースレベルは、0 が OFF、1 が ERROR (デフォルト)、2 が INFO で 3 が DEBUGです。両方のレベルがDEBUGに設定されたデータベースURLです: トレースオプションを可能にする簡単な方法は、データベースURLにトレースオプションを設定することです。二つの設定があり、ひとつは、System.out (TRACE_LEVEL_SYSTEM_OUT) トレーシングで、もうひとつはファイルトレーシング(TRACE_LEVEL_FILE)です。トレースレベルは、0 が OFF、1 が ERROR (デフォルト)、2 が INFO で 3 が DEBUGです。両方のレベルがDEBUGに設定されたデータベースURLです:
@features_1532_p @features_1533_p
トレースレベルは、SQLコマンド <CODE>SET TRACE_LEVEL_SYSTEM_OUT level</CODE> (System.out トレーシング) または <CODE>SET TRACE_LEVEL_FILE level</CODE> (ファイルトレーシング) を実行することによってランタイムで変更できます。例: トレースレベルは、SQLコマンド <CODE>SET TRACE_LEVEL_SYSTEM_OUT level</CODE> (System.out トレーシング) または <CODE>SET TRACE_LEVEL_FILE level</CODE> (ファイルトレーシング) を実行することによってランタイムで変更できます。例:
@features_1533_h3 @features_1534_h3
トレースファイルの最大サイズを設定 トレースファイルの最大サイズを設定
@features_1534_p @features_1535_p
#When using a high trace level, the trace file can get very big quickly. The default size limit is 16 MB, if the trace file exceeds this limit, it is renamed to .old and a new file is created. If another .old file exists, it is deleted. The size limit can be changed using the SQL statement <code>SET TRACE_MAX_FILE_SIZE maximumFileSizeInMB</code> . Example: #When using a high trace level, the trace file can get very big quickly. The default size limit is 16 MB, if the trace file exceeds this limit, it is renamed to .old and a new file is created. If another .old file exists, it is deleted. The size limit can be changed using the SQL statement <code>SET TRACE_MAX_FILE_SIZE maximumFileSizeInMB</code> . Example:
@features_1535_h3 @features_1536_h3
Javaコード生成 Javaコード生成
@features_1536_p @features_1537_p
#When setting the trace level to INFO or DEBUG, Java source code is generated as well. This allows to reproduce problems more easily. The trace file looks like this: #When setting the trace level to INFO or DEBUG, Java source code is generated as well. This allows to reproduce problems more easily. The trace file looks like this:
@features_1537_p @features_1538_p
#To filter the Java source code, use the ConvertTraceFile tool as follows: #To filter the Java source code, use the ConvertTraceFile tool as follows:
@features_1538_p @features_1539_p
#The generated file <code>Test.java</code> will contain the Java source code. The generated source code may be too large to compile (the size of a Java method is limited). If this is the case, the source code needs to be split in multiple methods. The password is not listed in the trace file and therefore not included in the source code. #The generated file <code>Test.java</code> will contain the Java source code. The generated source code may be too large to compile (the size of a Java method is limited). If this is the case, the source code needs to be split in multiple methods. The password is not listed in the trace file and therefore not included in the source code.
@features_1539_h2 @features_1540_h2
#Using Other Logging APIs #Using Other Logging APIs
@features_1540_p @features_1541_p
#By default, this database uses its own native 'trace' facility. This facility is called 'trace' and not 'log' within this database to avoid confusion with the transaction log. Trace messages can be written to both file and System.out. In most cases, this is sufficient, however sometimes it is better to use the same facility as the application, for example Log4j. To do that, this database support SLF4J. #By default, this database uses its own native 'trace' facility. This facility is called 'trace' and not 'log' within this database to avoid confusion with the transaction log. Trace messages can be written to both file and System.out. In most cases, this is sufficient, however sometimes it is better to use the same facility as the application, for example Log4j. To do that, this database support SLF4J.
@features_1541_a @features_1542_a
#SLF4J #SLF4J
@features_1542_p @features_1543_p
#is a simple facade for various logging APIs and allows to plug in the desired implementation at deployment time. SLF4J supports implementations such as Logback, Log4j, Jakarta Commons Logging (JCL), JDK 1.4 logging, x4juli, and Simple Log. #is a simple facade for various logging APIs and allows to plug in the desired implementation at deployment time. SLF4J supports implementations such as Logback, Log4j, Jakarta Commons Logging (JCL), JDK 1.4 logging, x4juli, and Simple Log.
@features_1543_p @features_1544_p
#To enable SLF4J, set the file trace level to 4 in the database URL: #To enable SLF4J, set the file trace level to 4 in the database URL:
@features_1544_p @features_1545_p
#Changing the log mechanism is not possible after the database is open, that means executing the SQL statement SET TRACE_LEVEL_FILE 4 when the database is already open will not have the desired effect. To use SLF4J, all required jar files need to be in the classpath. If it does not work, check the file &lt;database&gt;.trace.db for error messages. #Changing the log mechanism is not possible after the database is open, that means executing the SQL statement SET TRACE_LEVEL_FILE 4 when the database is already open will not have the desired effect. To use SLF4J, all required jar files need to be in the classpath. If it does not work, check the file &lt;database&gt;.trace.db for error messages.
@features_1545_h2 @features_1546_h2
読み取り専用データベース 読み取り専用データベース
@features_1546_p @features_1547_p
#If the database files are read-only, then the database is read-only as well. It is not possible to create new tables, add or modify data in this database. Only SELECT and CALL statements are allowed. To create a read-only database, close the database so that the log file gets smaller. Do not delete the log file. Then, make the database files read-only using the operating system. When you open the database now, it is read-only. There are two ways an application can find out whether database is read-only: By calling Connection.isReadOnly() or by executing the SQL statement CALL READONLY(). #If the database files are read-only, then the database is read-only as well. It is not possible to create new tables, add or modify data in this database. Only SELECT and CALL statements are allowed. To create a read-only database, close the database so that the log file gets smaller. Do not delete the log file. Then, make the database files read-only using the operating system. When you open the database now, it is read-only. There are two ways an application can find out whether database is read-only: By calling Connection.isReadOnly() or by executing the SQL statement CALL READONLY().
@features_1547_h2 @features_1548_h2
#Read Only Databases in Zip or Jar File #Read Only Databases in Zip or Jar File
@features_1548_p @features_1549_p
#To create a read-only database in a zip file, first create a regular persistent database, and then create a backup. If you are using a database named 'test', an easy way to do that is using the Backup tool or the BACKUP SQL statement: #To create a read-only database in a zip file, first create a regular persistent database, and then create a backup. If you are using a database named 'test', an easy way to do that is using the Backup tool or the BACKUP SQL statement:
@features_1549_p @features_1550_p
#The database must not have pending changes, that means you need to close all connections to the database, open one single connection, and then execute the statement. Afterwards, you can log out, and directly open the database in the zip file using the following database URL: #The database must not have pending changes, that means you need to close all connections to the database, open one single connection, and then execute the statement. Afterwards, you can log out, and directly open the database in the zip file using the following database URL:
@features_1550_p @features_1551_p
#Databases in zip files are read-only. The performance for some queries will be slower than when using a regular database, because random access in zip files is not supported (only streaming). How much this affects the performance depends on the queries and the data. The database is not read in memory; therefore large databases are supported as well. The same indexes are used as when using a regular database. #Databases in zip files are read-only. The performance for some queries will be slower than when using a regular database, because random access in zip files is not supported (only streaming). How much this affects the performance depends on the queries and the data. The database is not read in memory; therefore large databases are supported as well. The same indexes are used as when using a regular database.
@features_1551_h2 @features_1552_h2
ディスクスペースが少ない状況での正しい取り扱い ディスクスペースが少ない状況での正しい取り扱い
@features_1552_p @features_1553_p
#If the database needs more disk space, it calls the database event listener if one is installed. The application may then delete temporary files, or display a message and wait until the user has resolved the problem. To install a listener, run the SQL statement SET DATABASE_EVENT_LISTENER or use a database URL of the form jdbc:h2:~/test;DATABASE_EVENT_LISTENER='com.acme.DbListener' (the quotes around the class name are required). See also the DatabaseEventListener API. #If the database needs more disk space, it calls the database event listener if one is installed. The application may then delete temporary files, or display a message and wait until the user has resolved the problem. To install a listener, run the SQL statement SET DATABASE_EVENT_LISTENER or use a database URL of the form jdbc:h2:~/test;DATABASE_EVENT_LISTENER='com.acme.DbListener' (the quotes around the class name are required). See also the DatabaseEventListener API.
@features_1553_h3 @features_1554_h3
破損したデータベースを開く 破損したデータベースを開く
@features_1554_p @features_1555_p
boot info (始動時に実行されるSQLスクリプト) が破損しているため、データベースを開くことができない場合、データベースイベントリスナーを指定することでデータベースを開くことができます。例外は記録されますが、データベースの開始は続行します。 boot info (始動時に実行されるSQLスクリプト) が破損しているため、データベースを開くことができない場合、データベースイベントリスナーを指定することでデータベースを開くことができます。例外は記録されますが、データベースの開始は続行します。
@features_1555_h2 @features_1556_h2
computed column / ベースインデックスの機能 computed column / ベースインデックスの機能
@features_1556_p @features_1557_p
#Function indexes are not directly supported by this database, but they can be emulated by using computed columns. For example, if an index on the upper-case version of a column is required, create a computed column with the upper-case version of the original column, and create an index for this column: #Function indexes are not directly supported by this database, but they can be emulated by using computed columns. For example, if an index on the upper-case version of a column is required, create a computed column with the upper-case version of the original column, and create an index for this column:
@features_1557_p @features_1558_p
#When inserting data, it is not required (and not allowed) to specify a value for the upper-case version of the column, because the value is generated. But you can use the column when querying the table: #When inserting data, it is not required (and not allowed) to specify a value for the upper-case version of the column, because the value is generated. But you can use the column when querying the table:
@features_1558_h2 @features_1559_h2
多次元インデックス 多次元インデックス
@features_1559_p @features_1560_p
効率的な多次元の (空間的) 領域のクエリーを実行するためにツールを提供します。このデータベースは専門的な空間的インデックス (R-Tree またはより小さいもの) をサポートしていません。代わりに、B-Treeインデックスが使われています。それぞれのレコードに対して、多次元のキーは、単数範囲 (スカラー) の値に変換 (位置づけ) されます。この値は、space-filling curve (空間充填曲線) で位置を指定します。 効率的な多次元の (空間的) 領域のクエリーを実行するためにツールを提供します。このデータベースは専門的な空間的インデックス (R-Tree またはより小さいもの) をサポートしていません。代わりに、B-Treeインデックスが使われています。それぞれのレコードに対して、多次元のキーは、単数範囲 (スカラー) の値に変換 (位置づけ) されます。この値は、space-filling curve (空間充填曲線) で位置を指定します。
@features_1560_p @features_1561_p
現在、Z-order (N-order または Morton-order とも呼ばれています) が使用されています; Hilbert curveも使用できますが、実装はより複雑です。多次元の値を変換するアルゴリズムは、bit-interleavingと呼ばれています。B-Treeインデックス (通常は computed columnを使用します)を使用することで、スカラーの値はインデックスをつけられます。 現在、Z-order (N-order または Morton-order とも呼ばれています) が使用されています; Hilbert curveも使用できますが、実装はより複雑です。多次元の値を変換するアルゴリズムは、bit-interleavingと呼ばれています。B-Treeインデックス (通常は computed columnを使用します)を使用することで、スカラーの値はインデックスをつけられます。
@features_1561_p @features_1562_p
最初のカラムにインデックスを使用する上で、メソッドは徹底的なパフォーマンスの改良をもたらすことができます。データと次元の数によりますが、改良は通常、factor 5よりも高いものです。指定された多次元の範囲から、ツールはSQLクエリーを生成します。使用されたメソッドは、データベースに依存しておらず、ツールは簡単に他のデータベースに移植することができます。ツールの使用方法の例は、TestMultiDimension.java で提供されているサンプルコードをご覧下さい。 最初のカラムにインデックスを使用する上で、メソッドは徹底的なパフォーマンスの改良をもたらすことができます。データと次元の数によりますが、改良は通常、factor 5よりも高いものです。指定された多次元の範囲から、ツールはSQLクエリーを生成します。使用されたメソッドは、データベースに依存しておらず、ツールは簡単に他のデータベースに移植することができます。ツールの使用方法の例は、TestMultiDimension.java で提供されているサンプルコードをご覧下さい。
@features_1562_h2 @features_1563_h2
パスワードを使用する パスワードを使用する
@features_1563_h3 @features_1564_h3
安全なパスワードを使用する 安全なパスワードを使用する
@features_1564_p @features_1565_p
弱いパスワードは、暗号化やセキュリティプロトコルに取るに足らず、解読されてしまうことを覚えておいて下さい。辞書で見つけられるようなパスワードは使用しないでください。また、数字を付け足してもそのようなパスワードは安全にはなりません。良いパスワードを作る方法は、覚えやすい、文章の最初の文字を使う、大文字と小文字を使う、特別な文字が含まれているものを作る、です。例: 弱いパスワードは、暗号化やセキュリティプロトコルに取るに足らず、解読されてしまうことを覚えておいて下さい。辞書で見つけられるようなパスワードは使用しないでください。また、数字を付け足してもそのようなパスワードは安全にはなりません。良いパスワードを作る方法は、覚えやすい、文章の最初の文字を使う、大文字と小文字を使う、特別な文字が含まれているものを作る、です。例:
@features_1565_p @features_1566_p
i'sE2rtPiUKtT (もしトリックを知っていれば、このパスワードは覚えやすいものです) i'sE2rtPiUKtT (もしトリックを知っていれば、このパスワードは覚えやすいものです)
@features_1566_h3 @features_1567_h3
パスワード: Stringの代わりにChar Arraysを使用する パスワード: Stringの代わりにChar Arraysを使用する
@features_1567_p @features_1568_p
Java Stringは不変のオブジェクトであり、アプリケーションによって安全に壊されることはできません。Stringの作成後、Stringは少なくともガベージコレクションになるまで、コンピューターのメインメモリ内にとどまるでしょう。ガベージコレクションはアプリケーションによって制御されず、ガベージコレクションであっても、データはまだメモリにとどまっているでしょう。パスワードが含まれるメモリの一部をディスクと取り換えることも可能でしょう (十分でないメインメモリも使用可能のため)。 Java Stringは不変のオブジェクトであり、アプリケーションによって安全に壊されることはできません。Stringの作成後、Stringは少なくともガベージコレクションになるまで、コンピューターのメインメモリ内にとどまるでしょう。ガベージコレクションはアプリケーションによって制御されず、ガベージコレクションであっても、データはまだメモリにとどまっているでしょう。パスワードが含まれるメモリの一部をディスクと取り換えることも可能でしょう (十分でないメインメモリも使用可能のため)。
@features_1568_p @features_1569_p
アタッカーはオペレーティングシステムのスワップファイルにアクセスするでしょう。したがって、パスワードを保存するために、Stringの代わりにchar arrayを使用するのは良い方法です。char arrayは使用後クリアにされるので (0で埋められます)、パスワードはスワップファイルに保存されません。 アタッカーはオペレーティングシステムのスワップファイルにアクセスするでしょう。したがって、パスワードを保存するために、Stringの代わりにchar arrayを使用するのは良い方法です。char arrayは使用後クリアにされるので (0で埋められます)、パスワードはスワップファイルに保存されません。
@features_1569_p @features_1570_p
このデータベースは、ユーザーパスワードとファイルパスワードを認証するために、Stringの代わりにchar arrayを使用することをサポートしています。次のコードはこのように使用されます: このデータベースは、ユーザーパスワードとファイルパスワードを認証するために、Stringの代わりにchar arrayを使用することをサポートしています。次のコードはこのように使用されます:
@features_1570_p @features_1571_p
#This example requires Java 1.6. When using Swing, use javax.swing.JPasswordField. #This example requires Java 1.6. When using Swing, use javax.swing.JPasswordField.
@features_1571_h3 @features_1572_h3
ユーザー名 と (または) パスワードをURLで認証する ユーザー名 と (または) パスワードをURLで認証する
@features_1572_p @features_1573_p
#Instead of passing the user name as a separate parameter as in <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", "123");</code> the user name (and/or password) can be supplied in the URL itself: <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test;USER=sa;PASSWORD=123");</code> The settings in the URL override the settings passed as a separate parameter. #Instead of passing the user name as a separate parameter as in <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", "123");</code> the user name (and/or password) can be supplied in the URL itself: <code>Connection conn = DriverManager. getConnection("jdbc:h2:~/test;USER=sa;PASSWORD=123");</code> The settings in the URL override the settings passed as a separate parameter.
@features_1573_h2 @features_1574_h2
ユーザー定義の関数とストアドプロシージャ ユーザー定義の関数とストアドプロシージャ
@features_1574_p @features_1575_p
組み込み関数に加えて、このデータベースはユーザー定義のJava関数をサポートしています。同様に、このデータベースではJava関数はストアドプロシージャとして使用されています。関数は、使用される前に宣言 (登録) されていなければなりません。static Javaメソッドのみサポートされています; クラスとメソッドの両方が public である必要があります。Javaメソッドの例: 組み込み関数に加えて、このデータベースはユーザー定義のJava関数をサポートしています。同様に、このデータベースではJava関数はストアドプロシージャとして使用されています。関数は、使用される前に宣言 (登録) されていなければなりません。static Javaメソッドのみサポートされています; クラスとメソッドの両方が public である必要があります。Javaメソッドの例:
@features_1575_p @features_1576_p
Java関数は、CREATE ALIAS と呼ばれるデータベースに登録されていなければなりません: Java関数は、CREATE ALIAS と呼ばれるデータベースに登録されていなければなりません:
@features_1576_p @features_1577_p
完全なサンプルアプリケーションは src/test/org/h2/samples/Function.java をご覧下さい。 完全なサンプルアプリケーションは src/test/org/h2/samples/Function.java をご覧下さい。
@features_1577_h3 @features_1578_h3
データタイプマッピング関数 データタイプマッピング関数
@features_1578_p @features_1579_p
#Functions that accept non-nullable parameters such as 'int' will not be called if one of those parameters is NULL. Instead, the result of the function is NULL. If the function should be called if a parameter is NULL, you need to use 'java.lang.Integer' instead of 'int'. #Functions that accept non-nullable parameters such as 'int' will not be called if one of those parameters is NULL. Instead, the result of the function is NULL. If the function should be called if a parameter is NULL, you need to use 'java.lang.Integer' instead of 'int'.
@features_1579_h3 @features_1580_h3
接続を必要とする関数 接続を必要とする関数
@features_1580_p @features_1581_p
#If the first parameter of a Java function is a java.sql.Connection, then the connection to database is provided. This connection does not need to be closed before returning. When calling the method from within the SQL statement, this connection parameter does not need to be (can not be) specified. #If the first parameter of a Java function is a java.sql.Connection, then the connection to database is provided. This connection does not need to be closed before returning. When calling the method from within the SQL statement, this connection parameter does not need to be (can not be) specified.
@features_1581_h3 @features_1582_h3
例外を投げる関数 例外を投げる関数
@features_1582_p @features_1583_p
関数が例外を投げたら、現在のステートメントはロールバックされ、例外はアプリケーションに投げられます。 関数が例外を投げたら、現在のステートメントはロールバックされ、例外はアプリケーションに投げられます。
@features_1583_h3 @features_1584_h3
Result Setを返す関数 Result Setを返す関数
@features_1584_p @features_1585_p
関数はresult setを返します。このような関数はCALLステートメントと一緒に呼ばれます: 関数はresult setを返します。このような関数はCALLステートメントと一緒に呼ばれます:
@features_1585_h3 @features_1586_h3
SimpleResultSetを使用する SimpleResultSetを使用する
@features_1586_p @features_1587_p
#A function can create a result set using the SimpleResultSet tool: #A function can create a result set using the SimpleResultSet tool:
@features_1587_h3 @features_1588_h3
関数をテーブルとして使用する 関数をテーブルとして使用する
@features_1588_p @features_1589_p
#A function that returns a result set can be used like a table. However, in this case the function is called at least twice: First while parsing the statement to collect the column names (with parameters set to null where not known at compile time). And then, while executing the statement to get the data (maybe multiple times if this is a join). If the function is called just to get the column list, the URL of the connection passed to the function is <code>jdbc:columnlist:connection</code> . Otherwise, the URL of the connection is <code>jdbc:default:connection</code> . #A function that returns a result set can be used like a table. However, in this case the function is called at least twice: First while parsing the statement to collect the column names (with parameters set to null where not known at compile time). And then, while executing the statement to get the data (maybe multiple times if this is a join). If the function is called just to get the column list, the URL of the connection passed to the function is <code>jdbc:columnlist:connection</code> . Otherwise, the URL of the connection is <code>jdbc:default:connection</code> .
@features_1589_h2 @features_1590_h2
トリガー トリガー
@features_1590_p @features_1591_p
このデータベースは、行が更新、挿入、または削除された前後に呼ばれるJavaトリガーをサポートしています。トリガーは複雑な一貫性チェックか、データベース内の関連したデータをアップデートするのに使用されます。マテリアライズドビューをシミュレートするためにトリガーを使用することも可能です。完全なサンプルアプリケーションは src/test/org/h2/samples/TriggerSample.java をご覧下さい。Javaトリガーは、インターフェイス org.h2.api.Trigger を実装しなければなりません: このデータベースは、行が更新、挿入、または削除された前後に呼ばれるJavaトリガーをサポートしています。トリガーは複雑な一貫性チェックか、データベース内の関連したデータをアップデートするのに使用されます。マテリアライズドビューをシミュレートするためにトリガーを使用することも可能です。完全なサンプルアプリケーションは src/test/org/h2/samples/TriggerSample.java をご覧下さい。Javaトリガーは、インターフェイス org.h2.api.Trigger を実装しなければなりません:
@features_1591_p @features_1592_p
他のテーブルのクエリーかデータのアップデートに接続を使用することができます。トリガーはその時データベースで定義されている必要があります: 他のテーブルのクエリーかデータのアップデートに接続を使用することができます。トリガーはその時データベースで定義されている必要があります:
@features_1592_p @features_1593_p
#The trigger can be used to veto a change, by throwing a SQLException. #The trigger can be used to veto a change, by throwing a SQLException.
@features_1593_h2 @features_1594_h2
データベースをコンパクトにする データベースをコンパクトにする
@features_1594_p @features_1595_p
データベースファイルの空のスペースは自動的に再利用されます。インデックスを再構築するもっとも簡単な方法は、データベースが閉じられている間に .index.db ファイルを削除します。しかし、一部状況では (例えば、データベースの多数のデータを削除した後)、データベースのサイズを縮小したい場合があります (データベースをコンパクトにする)。そのためのサンプルです: データベースファイルの空のスペースは自動的に再利用されます。インデックスを再構築するもっとも簡単な方法は、データベースが閉じられている間に .index.db ファイルを削除します。しかし、一部状況では (例えば、データベースの多数のデータを削除した後)、データベースのサイズを縮小したい場合があります (データベースをコンパクトにする)。そのためのサンプルです:
@features_1595_p @features_1596_p
サンプルアプリケーション org.h2.samples.Compact もご覧下さい。データベースのバックアップを作るのと、スクリプトからデータベースを再構築するのにSCRIPT / RUNSCRIPT コマンドを使用することができます。 サンプルアプリケーション org.h2.samples.Compact もご覧下さい。データベースのバックアップを作るのと、スクリプトからデータベースを再構築するのにSCRIPT / RUNSCRIPT コマンドを使用することができます。
@features_1596_h2 @features_1597_h2
キャッシュの設定 キャッシュの設定
@features_1597_p
データベースは最も頻繁に使われるデータやインデックスページをメインメモリに保存します。キャッシュに使用されるメモリ量を CACHE_SIZE 設定を使用して変更することができます。この設定は、データベース接続URL (jdbc:h2:~/test;CACHE_SIZE=131072) か、ランタイムにSET CACHE_SIZE を使用してサイズを変更できます。
@features_1598_p @features_1598_p
このデータベースは二つのcache page replacement algorithms (キャッシュページ置換アルゴリズム) をサポートしています: LRU (デフォルト) と2Qです。LRUは、キャッシュがいっぱいになったら、頻繁に使用されていないページをキャッシュから削除します。2Qアルゴリズムは少し複雑で、基本的に二つのクエリーが使用されます。2Qアルゴリズムはテーブルスキャンに、より抵抗がありますが、LRUと比較してオーバーヘッドは少し高めです。キャッシュアルゴリズム 2Qを使用するためには、フォームのデータベースURL jdbc:h2:~/test;CACHE_TYPE=TQ を使用します。キャッシュアルゴリズムは、一度データベースが開かれたら変更することはできません データベースは最も頻繁に使われるデータやインデックスページをメインメモリに保存します。キャッシュに使用されるメモリ量を CACHE_SIZE 設定を使用して変更することができます。この設定は、データベース接続URL (jdbc:h2:~/test;CACHE_SIZE=131072) か、ランタイムにSET CACHE_SIZE を使用してサイズを変更できます
@features_1599_p @features_1599_p
#This database supports two cache page replacement algorithms: LRU (the default) and TQ. For LRU, the pages that were least frequently used are removed from the cache if it becomes full. The TQ (Two Queue, also called 2Q) algorithm is a bit more complicated: basically two queues are used. It is more resistant to table scans, however the overhead is a bit higher compared to the LRU. To use the cache algorithm TQ, use a database URL of the form jdbc:h2:~/test;CACHE_TYPE=TQ. The cache algorithm cannot be changed once the database is open.
@features_1600_p
#Also supported is a second level soft reference cache. Rows in this cache are only garbage collected on low memory. By default the second level cache is disabled. To enable it, use the prefix SOFT_. Example: jdbc:h2:~/test;CACHE_TYPE=SOFT_LRU .
@features_1601_p
読んだり書いたりしたページや、現在使用されているキャッシュアルゴリズムの情報を得るためには、SELECT * FROM INFORMATION_SCHEMA.SETTINGS を呼びます。データとインデックスファイルに読み書きしたページ数が書かれています。 読んだり書いたりしたページや、現在使用されているキャッシュアルゴリズムの情報を得るためには、SELECT * FROM INFORMATION_SCHEMA.SETTINGS を呼びます。データとインデックスファイルに読み書きしたページ数が書かれています。
@fragments_1000_b @fragments_1000_b
...@@ -7353,6 +7380,12 @@ MySQL ...@@ -7353,6 +7380,12 @@ MySQL
@performance_1414_p @performance_1414_p
#See <code>src/test/org/h2/samples/optimizations.sql</code> for a few examples of queries that benefit from special optimizations built into the database. #See <code>src/test/org/h2/samples/optimizations.sql</code> for a few examples of queries that benefit from special optimizations built into the database.
@performance_1415_h3
#Cache Size and Type
@performance_1416_p
#By default the cache size of H2 is quite small. Consider using a larger cache size, or enable the second level soft reference cache. See also <a href="features.html#cache_settings">Cache Settings</a> .
@quickstart_1000_h1 @quickstart_1000_h1
クイックスタート クイックスタート
...@@ -7972,52 +8005,52 @@ SQLコマンドがコマンドエリアに表示されます。 ...@@ -7972,52 +8005,52 @@ SQLコマンドがコマンドエリアに表示されます。
#Use LinkedList instead of ArrayList where applicable #Use LinkedList instead of ArrayList where applicable
@roadmap_1173_li @roadmap_1173_li
#Support % operator (modulo) #Optimizer: use an index for IS NULL and IS NOT NULL (including linked tables). ID IS NOT NULL could be converted to ID >= Integer.MIN_VALUE.
@roadmap_1174_li @roadmap_1174_li
#Support 1+'2'=3, '1'+'2'='12' (MS SQL Server compatibility) #Support % operator (modulo)
@roadmap_1175_li @roadmap_1175_li
#Support nested transactions #Support 1+'2'=3, '1'+'2'='12' (MS SQL Server compatibility)
@roadmap_1176_li @roadmap_1176_li
#Add a benchmark for big databases, and one for many users #Support nested transactions
@roadmap_1177_li @roadmap_1177_li
#Compression in the result set (repeating values in the same column) over TCP/IP #Add a benchmark for big databases, and one for many users
@roadmap_1178_li @roadmap_1178_li
#Support curtimestamp (like curtime, curdate) #Compression in the result set (repeating values in the same column) over TCP/IP
@roadmap_1179_li @roadmap_1179_li
#Support ANALYZE {TABLE|INDEX} tableName COMPUTE|ESTIMATE|DELETE STATISTICS ptnOption options #Support curtimestamp (like curtime, curdate)
@roadmap_1180_li @roadmap_1180_li
#Support Sequoia (Continuent.org) #Support ANALYZE {TABLE|INDEX} tableName COMPUTE|ESTIMATE|DELETE STATISTICS ptnOption options
@roadmap_1181_li @roadmap_1181_li
#Dynamic length numbers / special methods for DataPage.writeByte / writeShort / Ronni Nielsen #Support Sequoia (Continuent.org)
@roadmap_1182_li @roadmap_1182_li
#Pluggable ThreadPool, (AvalonDB / deebee / Paul Hammant) #Dynamic length numbers / special methods for DataPage.writeByte / writeShort / Ronni Nielsen
@roadmap_1183_li @roadmap_1183_li
#Release locks (shared or exclusive) on demand #Pluggable ThreadPool, (AvalonDB / deebee / Paul Hammant)
@roadmap_1184_li @roadmap_1184_li
#Support OUTER UNION #Release locks (shared or exclusive) on demand
@roadmap_1185_li @roadmap_1185_li
#Support parameterized views (similar to CSVREAD, but using just SQL for the definition) #Support OUTER UNION
@roadmap_1186_li @roadmap_1186_li
#A way (JDBC driver) to map an URL (jdbc:h2map:c1) to a connection object #Support parameterized views (similar to CSVREAD, but using just SQL for the definition)
@roadmap_1187_li @roadmap_1187_li
#Option for SCRIPT to only process one or a set of tables, and append to a file #A way (JDBC driver) to map an URL (jdbc:h2map:c1) to a connection object
@roadmap_1188_li @roadmap_1188_li
#Support using a unique index for IS NULL (including linked tables) #Option for SCRIPT to only process one or a set of tables, and append to a file
@roadmap_1189_li @roadmap_1189_li
#Support linked tables to the current database #Support linked tables to the current database
...@@ -8604,13 +8637,19 @@ SQLコマンドがコマンドエリアに表示されます。 ...@@ -8604,13 +8637,19 @@ SQLコマンドがコマンドエリアに表示されます。
@roadmap_1383_li @roadmap_1383_li
#MySQL compatibility: DatabaseMetaData.stores*() methods should return the same values. Test with SquirrelSQL. #MySQL compatibility: DatabaseMetaData.stores*() methods should return the same values. Test with SquirrelSQL.
@roadmap_1384_h2 @roadmap_1384_li
#Not Planned #Support table partitioning.
@roadmap_1385_li @roadmap_1385_li
#MS SQL Server compatibility: support DATEPART syntax.
@roadmap_1386_h2
#Not Planned
@roadmap_1387_li
#HSQLDB (did) support this: select id i from test where i&lt;0 (other databases don't). Supporting it may break compatibility. #HSQLDB (did) support this: select id i from test where i&lt;0 (other databases don't). Supporting it may break compatibility.
@roadmap_1386_li @roadmap_1388_li
#String.intern (so that Strings can be compared with ==) will not be used because some VMs have problems when used extensively. #String.intern (so that Strings can be compared with ==) will not be used because some VMs have problems when used extensively.
@search_1000_b @search_1000_b
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -86,10 +86,10 @@ li { ...@@ -86,10 +86,10 @@ li {
<div style="float:left; margin:5px; width:320px;"> <div style="float:left; margin:5px; width:320px;">
<h2>Using H2</h2> <h2>Using H2</h2>
<ul><li>Download the <ul><li>Download the
<a href="http://repo1.maven.org/maven2/com/h2database/h2/1.1.111/h2-1.1.111.jar">jar file</a>, <a href="http://repo1.maven.org/maven2/com/h2database/h2/1.1.111/h2-1.1.111.jar">jar file</a>,
<a href="http://www.h2database.com/h2-setup-2009-04-10.exe">Windows installer</a>, or <a href="http://www.h2database.com/h2-setup-2009-04-10.exe">Windows installer</a>, or
<a href="http://www.h2database.com/h2-2009-04-10.zip">zip file</a>. <a href="http://www.h2database.com/h2-2009-04-10.zip">zip file</a>.
</li><li>To start the H2 Console tool, double click the jar file, or run <code>java -jar h2*.jar</code>, <code>h2.bat</code> or <code>h2.sh</code>. </li><li>To start the H2 Console tool, double click the jar file, or run <code>java -jar h2*.jar</code>, <code>h2.bat</code> or <code>h2.sh</code>.
</li><li>A new database is automatically created if it does not yet exist. </li><li>A new database is automatically created if it does not yet exist.
</li><li>Closing the last connection closes a database. </li><li>Closing the last connection closes a database.
...@@ -114,7 +114,7 @@ li { ...@@ -114,7 +114,7 @@ li {
<b>Settings</b><br /> <b>Settings</b><br />
<code>jdbc:h2:..;MODE=MySQL</code> compatibility (or HSQLDB,...)<br /> <code>jdbc:h2:..;MODE=MySQL</code> compatibility (or HSQLDB,...)<br />
<code>jdbc:h2:..;TRACE_LEVEL_FILE=3</code> log to .trace.db<br /> <code>jdbc:h2:..;TRACE_LEVEL_FILE=3</code> log to .trace.db<br />
<p> </p>
<h2>Documentation</h2> <h2>Documentation</h2>
Reference: Reference:
...@@ -131,7 +131,7 @@ Features: ...@@ -131,7 +131,7 @@ Features:
<a href="http://www.h2database.com/html/datatypes.html">(in a zip or jar file)</a>, <a href="http://www.h2database.com/html/datatypes.html">(in a zip or jar file)</a>,
<a href="http://www.h2database.com/html/datatypes.html">CSV files</a>, <a href="http://www.h2database.com/html/datatypes.html">CSV files</a>,
<br /> <br />
</div> </div>
<div style="float:right; padding:5px; width:320px;"> <div style="float:right; padding:5px; width:320px;">
...@@ -139,7 +139,7 @@ Features: ...@@ -139,7 +139,7 @@ Features:
<pre> <pre>
Class.forName("org.h2.Driver"); Class.forName("org.h2.Driver");
Connection conn = DriverManager. Connection conn = DriverManager.
getConnection("jdbc:h2:~/test"); getConnection("jdbc:h2:~/test");
conn.close(); conn.close();
</pre> </pre>
...@@ -147,11 +147,11 @@ conn.close(); ...@@ -147,11 +147,11 @@ conn.close();
<pre> <pre>
import org.h2.jdbcx.JdbcConnectionPool; import org.h2.jdbcx.JdbcConnectionPool;
DataSource cp = JdbcConnectionPool. DataSource cp = JdbcConnectionPool.
create("jdbc:h2:~/test"); create("jdbc:h2:~/test");
Connection conn = cp.getConnection(); Connection conn = cp.getConnection();
conn.close(); cp.dispose(); conn.close(); cp.dispose();
</pre> </pre>
<h2>Start a Server</h2> <h2>Start a Server</h2>
<pre> <pre>
java -cp h2*.jar org.h2.tools.Server java -cp h2*.jar org.h2.tools.Server
...@@ -161,7 +161,7 @@ java -cp h2*.jar org.h2.tools.Server ...@@ -161,7 +161,7 @@ java -cp h2*.jar org.h2.tools.Server
In the file hibernate.cfg.xml, set: In the file hibernate.cfg.xml, set:
<pre> <pre>
&lt;property name="dialect"&gt; &lt;property name="dialect"&gt;
org.hibernate.dialect.H2Dialect org.hibernate.dialect.H2Dialect
&lt;/property&gt; &lt;/property&gt;
</pre> </pre>
As an alternative, use the HSQLDialect. As an alternative, use the HSQLDialect.
......
...@@ -588,4 +588,4 @@ animate scaladoc models disadvantages vladykin sergi trims requesting ...@@ -588,4 +588,4 @@ animate scaladoc models disadvantages vladykin sergi trims requesting
handing bonita placed euros embeds reliability singular unregister quotas handing bonita placed euros embeds reliability singular unregister quotas
overall httpdocs tigris eclemma separates underscore yajsw she her truncating overall httpdocs tigris eclemma separates underscore yajsw she her truncating
relocating smtps smtp osde joist catching guesses delimiters shortlist sheet relocating smtps smtp osde joist catching guesses delimiters shortlist sheet
rowspan cheat rowspan cheat partitioning datepart
\ No newline at end of file \ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论