<!--
▄▄▄       ██▓███   ▄▄▄       ▄████▄   ██░ ██ ▓█████     ██▓  ▄████  ███▄    █  ██▓▄▄▄█████▓▓█████
▒████▄    ▓██░  ██▒▒████▄    ▒██▀ ▀█  ▓██░ ██▒▓█   ▀    ▓██▒ ██▒ ▀█▒ ██ ▀█   █ ▓██▒▓  ██▒ ▓▒▓█   ▀
▒██  ▀█▄  ▓██░ ██▓▒▒██  ▀█▄  ▒▓█    ▄ ▒██▀▀██░▒███      ▒██▒▒██░▄▄▄░▓██  ▀█ ██▒▒██▒▒ ▓██░ ▒░▒███
░██▄▄▄▄██ ▒██▄█▓▒ ▒░██▄▄▄▄██ ▒▓▓▄ ▄██▒░▓█ ░██ ▒▓█  ▄    ░██░░▓█  ██▓▓██▒  ▐▌██▒░██░░ ▓██▓ ░ ▒▓█  ▄
▓█   ▓██▒▒██▒ ░  ░ ▓█   ▓██▒▒ ▓███▀ ░░▓█▒░██▓░▒████▒   ░██░░▒▓███▀▒▒██░   ▓██░░██░  ▒██▒ ░ ░▒████▒
▒▒   ▓▒█░▒▓▒░ ░  ░ ▒▒   ▓▒█░░ ░▒ ▒  ░ ▒ ░░▒░▒░░ ▒░ ░   ░▓   ░▒   ▒ ░ ▒░   ▒ ▒ ░▓    ▒ ░░   ░░ ▒░ ░
 ▒   ▒▒ ░░▒ ░       ▒   ▒▒ ░  ░  ▒    ▒ ░▒░ ░ ░ ░  ░    ▒ ░  ░   ░ ░ ░░   ░ ▒░ ▒ ░    ░     ░ ░  ░
 ░   ▒   ░░         ░   ▒   ░         ░  ░░ ░   ░       ▒ ░░ ░   ░    ░   ░ ░  ▒ ░  ░         ░
     ░  ░               ░  ░░ ░       ░  ░  ░   ░  ░    ░        ░          ░  ░              ░  ░
-->

<!--
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
"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.
-->

<!DOCTYPE html>
<html lang="en">
<head>

<link rel="canonical" href="https://ignite.apache.org/features/rdbmsintegration.html" />
    <!--#include virtual="/includes/scriptshead.html" -->
<meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>Automatic RDBMS Integration - Apache Ignite</title>
    <!--#include virtual="/includes/styles.html" -->

    
