blob: 30c784b3f958ea365dda5bca2b0003a60cf077f6 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<appendix id="supported_databases">
<title>
Supported Databases
</title>
<para>
Following is a table of the database and JDBC driver versions that are supported
by OpenJPA.
</para>
<table tocentry="1">
<title>
Supported Databases and JDBC Drivers
</title>
<tgroup rowsep="1" colsep="1" align="left" cols="4">
<colspec colname="dbname"/>
<colspec colname="dbversion"/>
<colspec colname="drivname"/>
<colspec colname="drivversion"/>
<thead>
<row>
<entry colname="dbname">
Database Name
</entry>
<entry colname="dbversion">
Database Version
</entry>
<entry colname="drivname">
JDBC Driver Name
</entry>
<entry colname="drivversion">
JDBC Driver Version
</entry>
</row>
</thead>
<tbody>
<row>
<entry colname="dbname">
Apache Derby
</entry>
<entry colname="dbversion">
10.1.2.1
</entry>
<entry colname="drivname">
Apache Derby Embedded JDBC Driver
</entry>
<entry colname="drivversion">
10.1.2.1
</entry>
</row>
<row>
<entry colname="dbname">
Borland Interbase
</entry>
<entry colname="dbversion">
7.1.0.202
</entry>
<entry colname="drivname">
Interclient
</entry>
<entry colname="drivversion">
4.5.1
</entry>
</row>
<row>
<entry colname="dbname">
Borland JDataStore
</entry>
<entry colname="dbversion">
6.0
</entry>
<entry colname="drivname">
Borland JDataStore
</entry>
<entry colname="drivversion">
6.0
</entry>
</row>
<row>
<entry colname="dbname">
DB2
</entry>
<entry colname="dbversion">
8.1
</entry>
<entry colname="drivname">
IBM DB2 JDBC Universal Driver
</entry>
<entry colname="drivversion">
1.0.581
</entry>
</row>
<row>
<entry colname="dbname">
Empress
</entry>
<entry colname="dbversion">
8.62
</entry>
<entry colname="drivname">
Empress Category 2 JDBC Driver
</entry>
<entry colname="drivversion">
8.62
</entry>
</row>
<row>
<entry colname="dbname">
Firebird
</entry>
<entry colname="dbversion">
1.5
</entry>
<entry colname="drivname">
JayBird JCA/JDBC driver
</entry>
<entry colname="drivversion">
1.0.1
</entry>
</row>
<row>
<entry colname="dbname">
H2 Database Engine
</entry>
<entry colname="dbversion">
1.0
</entry>
<entry colname="drivname">
H2
</entry>
<entry colname="drivversion">
1.0
</entry>
</row>
<row>
<entry colname="dbname">
Hypersonic Database Engine
</entry>
<entry colname="dbversion">
1.8.0
</entry>
<entry colname="drivname">
Hypersonic
</entry>
<entry colname="drivversion">
1.8.0
</entry>
</row>
<row>
<entry colname="dbname">
Informix Dynamic Server
</entry>
<entry colname="dbversion">
9.30.UC10
</entry>
<entry colname="drivname">
Informix JDBC driver
</entry>
<entry colname="drivversion">
2.21.JC2
</entry>
</row>
<row>
<entry colname="dbname">
InterSystems Cache
</entry>
<entry colname="dbversion">
5.0
</entry>
<entry colname="drivname">
Cache JDBC Driver
</entry>
<entry colname="drivversion">
5.0
</entry>
</row>
<row>
<entry colname="dbname">
Microsoft Access
</entry>
<entry colname="dbversion">
9.0 (a.k.a. "2000")
</entry>
<entry colname="drivname">
DataDirect SequeLink
</entry>
<entry colname="drivversion">
5.4.0038
</entry>
</row>
<row>
<entry colname="dbname">
Microsoft SQL Server
</entry>
<entry colname="dbversion">
9.00.1399 (SQL Server 2005)
</entry>
<entry colname="drivname">
SQLServer
</entry>
<entry colname="drivversion">
1.0.809.102
</entry>
</row>
<row>
<entry colname="dbname">
Microsoft Visual FoxPro
</entry>
<entry colname="dbversion">
7.0
</entry>
<entry colname="drivname">
DataDirect SequeLink
</entry>
<entry colname="drivversion">
5.4.0038
</entry>
</row>
<row>
<entry colname="dbname">
MySQL
</entry>
<entry colname="dbversion">
3.23.43-log
</entry>
<entry colname="drivname">
MySQL Driver
</entry>
<entry colname="drivversion">
3.0.14
</entry>
</row>
<row>
<entry colname="dbname">
MySQL
</entry>
<entry colname="dbversion">
5.0.26
</entry>
<entry colname="drivname">
MySQL Driver
</entry>
<entry colname="drivversion">
3.0.14
</entry>
</row>
<row>
<entry colname="dbname">
Oracle
</entry>
<entry colname="dbversion">
8.1,9.2,10.1
</entry>
<entry colname="drivname">
Oracle JDBC driver
</entry>
<entry colname="drivversion">
10.2.0.1.0
</entry>
</row>
<row>
<entry colname="dbname">
Pointbase
</entry>
<entry colname="dbversion">
4.4
</entry>
<entry colname="drivname">
Pointbase JDBC driver
</entry>
<entry colname="drivversion">
4.4 (4.4)
</entry>
</row>
<row>
<entry colname="dbname">
PostgreSQL
</entry>
<entry colname="dbversion">
7.2.1
</entry>
<entry colname="drivname">
PostgreSQL Native Driver
</entry>
<entry colname="drivversion">
8.1
</entry>
</row>
<row>
<entry colname="dbname">
PostgreSQL
</entry>
<entry colname="dbversion">
8.1.5
</entry>
<entry colname="drivname">
PostgreSQL Native Driver
</entry>
<entry colname="drivversion">
8.1
</entry>
</row>
<row>
<entry colname="dbname">
Sybase Adaptive Server Enterprise
</entry>
<entry colname="dbversion">
12.5
</entry>
<entry colname="drivname">
jConnect
</entry>
<entry colname="drivversion">
5.5 (5.5)
</entry>
</row>
</tbody>
</tgroup>
</table>
<section id="dbsupport_derby">
<title>
Apache Derby
</title>
<example id="example_props_derby">
<title>
Example properties for Derby
</title>
<programlisting>
openjpa.ConnectionDriverName: org.apache.derby.jdbc.EmbeddedDriver
openjpa.ConnectionURL: jdbc:derby:DB_NAME;create=true
</programlisting>
</example>
</section>
<section id="dbsupport_interbase">
<title>
Borland Interbase
</title>
<example id="example_props_interbase">
<title>
Example properties for Interbase
</title>
<programlisting>
openjpa.ConnectionDriverName: interbase.interclient.Driver
openjpa.ConnectionURL: jdbc:interbase://SERVER_NAME:SERVER_PORT/DB_PATH
</programlisting>
</example>
<section id="dbsupport_interbase_issues">
<title>
Known issues with Interbase
</title>
<itemizedlist>
<listitem>
<para>
Interbase does not support record locking, so
datastore transactions cannot use the pessimistic lock manager.
</para>
</listitem>
<listitem>
<para>
Interbase does not support the <literal>LOWER</literal>, <literal>SUBSTRING
</literal>, or <literal>INSTR</literal> SQL functions>
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_jdatastore">
<title>
JDataStore
</title>
<example id="example_props_jdatastore">
<title>
Example properties for JDataStore
</title>
<programlisting>
openjpa.ConnectionDriverName: com.borland.datastore.jdbc.DataStoreDriver
openjpa.ConnectionURL: jdbc:borland:dslocal:db-jdatastore.jds;create=true
</programlisting>
</example>
</section>
<section id="dbsupport_db2">
<title>
IBM DB2
</title>
<example id="example_props_db2">
<title>
Example properties for IBM DB2
</title>
<programlisting>
openjpa.ConnectionDriverName: com.ibm.db2.jcc.DB2Driver
openjpa.ConnectionURL: jdbc:db2://SERVER_NAME:SERVER_PORT/DB_NAME
</programlisting>
</example>
<section id="dbsupport_db2_issues">
<title>
Known issues with DB2
</title>
<itemizedlist>
<listitem>
<para>
Floats and doubles may lose precision when stored.
</para>
</listitem>
<listitem>
<para>
Empty char values are stored as NULL.
</para>
</listitem>
<listitem>
<para>
Fields of type BLOB and CLOB are limited to 1M. This number can be increased by
extending <classname>DB2Dictionary</classname>.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_empress">
<title>
Empress
</title>
<example id="example_props_empress">
<title>
Example properties for Empress
</title>
<programlisting>
openjpa.ConnectionDriverName: empress.jdbc.empressDriver
openjpa.ConnectionURL: jdbc:empress://SERVER=yourserver;PORT=6322;DATABASE=yourdb
</programlisting>
</example>
<section id="dbsupport_empress_issues">
<title>
Known issues with Empress
</title>
<itemizedlist>
<listitem>
<para>
Empress enforces pessimistic semantics (lock on
read) when not using <literal>AllowConcurrentRead</literal> property (which
bypasses row locking) for <classname>EmpressDictionary</classname>.
</para>
</listitem>
<listitem>
<para>
Only the category 2 non-local driver is supported.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_h2">
<title>
H2 Database Engine
</title>
<example id="example_props_h2">
<title>
Example properties for H2 Database Engine
</title>
<programlisting>
openjpa.ConnectionDriverName: org.h2.Driver
openjpa.ConnectionURL: jdbc:h2:DB_NAME
</programlisting>
</example>
<section id="dbsupport_h2_issues">
<title>
Known issues with H2 Database Engine
</title>
<itemizedlist>
<listitem>
<para>
H2 does not support cross joins
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_hypersonic">
<title>
Hypersonic
</title>
<example id="example_props_hypersonic">
<title>
Example properties for Hypersonic
</title>
<programlisting>
openjpa.ConnectionDriverName: org.hsqldb.jdbcDriver
openjpa.ConnectionURL: jdbc:hsqldb:DB_NAME
</programlisting>
</example>
<section id="dbsupport_hypersonic_issues">
<title>
Known issues with Hypersonic
</title>
<itemizedlist>
<listitem>
<para>
Hypersonic does not support pessimistic locking, so non-optimistic transactions
will fail unless the <literal>SimulateLocking</literal> property is set for the
<link linkend="openjpa.jdbc.DBDictionary"> openjpa.jdbc.DBDictionary</link>
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_firebird">
<title>
Firebird
</title>
<example id="example_props_firebird">
<title>
Example properties for Firebird
</title>
<programlisting>
openjpa.ConnectionDriverName: org.firebirdsql.jdbc.FBDriver
openjpa.ConnectionURL: jdbc:firebirdsql://SERVER_NAME:SERVER_PORT/DB_PATH
</programlisting>
</example>
<section id="dbsupport_firebird_issues">
<title>
Known issues with Firebird
</title>
<itemizedlist>
<listitem>
<para>
Firebird does not support auto-increment columns.
</para>
</listitem>
<listitem>
<para>
Firebird does not support the <literal>LOWER</literal>, <literal>SUBSTRING
</literal>, or <literal>INSTR</literal> SQL functions.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_informix">
<title>
Informix
</title>
<example id="example_props_informix">
<title>
Example properties for Informix Dynamic Server
</title>
<programlisting>
openjpa.ConnectionDriverName: com.informix.jdbc.IfxDriver
openjpa.ConnectionURL: \
jdbc:informix-sqli://SERVER_NAME:SERVER_PORT/DB_NAME:INFORMIXSERVER=SERVER_ID
</programlisting>
</example>
<section id="dbsupport_informix_issues">
<title>
Known issues with Informix
</title>
<itemizedlist>
<listitem>
<para>
None
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_intersystems_cache">
<title>
InterSystems Cache
</title>
<example id="example_props_intersystems_cache">
<title>
Example properties for InterSystems Cache
</title>
<programlisting>
openjpa.ConnectionDriverName: com.intersys.jdbc.CacheDriver
openjpa.ConnectionURL: jdbc:Cache://SERVER_NAME:SERVER_PORT/DB_NAME
</programlisting>
</example>
<section id="dbsupport_intersystems_cache_issues">
<title>
Known issues with InterSystems Cache
</title>
<itemizedlist>
<listitem>
<para>
Support for Cache is done via SQL access over JDBC, not through their object
database APIs.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_access">
<title>
Microsoft Access
</title>
<example id="example_props_access">
<title>
Example properties for Microsoft Access
</title>
<programlisting>
openjpa.ConnectionDriverName: com.ddtek.jdbc.sequelink.SequeLinkDriver
openjpa.ConnectionURL: jdbc:sequelink://SERVER_NAME:SERVER_PORT
</programlisting>
</example>
<section id="dbsupport_access_issues">
<title>
Known issues with Microsoft Access
</title>
<itemizedlist>
<listitem>
<para>
Using the Sun JDBC-ODBC bridge to connect is not supported.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_sqlserver">
<title>
Microsoft SQL Server
</title>
<example id="example_props_sqlserver">
<title>
Example properties for Microsoft SQLServer
</title>
<programlisting>
openjpa.ConnectionDriverName: com.microsoft.sqlserver.jdbc.SQLServerDriver
openjpa.ConnectionURL: \
jdbc:sqlserver://SERVER_NAME:1433;DatabaseName=DB_NAME;selectMethod=cursor;sendStringParametersAsUnicode=false
</programlisting>
</example>
<section id="dbsupport_sqlserver_issues">
<title>
Known issues with SQL Server
</title>
<itemizedlist>
<listitem>
<para>
SQL Server date fields are accurate only to the nearest 3 milliseconds,
possibly resulting in precision loss in stored dates.
</para>
</listitem>
<listitem>
<para>
The ConnectionURL must always contain the " <literal>selectMethod=cursor
</literal> " string.
</para>
</listitem>
<listitem>
<para>
Adding <literal>sendStringParametersAsUnicode=false</literal> to the
ConnectionURL may significantly increase performance.
</para>
</listitem>
<listitem>
<para>
The Microsoft SQL Server driver only emulates batch updates. The DataDirect JDBC
driver has true support for batch updates, and may result in a significant
performance gain.
</para>
</listitem>
<listitem>
<para>
Floats and doubles may lose precision when stored.
</para>
</listitem>
<listitem>
<para>
<literal>TEXT</literal> columns cannot be used in queries.
</para>
</listitem>
<listitem>
<para>
When using a SQL Server instance that has been configured to be case-sensitive
in schema names, you need to set the "schemaCase=preserve" parameter in the
<link linkend="openjpa.jdbc.DBDictionary">openjpa.jdbc.DBDictionary</link>
property.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_foxpro">
<title>
Microsoft FoxPro
</title>
<example id="example_props_foxpro">
<title>
Example properties for Microsoft FoxPro
</title>
<programlisting>
openjpa.ConnectionDriverName: com.ddtek.jdbc.sequelink.SequeLinkDriver
openjpa.ConnectionURL: jdbc:sequelink://SERVER_NAME:SERVER_PORT
</programlisting>
</example>
<section id="dbsupport_foxpro_issues">
<title>
Known issues with Microsoft FoxPro
</title>
<itemizedlist>
<listitem>
<para>
Using the Sun JDBC-ODBC bridge to connect is not supported.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_mysql">
<title>
MySQL
</title>
<example id="example_props_mysql">
<title>
Example properties for MySQL
</title>
<programlisting>
openjpa.ConnectionDriverName: com.mysql.jdbc.Driver
openjpa.ConnectionURL: jdbc:mysql://SERVER_NAME/DB_NAME
</programlisting>
</example>
<section id="dbsupport_mysql_issues">
<title>
Known issues with MySQL
</title>
<itemizedlist>
<listitem>
<para>
The default table types that MySQL uses do not support transactions, which will
prevent OpenJPA from being able to roll back transactions. Use the
<literal>InnoDB</literal> table type for any tables that OpenJPA will access.
</para>
</listitem>
<listitem>
<para>
MySQL does not support sub-selects in versions prior to 4.1, and are disabled by
default. Some operations (such as the <function>isEmpty()</function> method in a
query) will fail due to this. If you are using MySQL 4.1 or later, you can lift
this restriction by setting the <literal>SupportsSubselect=true</literal>
parameter of the <link linkend="openjpa.jdbc.DBDictionary">
openjpa.jdbc.DBDictionary</link> property.
</para>
</listitem>
<listitem>
<para>
Rollback due to database error or optimistic lock violation is not supported
unless the table type is one of the MySQL transactional types. Explicit calls to
<function>rollback()</function> before a transaction has been committed,
however, are always supported.
</para>
</listitem>
<listitem>
<para>
Floats and doubles may lose precision when stored in some datastores.
</para>
</listitem>
<listitem>
<para>
When storing a field of type <classname>java.math.BigDecimal</classname>, some
datastores will add extraneous trailing 0 characters, causing an equality
mismatch between the field that is stored and the field that is retrieved.
</para>
</listitem>
<listitem>
<para>
Some version of the MySQL JDBC driver have a bug that prevents OpenJPA from
being able to interrogate the database for foreign keys. Version 3.0.14 (or
higher) of the MySQL driver is required in order to get around this bug.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_oracle">
<title>
Oracle
</title>
<example id="example_props_oracle">
<title>
Example properties for Oracle
</title>
<programlisting>
openjpa.ConnectionDriverName: oracle.jdbc.driver.OracleDriver
openjpa.ConnectionURL: jdbc:oracle:thin:@SERVER_NAME:1521:DB_NAME
</programlisting>
</example>
<section id="dbsupport_oracle_query_hints">
<title>
Using Query Hints with Oracle
</title>
<para>
Oracle has support for "query hints", which are formatted comments embedded in
SQL that provide some hint for how the query should be executed. These hints are
usually designed to provide suggestions to the Oracle query optimizer for how to
efficiently perform a certainly query, and aren't typically needed for any but
the most intensive queries.
</para>
<example id="dbsupport_oracle_query_hints_ex">
<title>
Using Oracle Hints
</title>
<programlisting>
Query query = em.createQuery(...);
query.setHint("openjpa.hint.OracleSelectHint", "/*+ first_rows(100) */");
List results = query.getResultList();
</programlisting>
</example>
</section>
<section id="dbsupport_oracle_issues">
<title>
Known issues with Oracle
</title>
<itemizedlist>
<listitem>
<para>
The Oracle JDBC driver has significant differences between different versions.
It is important to use the officially supported version of the driver
(10.2.0.1.0), which is backward compatible with previous versions of the Oracle
server. It can be downloaded from
<ulink url="http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101040.html">
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101040.html</ulink>.
</para>
</listitem>
<listitem>
<para>
For VARCHAR fields, <literal>null</literal> and a blank string are equivalent.
This means that an object that stores a null string field will have it get read
back as a blank string.
</para>
</listitem>
<listitem>
<para>
Oracle corp's JDBC driver for Oracle has only limited support for batch updates.
The result for OpenJPA is that in some cases, the exact object that failed an
optimistic lock check cannot be determined, and OpenJPA will throw an
<classname>OptimisticVerificationException</classname> with more failed objects
than actually failed.
</para>
</listitem>
<listitem>
<para>
Oracle cannot store numbers with more than 38 digits in numeric columns.
</para>
</listitem>
<listitem>
<para>
Floats and doubles may lose precision when stored.
</para>
</listitem>
<listitem>
<para>
CLOB columns cannot be used in queries.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_pointbase">
<title>
Pointbase
</title>
<example id="example_props_pointbase">
<title>
Example properties for Pointbase
</title>
<programlisting>
openjpa.ConnectionDriverName: com.pointbase.jdbc.jdbcUniversalDriver
openjpa.ConnectionURL: \
jdbc:pointbase:DB_NAME,database.home=pointbasedb,create=true,cache.size=10000,database.pagesize=30720
</programlisting>
</example>
<section id="dbsupport_pointbase_issues">
<title>
Known issues with Pointbase
</title>
<itemizedlist>
<listitem>
<para>
Fields of type BLOB and CLOB are limited to 1M. Set the <literal>BlobTypeName
</literal> and/or <literal>ClobTypeName</literal> properties of the
<literal>openjpa.jdbc.DBDictionary</literal> setting to override.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_postgresql">
<title>
PostgreSQL
</title>
<example id="example_props_postgresql">
<title>
Example properties for PostgreSQL
</title>
<programlisting>
openjpa.ConnectionDriverName: org.postgresql.Driver
openjpa.ConnectionURL: jdbc:postgresql://SERVER_NAME:5432/DB_NAME
</programlisting>
</example>
<section id="dbsupport_postgresql_issues">
<title>
Known issues with PostgreSQL
</title>
<itemizedlist>
<listitem>
<para>
Floats and doubles may lose precision when stored.
</para>
</listitem>
<listitem>
<para>
PostgreSQL cannot store very low and very high dates.
</para>
</listitem>
<listitem>
<para>
Empty string/char values are stored as NULL.
</para>
</listitem>
</itemizedlist>
</section>
</section>
<section id="dbsupport_sybase">
<title>
Sybase Adaptive Server
</title>
<example id="example_props_sybase">
<title>
Example properties for Sybase
</title>
<programlisting>
openjpa.ConnectionDriverName: com.sybase.jdbc2.jdbc.SybDriver
openjpa.ConnectionURL: \
jdbc:sybase:Tds:SERVER_NAME:4100/DB_NAME?ServiceName=DB_NAME&amp;BE_AS_JDBC_COMPLIANT_AS_POSSIBLE=true
</programlisting>
</example>
<section id="dbsupport_sybase_issues">
<title>
Known issues with Sybase
</title>
<itemizedlist>
<listitem>
<para>
The "<literal>DYNAMIC_PREPARE</literal>" parameter of the Sybase JDBC driver
cannot be used with OpenJPA.
</para>
</listitem>
<listitem>
<para>
Datastore locking cannot be used when manipulating many-to-many relations using
the default OpenJPA schema created by the schematool, unless an auto-increment
primary key field is manually added to the table.
</para>
</listitem>
<listitem>
<para>
Persisting a zero-length string results in a string with a single space
characted being returned from Sybase, Inc.'s JDBC driver.
</para>
</listitem>
<listitem>
<para>
The <literal>BE_AS_JDBC_COMPLIANT_AS_POSSIBLE</literal> is required in order to
use datastore (pessimistic) locking. Failure to set this property may lead to
obscure errors like " <literal>FOR UPDATE can not be used in a SELECT which is
not part of the declaration of a cursor or which is not inside a stored
procedure.</literal> ".
</para>
</listitem>
</itemizedlist>
</section>
</section>
</appendix>