Replicating Oracle data to a Hazelcast "hot cache"
Striim provides a wizard for creating applications that read from Oracle and write to Hazelcast. See Creating an application using a wizard for details.
See Hazelcast Writer for information on the adapter properties.
To replicate Oracle data to Hazelcast:
Write a Java class defining the Plain Old Java Objects (POJOs) corresponding to the Oracle table(s) to be replicated (see http://stackoverflow.com/questions/3527264/how-to-create-a-pojo for more information on POJOs), compile the Java class to a .jar file, copy it to the
Striim/libdirectory of each Striim server that will run the HazelcastWriter target, and restart the server.Write an XML file defining the object-relational mapping to be used to map Oracle table columns to Hazelcast maps (the "ORM file") and save it in a location accessible to the Striim cluster. Data types are converted as specified in the ORM file. Supported Java types on the Hazelcast side are:
binary (byte[])
Character, char
Double, double
Float, float
int, Integer
java.util.Date
Long, long
Short, short
String
Odd mappings may throw invalid data errors, for example, when an Oracle VARCHAR2 column mapped to a long contains a value that is not a number. Oracle BLOB and CLOB types are not supported.
Write a Striim application using DatabaseReader and HazelcastWriter to perform the initial load from Oracle to Hazelcast .
Write a second Striim application using OracleReader and HazelcastWriter to perform continuous replication.
This example assumes the following Oracle table definition:
CREATE TABLE INV ( SKU INT PRIMARY KEY NOT NULL, STOCK NUMBER(*,4), NAME varchar2(20), LAST_UPDATED date );
The following Java class defines a POJO corresponding to the table:
package com.customer.vo;
import java.io.Serializable;
import java.util.Date;
public class ProductInvObject implements Serializable {
public long sku = 0;
public double stock = 0;
public String name = null;
public Date lastUpdated = null;
public ProductInvObject ( ) { }
@Override
public String toString() {
return "sku : " + sku + ", STOCK:" + stock + ", NAME:" + name + ", LAST_UPDATED:" + lastUpdated ;
}
}
The following ORM file maps the Oracle table columns to Hazelcast maps:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm" version="2.4">
<entity name="prodcInv" class="com.customer.vo.ProductInvObject" >
<table name="MYSCHEMA.INV"/>
<attributes>
<id name ="sku" attribute-type="long" >
<column nullable="false" name="SKU" />
</id>
<basic name="stock" attribute-type="double" >
<column nullable="false" name="STOCK" />
</basic>
<basic name="name" attribute-type="String" >
<column name="NAME" />
</basic>
<basic name="lastUpdated" attribute-type="java.util.Date" >
<column name="LAST_UPDATED" />
</basic>
</attributes>
</entity>
</entity-mappings>
Assuming that the ORM file has been saved to Striim/Samples/Ora2HCast/invObject_orm.xml, the following Striim application will perform the initial load:
CREATE APPLICATION InitialLoadOra2HC; CREATE SOURCE OracleJDBCSource USING DatabaseReader ( Username:'striim', Password:'passwd', ConnectionURL:'203.0.113.49:1521:orcl', Tables:'MYSCHEMA.INV' ) OUTPUT TO DataStream; CREATE TARGET HazelOut USING HazelcastWriter ( ConnectionURL: '203.0.1113.50:5702', ormFile:"Samples/Ora2HCast/invObject_orm.xml", mode: "initialLoad", maps: 'MYSCHEMA.INV,invCache' ) INPUT FROM DataStream; END APPLICATION InitialLoadOra2HC;
Once InitialLoadOra2HC has copied all the data, the following application will perform continuous replication of new data:
CREATE APPLICATION ReplicateOra2HC; CREATE SOURCE OracleCDCSource USING OracleReader ( Username:'striim', Password:'passwd', ConnectionURL:'203.0.113.49:1521:orcl', Tables:'MYSCHEMA.INVmyschema.ATM' ) OUTPUT TO DataStream; CREATE TARGET HazelOut USING HazelcastWriter ( ConnectionURL: '203.0.1113.50:5702', ormFile:"Samples/Ora2HCast/invObject_orm.xml", mode: "incremental", maps: 'MYSCHEMA.INV,invCache' ) INPUT FROM DataStream ; END APPLICATION ReplicateOra2HCInitialLoadOra2HC;
Note
If the Hazelcast cluster goes down, the data in the map will be lost. To restore it, stop the replication application, do the initial load again, then restart replication.