| Apache Ignite Schema Import Module |
| ------------------------------------------ |
| |
| Ignite ships with its own database schema mapping wizard which provides automatic support for integrating with |
| persistence stores. This utility automatically connects to the underlying database and generates all the required |
| XML OR-mapping configuration and Java domain model POJOs. |
| |
| To start the wizard for generating database schema mapping, execute bin/ignite-schema-import.sh script: |
| |
| For connection with RDBMS system from utility you need to provide: connection url and jdbc driver. |
| Note that JDBC drivers are not supplied with the utility and should be provided separately. |
| |
| Moving from disk-based architectures to in-memory architectures |
| ------------------------------------------ |
| |
| Use Schema Import Utility for generation of type mapping and domain model in Java. |
| |
| For example you may use the following script for create sample type 'Person' in your RDBMS system: |
| |
| create table PERSON(id integer not null PRIMARY KEY, first_name varchar(50), last_name varchar(50), salary double); |
| |
| insert into PERSON(id, first_name, first_name, salary) values(1, 'Johannes', 'Kepler', 1000); |
| insert into PERSON(id, first_name, first_name, salary) values(2, 'Galileo', 'Galilei', 1200); |
| insert into PERSON(id, first_name, first_name, salary) values(3, 'Henry', 'More', 1150); |
| insert into PERSON(id, first_name, first_name, salary) values(4, 'Polish', 'Brethren', 2000); |
| insert into PERSON(id, first_name, first_name, salary) values(5, 'Robert', 'Boyle', 2500); |
| insert into PERSON(id, first_name, first_name, salary) values(6, 'Isaac', 'Newton', 1300); |
| |
| The Ignite Schema Import utility generates the following artifacts: |
| # Java POJO key and value classes (enter "org.apache.ignite.schema" package name before generation). |
| # XML CacheTypeMetadata configuration. |
| # Java configuration snippet (alternative to XML). |
| |
| After you exit from the wizard, you should: |
| # Copy generated POJO java classes to you project source folder. |
| # Copy XML declaration of CacheTypeMetadata to your Ignite XML configuration file under appropriate |
| CacheConfiguration root. |
| # Setup your Ignite XML configuration file DataSource to your RDBMS system for CacheJdbcPojoStore. |
| # Or paste Java snippet with cache configuration into your Ignite initialization logic. |
| # You need place compiled domain model classes, jdbc driver (used for connect to you RDBMS system) in Ignite node |
| classpath, for example place in 'libs' folder. |
| |
| Example of spring configuration: |
| |
| <!-- Sample data source. --> |
| <bean id="myDataSource" class="org.h2.jdbcx.JdbcDataSource"/> |
| |
| <bean class="org.apache.ignite.configuration.IgniteConfiguration"> |
| ... |
| <!-- Cache configuration. --> |
| <property name="cacheConfiguration"> |
| <list> |
| <bean class="org.apache.ignite.configuration.CacheConfiguration"> |
| ... |
| |
| <!-- Cache store. --> |
| <property name="cacheStoreFactory"> |
| <bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory"> |
| <property name="dataSourceBean" value="myDataSource"/> |
| <bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStore"> |
| <property name="dataSourceBean" value="myDataSource" /> |
| <property name="types"> |
| <list> |
| <bean class="org.apache.ignite.cache.store.jdbc.JdbcType"> |
| <property name="cacheName" value="myCache" /> |
| <property name="databaseSchema" value="MY_DB_SCHEMA" /> |
| <property name="databaseTable" value="PERSON" /> |
| <property name="keyType" value="java.lang.Integer" /> |
| <property name="keyFields"> |
| <list> |
| <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> |
| <property name="databaseFieldType" > |
| <util:constant static-field="java.sql.Types.INTEGER"/> |
| </property> |
| <property name="databaseFieldName" value="ID" /> |
| <property name="javaFieldType" value="java.lang.Integer" /> |
| <property name="javaFieldName" value="id" /> |
| </bean> |
| </list> |
| </property> |
| <property name="valueType" value="my.company.Person" /> |
| <property name="valueFields"> |
| <list> |
| <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> |
| <property name="databaseFieldType" > |
| <util:constant static-field="java.sql.Types.VARCHAR"/> |
| </property> |
| <property name="databaseFieldName" value="first_name" /> |
| <property name="javaFieldType" value="java.lang.String" /> |
| <property name="javaFieldName" value="firstName" /> |
| </bean> |
| <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> |
| <property name="databaseFieldType" > |
| <util:constant static-field="java.sql.Types.VARCHAR"/> |
| </property> |
| <property name="databaseFieldName" value="last_name" /> |
| <property name="javaFieldType" value="java.lang.String" /> |
| <property name="javaFieldName" value="lastName" /> |
| </bean> |
| <bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField"> |
| <property name="databaseFieldType" > |
| <util:constant static-field="java.sql.Types.DOUBLE"/> |
| </property> |
| <property name="databaseFieldName" value="salary" /> |
| <property name="javaFieldType" value="java.lang.Double" /> |
| <property name="javaFieldName" value="salary" /> |
| </bean> |
| </list> |
| </property> |
| </bean> |
| </list> |
| </property> |
| </bean> |
| </bean> |
| </property> |
| ... |
| </bean> |
| </list> |
| </property> |
| ... |
| </bean> |
| |
| Example of java code configuration: |
| |
| IgniteConfiguration cfg = new IgniteConfiguration(); |
| ... |
| CacheConfiguration ccfg = new CacheConfiguration<>(); |
| |
| // Create store factory. |
| CacheJdbcPojoStoreFactory storeFactory = new CacheJdbcPojoStoreFactory(); |
| storeFactory.setDataSourceBean("myDataSource"); |
| |
| // Configure cache types. |
| Collection<JdbcType> jdbcTypes = new ArrayList<>(); |
| |
| // PERSON type mapping. |
| JdbcType jdbcType = new JdbcType(); |
| |
| jdbcType.setCacheName(CACHE_NAME); |
| |
| jdbcType.setDatabaseSchema("MY_DB_SCHEMA"); |
| jdbcType.setDatabaseTable("PERSON"); |
| |
| jdbcType.setKeyType("java.lang.Integer"); |
| jdbcType.setValueType("my.company.Person"); |
| |
| // Key fields for PERSONS. |
| jdbcType.setKeyFields(F.asArray(new JdbcType(Types.INTEGER, "ID", Integer.class, "id"))); |
| |
| // Value fields for PERSONS. |
| jdbcType.setValueFields(F.asArray( |
| new JdbcType(Types.INTEGER, "ID", int.class, "id"), |
| new JdbcType(Types.VARCHAR, "first_name", String.class, "firstName"), |
| new JdbcType(Types.VARCHAR, "last_name", String.class, "lastName"), |
| new JdbcType(Types.DOUBLE, "salary", Double.class, "salary") |
| )); |
| |
| storeFactory.setTypes(jdbcTypes.toArray(new JdbcType[])); |
| |
| // Configure cache to use store. |
| ccfg.setReadThrough(true); |
| ccfg.setWriteThrough(true); |
| ccfg.setCacheStoreFactory(storeFactory); |
| |
| cfg.setCacheConfiguration(ccfg); |
| |
| ... |
| |
| // Start Ignite node. |
| Ignition.start(cfg); |
| |
| Now you can load all data from database to cache: |
| IgniteCache<Long, Person> cache = ignite.jcache(CACHE_NAME); |
| cache.loadCache(null); |
| |
| Or you can load data from database to cache with custom SQL: |
| cache.loadCache(null, "java.lang.Long", "select * from PERSON where id = 2") |
| |
| Also if you put data into cache it will be inserted / updated in underlying database. |
| |
| |
| Performance optimization. |
| ------------------------------------------ |
| |
| 1. Use DataSource with connection pool. |
| 2. Enable write-behind feature by default write-behind is disabled. |
| Note, write-behind should not be used with TRANSACTIONAL caches. |
| |
| Example of spring configuration: |
| |
| <bean class="org.apache.ignite.configuration.IgniteConfiguration"> |
| ... |
| <!-- Cache configuration. --> |
| <property name="cacheConfiguration"> |
| <list> |
| <bean class="org.apache.ignite.configuration.CacheConfiguration"> |
| ... |
| <!-- Sets flag indicating whether write-behind is enabled.. --> |
| <property name="writeBehindEnabled" value="true/> |
| ... |
| </bean> |
| </list> |
| </property> |
| ... |
| </bean> |
| |
| Example of java code configuration: |
| |
| IgniteConfiguration cfg = new IgniteConfiguration(); |
| ... |
| CacheConfiguration ccfg = new CacheConfiguration<>(); |
| ... |
| ccfg.setWriteBehindEnabled(true); |
| ... |
| // Start Ignite node. |
| Ignition.start(cfg); |