</head>
<body>
<!--#include virtual="/includes/header.html" -->
<article>
    <header>
        <div class="container">
            <h1>Automatically Integrate <strong>with RDBMSs</strong></h1>
        </div>
    </header>
    <div class="container">
        
        <p>
            Apache Ignite® provides support for integrating with a variety of persistence stores.
            It allows you to connect to the database, import schemas, configure indexed types, and automatically generate all the
            required XML OR-mapping configuration and Java domain model POJOs that you can easily download and copy into your project.
        </p>
        <a href="/images/domain-model.png"><img class="img-responsive diagram-right" src="/images/domain-model.png" alt="Automatically Integrate with RDBMSs" /></a>
        <p>Ignite can integrate with any relational database (RDBMS) that supports a JDBC driver - Oracle, PostgreSQL, Microsoft SQL Server, and MySQL.</p>
                    
        <h2>RDBMS Integration Wizard</h2>
        <p>Ignite supports automatic RDBMS integration via <a href="https://console.gridgain.com" target="_blank" rel="noopener">Ignite Web Console</a>
            which is an interactive configuration wizard, management and monitoring tool that allows you to:</p>
            <ul class="page-list">
                <li>Create and download various configurations for your Ignite cluster.</li>
                <li>Automatically construct Ignite's SQL metadata from any RDBMS schemas.</li>
                <li>Execute SQL queries over your in-memory caches.</li>
                <li>View query execution plans, in-memory schemas and streaming charts.</li>
            </ul>
                
        <p>Ignite Web Console is an innovative tool that offers plenty of rich functionalities to manage the Ignite cluster and is not limited to features mentioned above.</p>
                    
        <h3>Example</h3>
        <p>Here is an example of automatically generated Person class, as well as Java and XML configurations, imported from a MySQL PERSON table via Ignite Web Console.</p>
        <!-- Nav tabs -->
        <ul id="web-console-example" class="nav nav-tabs">
            <li ><a class="active" href="#example-person" aria-controls="home" data-toggle="tab">Person</a></li>
            <li><a href="#example-xml" aria-controls="profile" data-toggle="tab">XML</a></li>
            <li><a href="#example-java" aria-controls="profile" data-toggle="tab">Java</a></li>
        </ul>

                <!-- Tab panes -->
        <div class="tab-content">
            <div class="tab-pane" id="example-xml">
                <pre class="line-numbers"><code class="language-xml">
                    &lt;bean class="org.apache.ignite.configuration.IgniteConfiguration"&gt;
                        ...
                        &lt;property name="cacheStoreFactory"&gt;
                            &lt;bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory"&gt;
                                &lt;property name="dataSourceBean" value="dsMySQL"/&gt;
                                &lt;property name="dialect"&gt;
                                    &lt;bean class="org.apache.ignite.cache.store.jdbc.dialect.MySQLDialect"/&gt;
                                &lt;/property&gt;
                                &lt;property name="types"&gt;
                                    &lt;list&gt;
                                        &lt;bean class="org.apache.ignite.cache.store.jdbc.JdbcType"&gt;
                                            &lt;property name="cacheName" value="PersonCache"/&gt;
                                            &lt;property name="keyType" value="java.lang.Integer"/&gt;
                                            &lt;property name="valueType" value="com.apache.ignite.myexample.model.Person"/&gt;
                                            &lt;property name="databaseSchema" value="test"/&gt;
                                            &lt;property name="databaseTable" value="person"/&gt;

                                            &lt;property name="keyFields"&gt;
                                                &lt;list&gt;
                                                    ...
                                                &lt;/list&gt;
                                            &lt;/property&gt;

                                            &lt;property name="valueFields"&gt;
                                                &lt;list&gt;
                                                    ...
                                                &lt;/list&gt;
                                            &lt;/property&gt;
                                        &lt;/bean&gt;
                                    &lt;/list&gt;
                                &lt;/property&gt;
                            &lt;/bean&gt;
                        &lt;/property&gt;
                        ...
                    &lt;/bean&gt;
                </code></pre>
            </div>
            <div class="tab-pane" id="example-java">
                <pre class="line-numbers"><code class="language-java">
                /**
                    * This configuration was generated by GridGain Web Console (10/26/2016 11:12)
                    */
                public class ClientConfigurationFactory {
                    private static final Properties props = new Properties();

                    static {
                        try (InputStream in = IgniteConfiguration.class.getClassLoader().getResourceAsStream("secret.properties")) {
                            props.load(in);
                        }
                        catch (Exception ignored) {
                            // No-op.
                        }
                    }

                    /** Helper class for datasource creation. */
                    public static class DataSources {
                        public static final MysqlDataSource INSTANCE_dsMySQL = createdsMySQL();

                        private static MysqlDataSource createdsMySQL() {
                            MysqlDataSource dataSource = new MysqlDataSource();

                            dataSource.setURL(props.getProperty("dsMySQL.jdbc.url"));
                            dataSource.setUser(props.getProperty("dsMySQL.jdbc.username"));
                            dataSource.setPassword(props.getProperty("dsMySQL.jdbc.password"));

                            return dataSource;
                        }
                    }
                    ...
                }
                </code></pre>
            </div>
            <div class="tab-pane  active" id="example-person">
                <pre class="line-numbers"><code class="language-java">
                    /**
                        * Person definition.
                        *
                        * This POJO was generated by GridGain Web Console (10/26/2016 11:12)
                        */
                    public class Person implements Serializable {
                        /** */
                        private static final long serialVersionUID = 0L;

                        /** Value for id. */
                        private int id;

                        /** Value for orgid. */
                        private Integer orgid;

                        /** Value for name. */
                        private String name;

                        /** Value for salary. */
                        private Integer salary;

                        ...
                    }
                </code></pre>
            </div>
        </div>
            
        
        <h2>Hosted Management</h2>
        <p>Visit our <a href="/addons.html" target="_blank" rel="noopener">Manage</a> page to learn more about the projects that intend to make user experience with Ignite easier.</p>
            <p>
                <a href="https://apacheignite-tools.readme.io/docs" target="_blank" rel="noopener">
                    <b>Get started with Ignite Web Console <i class="fas fa-angle-double-right"></i></b>
                </a>
            </p>
    </div>
</article>
<!--#include virtual="/includes/footer.html" -->
<!--#include virtual="/includes/scripts.html" -->
</body>
</html>
