# Frequently Asked Questions

Are there Known Bugs? When is the Next Release?
Is this Database Engine Open Source?
My Query is Slow
How to Create a New Database?
How to Connect to a Database?
Where are the Database Files Stored?
What is the Size Limit (Maximum Size) of a Database?
Is it Reliable?
Why is Opening my Database Slow?
Is the GCJ Version Stable? Faster?
How to Translate this Project?

### Are there Known Bugs? When is the Next Release?

Usually, bugs get fixes as they are found. There is a release every few weeks. Here is the list of known and confirmed issues:

- Tomcat and Glassfish 3 sets all static fields (final or non-final) to null when unloading a web application. This can cause a NullPointerException in H2 versions 1.1.107 and older, and may still not work in newer versions. Please report it if you run into this issue. In Tomcat >= 6.0 this behavior can be disabled by setting the system property org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES to false, however Tomcat may then run out of memory. A known workaround is to put the h2.jar file in the `lib` directory.
- Some problems have been found with right outer join. Internally, it is converted to left outer join, which does not always produce the same results as other databases when used in combination with other joins.
- When using Install4j before 4.1.4 on Linux and enabling 'pack200', 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. This problem is solved in Install4j 4.1.4.

### Is this Database Engine Open Source?

Yes. It is free to use and distribute, and the source code is included. See also under license.

### My Query is Slow

Slow SELECT (or DELETE, UPDATE, MERGE) statement can have multiple reasons. Follow this checklist:

- Run ANALYZE (see documentation for details).
- Run the query with EXPLAIN and check if indexes are used (see documentation for details).
- If required, create additional indexes and try again using ANALYZE and EXPLAIN.
- If it doesn't help please report the problem.

### How to Create a New Database?

By default, a new database is automatically created if it does not yet exist.

### How to Connect to a Database?

The database driver is `org.h2.Driver`, and the database URL starts with `jdbc:h2:`. To connect to a database using JDBC, use the following code:

    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");

### Where are the Database Files Stored?

When using database URLs like jdbc:h2:~/test, the database is stored in the user directory. For Windows, this is usually C:\Documents and Settings\<userName>. If the base directory is not set (as in jdbc:h2:test), the database files are stored in the directory where the application is started (the current working directory). When using the H2 Console application from the start menu, this is [Installation Directory]/bin. The base directory can be set in the database URL. A fixed or relative path can be used. When using the URL jdbc:h2:file:data/sample, the database is stored in the directory data (relative to the current working directory). The directory is created automatically if it does not yet exist. It is also possible to use the fully qualified directory (and for Windows, drive) name. Example: jdbc:h2:file:C:/data/test

### What is the Size Limit (Maximum Size) of a Database?

The theoretical limit is currently 256 GB for the data. This number is excluding BLOB and CLOB data: Every CLOB or BLOB can be up to 256 GB as well. The size limit of the index data is 256 GB as well.

The maximum number of rows per table is 2'147'483'648.

The maximum file size for FAT or FAT32 file systems is 4 GB. So if you use FAT or FAT32, the limit is 4 GB for the data.

The larger the database, the more main memory is required. Currently the minimum main memory required for a 12 GB database is around 240 MB.

### Is it Reliable?

That is not easy to say. It is still a quite new product. A lot of tests have been written, and the code coverage of these tests is very high. Randomized stress tests are run regularly. But as this is a relatively new product, there are probably some problems that have not yet been found (as with most software). Some features are known to be dangerous by design, and some problems are hard to solve. Those are:

- Using SET LOG 0 to disable the transaction log file.
- Using the transaction isolation level READ_UNCOMMITTED (LOCK_MODE 0) while at the same time using multiple connections may result in inconsistent transactions.
- Using FILE_LOCK=NO in the database URL.

In addition to that, running out of memory should be avoided. In some versions, OutOfMemory errors while using the database could corrupt a databases. Not all such problems may be fixed.

Areas that are not fully tested:

- Platforms other than Windows XP or Linux, or JVMs other than Sun 1.4 - 1.6
- The features AUTO_SERVER and AUTO_RECONNECT
- The MVCC (multi version concurrency) mode
- Cluster mode, 2-phase commit, savepoints
- 24/7 operation
- Some operations on databases larger than 500 MB may be slower than expected
- Multi-threading and using multiple connections
- The optimizer may not always select the best plan

Areas considered Experimental:

- The PostgreSQL server
- Compatibility modes for other databases (only some features are implemented)
- The ARRAY data type and related functionality

### Why is Opening my Database Slow?

If it takes a long time to open a database, in most cases it was not closed the last time. This is specially a problem for larger databases. To close a database, close all connections to it before the application ends, or execute the command SHUTDOWN. The database is also closed when the virtual machine exits normally by using a shutdown hook. However killing a Java process or calling Runtime.halt will prevent this.

To find out what the problem is, open the database in embedded mode using the H2 Console. This will print progress information. If you have many 'Creating index' lines it is an indication that the database was not closed the last time.

Other possible reasons are: the database is very big (many GB), or contains linked tables that are slow to open.

### Is the GCJ Version Stable? Faster?

The GCJ version is not as stable as the Java version. When running the regression test with the GCJ version, sometimes the application just stops at what seems to be a random point without error message. Currently, the GCJ version is also slower than when using the Sun VM. However, the startup of the GCJ version is faster than when using a VM.

### How to Translate this Project?

For more information, see Build/Translating.