///////////////////////////////////////////////////////////////
 * 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.
///////////////////////////////////////////////////////////////

[[extension-es-sql, SQL EntityStore]]
= SQL EntityStore =

[devstatus]
--------------
source=extensions/entitystore-sql/dev-status.xml
--------------

EntityStore service backed by a SQL database.

This extension fully leverage the <<library-sql>> meaning that you must use it to assemble your DataSource and that you
get <<library-circuitbreaker,Circuit Breaker>> and <<library-jmx, JMX>> integration for free.

TIP: See the <<sample-sql-support>> that demonstrate combined use of <<library-sql>>, <<extension-es-sql>> and
<<extension-indexing-sql>>.

The following SQL databases are supported:

- http://www.postgresql.org/[PostgreSQL]
- http://www.mysql.com/[MySQL] and http://mariadb.org/[MariaDB]
- http://www.sqlite.org/[SQLite]
- http://www.h2database.com/[H2 Database Engine]
- http://db.apache.org/derby/[Apache Derby] and http://www.oracle.com/technetwork/java/javadb/overview/index.htm[Oracle JavaDB]

Each entity state is stored as a single row so maximum number of entities is the maximum number of rows per table
supported by the underlying SQL database.

Implementations per database Vendor share a generic codebase but can override about everything SQL. As a consequence
they can have strong differences in terms of performance if they use vendor specific extensions.

include::../../build/docs/buildinfo/artifact.txt[]

== Configuration ==

SQL EntityStore Configuration is optional and provides only one configuration property: `schemaName` defaulted to
'zest_es'. On SQL databases that don't support schemas this configuration property is simply ignored.

The assembly snippets below show the DataSource assembly alongside the SQL EntityStore assembly. Remember to configure
the DataSource properly, see <<library-sql>> and <<howto-configure-service>>.


== PostgreSQL ==

Maximum number of entities is unlimited.

Assembly is done using the provided Assembler:

[snippet,java]
----
source=extensions/entitystore-sql/src/test/java/org/apache/zest/entitystore/sql/PostgreSQLEntityStoreTest.java
tag=assembly
----

Sample DataSource configuration defaults:

[source,java]
----
include::../test/resources/postgresql-datasource.properties[]
----


== MySQL and MariaDB ==

Maximum number of entities depends on the choosen storage engine.

Assembly is done using the provided Assembler:

[snippet,java]
----
source=extensions/entitystore-sql/src/test/java/org/apache/zest/entitystore/sql/MySQLEntityStoreTest.java
tag=assembly
----

Sample DataSource configuration defaults:

[source,java]
----
include::../test/resources/mysql-datasource.properties[]
----


== SQLite ==

Maximum number of entities is unlimited.

The http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC[Xerial SQLite JDBC] driver is recommended.
It provides native support on Linux, Windows and MaxOSX, pure Java on other OSes.

Assembly is done using the provided Assembler:

[snippet,java]
----
source=extensions/entitystore-sql/src/test/java/org/apache/zest/entitystore/sql/SQLiteEntityStoreTest.java
tag=assembly
----

Sample DataSource configuration defaults:

[source,java]
----
include::../test/resources/sqlite-datasource.properties[]
----


== H2 Database Engine ==

Maximum number of entities is 2^64.

Assembly is done using the provided Assembler:

[snippet,java]
----
source=extensions/entitystore-sql/src/test/java/org/apache/zest/entitystore/sql/H2SQLEntityStoreTest.java
tag=assembly
----

Sample DataSource configuration defaults:

[source,java]
----
include::../test/resources/h2-datasource.properties[]
----



== Apache Derby and Oracle JavaDB ==

Maximum number of entities is unlimited.

Assembly is done using the provided Assembler:

[snippet,java]
----
source=extensions/entitystore-sql/src/test/java/org/apache/zest/entitystore/sql/DerbySQLEntityStoreTest.java
tag=assembly
----

Sample DataSource configuration defaults:

[source,java]
----
include::../test/resources/derby-datasource.properties[]
----

