I've tried it again but the write behind still doesn't work. Like I said
before, if I only use write through, I'm able to write the data to my
database, but when I enable write behind, it just won't write even if I wait
until 5 seconds (writeBehindFlushFrequency default value). I've read the
documentation but couldn't figure it out what's wrong. Would you mind to
take a look to my program and see what's wrong in it? I'm afraid that I did
something wrong in my configuration. 

My table looks like this, in learnignite database, with the table name of
transaction. 
+------------+------------+ 
| idNumber  | amount    | 
+------------+------------+ 
|             1 |    300      | 
|             2 |    100      | 
|             3 |    100      | 
+------------+------------+ 

Config file: ignite-jdbc.xml

<beans xmlns="http://www.springframework.org/schema/beans";
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
       xmlns:util="http://www.springframework.org/schema/util";
       xsi:schemaLocation=" 
        http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd";>
    <description>Main Spring file for ignite configuration.</description>

    <bean
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
id="dataSource">
            <property name="driverClassName"
value="com.mysql.jdbc.Driver"></property>
            <property name="url"
value="jdbc:mysql://localhost:3306/learnignite"></property>
            <property name="username" value="root"></property>
            <property name="password" value=""></property>
        </bean>
        <bean class="org.apache.ignite.configuration.IgniteConfiguration"
id="ignite.cfg">
            <property name="cacheConfiguration">
                <list>
                    <bean
class="org.apache.ignite.configuration.CacheConfiguration">
                        <property name="name"
value="transactionCache"></property>
                                        
                        
                        <property name="readThrough"
value="true"></property>
                        <property name="writeThrough"
value="true"></property>


                        
                        <property name="queryEntities">
                            <list>
                                <bean
class="org.apache.ignite.cache.QueryEntity">
                                    <property name="keyType"
value="java.lang.Long"></property>
                                    <property name="valueType"
value="ignite.myexamples.model.Store"></property>
                                    <property name="fields">
                                        <map>
                                                                               
<entry key="idNumber" value="java.lang.Integer"></entry>
                                            <entry key="amount"
value="java.lang.Integer"></entry>
                                        </map>
                                    </property>
                                </bean>
                            </list>
                        </property>
                        
                        
                        <property name="cacheStoreFactory">
                            <bean
class="javax.cache.configuration.FactoryBuilder" factory-method="factoryOf">
                                <constructor-arg
value="myexamples.store.TransactionStore"></constructor-arg>
                            </bean>
                        </property>
                    </bean>
                </list>
            </property>
            
            <property name="discoverySpi">
                    <bean
class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                      <property name="ipFinder">
                        <bean
class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
                          <property name="multicastGroup"
value="228.10.10.157"/>
                            
                          
                          <property name="addresses">
                            <list>
                              <value>localhost/127.0.0.1:3306</value>
                            </list>
                          </property>
                        </bean>
                      </property>
                    </bean>
                  </property>
    </bean>
</beans>

Model file: Store.java

package ignite.myexamples.model; 
public class Store { 
        private int idNumber; 
        private int amount; 
        public void update(double deposit) { 
        amount += deposit; 
    } 
        public Store(int idNumber, int amount) { 
                super(); 
                this.idNumber = idNumber; 
                this.amount = amount; 
        } 
        public long getIdNumber() { 
                return idNumber; 
        } 
        public void setIdNumber(int idNumber) { 
                this.idNumber = idNumber; 
        } 
        public long getAmount() { 
                return amount; 
        } 
        public void setAmount(int amount) { 
                this.amount = amount; 
        } 
        @Override 
        public String toString() { 
                return "Transaction [idNumber=" + idNumber + ", amount=" +
amount + "]"; 
        } 
} 

TransactionStore.java

package myexamples.store; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.Collection; 
import java.util.Map; 

import javax.cache.Cache.Entry; 
import javax.cache.integration.CacheLoaderException; 
import javax.cache.integration.CacheWriterException; 
import javax.sql.DataSource; 

import org.apache.ignite.cache.store.CacheStore; 
import org.apache.ignite.lang.IgniteBiInClosure; 
import org.apache.ignite.resources.SpringResource; 
import org.jetbrains.annotations.Nullable; 

import ignite.myexamples.model.Store; 

public class TransactionStore implements CacheStore<Long, Store> { 
        @SpringResource(resourceName = "dataSource") 
        private DataSource dataSource; 
        // This method is called whenever IgniteCache.loadCache() method is
called. 
        @Override 
        public void loadCache(IgniteBiInClosure<Long, Store> clo, @Nullable
Object... objects) throws CacheLoaderException { 
                System.out.println(">> Loading cache from store..."); 
                try (Connection conn = dataSource.getConnection()) { 
                        try (PreparedStatement st =
conn.prepareStatement("select * from TRANSACTION")) { // dari tabel mysql 
                                try (ResultSet rs = st.executeQuery()) { 
                                        while (rs.next()) { 
                                                Store transaksi = new
Store(rs.getInt(1), rs.getInt(2)); 
                                               
clo.apply(transaksi.getIdNumber(), transaksi); 
                                        } 
                                } 
                        } 
                } 
                catch (SQLException e) { 
                        throw new CacheLoaderException("Failed to load
values from cache store.", e); 
                } 
        } 
        // This method is called whenever IgniteCache.get() method is
called. 
        @Override 
        public Store load(Long key) throws CacheLoaderException { 
                System.out.println("Loading Transaction from Store ..."); 
                try (Connection conn = dataSource.getConnection()) { 
                        try (PreparedStatement st =
conn.prepareStatement("select * from TRANSACTION where id = ?")) { 
                                st.setString(1, key.toString()); 
                                ResultSet rs = st.executeQuery(); 
                                return rs.next() ? new Store(rs.getInt(1),
rs.getInt(2)) : null; 
                        } 
                } 
                catch (SQLException e) { 
                        throw new CacheLoaderException("Failed to load
values from cache store.", e); 
                } 
        } 
        @Override 
        public Map<Long, Store> loadAll(Iterable<? extends Long> arg0)
throws CacheLoaderException { 
                // TODO Auto-generated method stub 
                return null; 
        } 
        @Override 
        public void delete(Object arg0) throws CacheWriterException { 
                // TODO Auto-generated method stub 

        } 
        @Override 
        public void deleteAll(Collection<?> arg0) throws
CacheWriterException { 
                // TODO Auto-generated method stub 

        } 
        @Override 
        public void write(Entry<? extends Long, ? extends Store> arg0)
throws CacheWriterException { 
                // TODO Auto-generated method stub 
                Long key = arg0.getKey(); 
                Store val = arg0.getValue(); 

                System.out.println(">>> Store write "); 
                System.out.println("[key=" + key + ", val=" + val + ']'); 

                try { 
                        Connection conn = dataSource.getConnection(); 
                        int updated; 
                        // Try update first. If it does not work, then try
insert. 
                        // Some databases would allow these to be done in
one 'upsert' operation. 
                        try (PreparedStatement st = conn.prepareStatement( 
                                        "update TRANSACTION set amount = ?
where idNumber = ?")) { 
                                st.setLong(1, val.getAmount()); 
                                st.setLong(2, val.getIdNumber()); 

                                updated = st.executeUpdate(); 
                                System.out.println("update success"); 
                        } 
                        if (updated == 0) { 
                                try (PreparedStatement st =
conn.prepareStatement( 
                                                "insert into TRANSACTION
(id, amount) values (?, ?)")) { 
                                        st.setLong(1, val.getIdNumber()); 
                                        st.setLong(2, val.getAmount()); 
                                        st.executeUpdate(); 
                                        System.out.println("insertion
success"); 
                                } 
                        } 

                } 
                catch (SQLException e) { 
                        throw new CacheWriterException("Failed to write
object [key=" + key + ", val=" + val + ']', e); 
                } 
        } 
        @Override 
        public void writeAll(Collection<Entry&lt;? extends Long, ? extends
Store>> arg0) throws CacheWriterException { 
                // TODO Auto-generated method stub 

        } 
        @Override 
        public void sessionEnd(boolean commit) throws CacheWriterException { 
                // TODO Auto-generated method stub 

        } 

} 

Server node: TransactionServer.java
package myexamples.store; 
import java.util.List; 
import org.apache.ignite.Ignite; 
import org.apache.ignite.IgniteCache; 
import org.apache.ignite.IgniteException; 
import org.apache.ignite.Ignition; 
import org.apache.ignite.cache.query.QueryCursor; 
import org.apache.ignite.cache.query.SqlFieldsQuery; 
import ignite.myexamples.model.Store; 

public class TransactionServer { 
        public static void main(String[] args) throws IgniteException { 
                // Start Ignite node. 
                Ignite ignite =
Ignition.start("path/to/my/ignite-jdbc.xml"); 
                IgniteCache<Long, Store> cache =
ignite.getOrCreateCache("transactionCache"); 
                // Load cache with data from the database. 
                cache.loadCache(null); 
                // Execute query on cache. 
                QueryCursor<List&lt;?>> cursor = cache.query(new
SqlFieldsQuery( 
                                "select idNumber, amount from Store")); 
                System.out.println(cursor.getAll()); 
        } 

} 

Client node: TransactionStoreExample.java
package myexamples.store; 

import static
org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; 
import static
org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ; 

import org.apache.ignite.Ignite; 
import org.apache.ignite.IgniteCache; 
import org.apache.ignite.IgniteException; 
import org.apache.ignite.Ignition; 
import org.apache.ignite.transactions.Transaction; 

import ignite.myexamples.model.Store; 

public class TransactionStoreExample { 
        public static void main(String[] args) throws IgniteException { 
                // In this case, I just try the number 1 and add it with the
amount of 100 
                long id = 1; 
                long amount = 100; 
                
                // Set it as a client 
                Ignition.setClientMode(true); 

                // Start Ignite node. 
                try (Ignite ignite =
Ignition.start("path/to/my/ignite-jdbc.xml")) { 
                        try (IgniteCache<Long, Store> igniteCache =
ignite.getOrCreateCache("transactionCache")) { 
                                try (Transaction tx =
ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) { 
                                        Store account =
igniteCache.get((long) id); 
                                        assert account != null; 

                                        // update amount 
                                        account.update(amount); 

                                        // Store updated account in cache. 
                                        igniteCache.put(id, account); 

                                        tx.commit(); 
                                       
System.out.println(igniteCache.get(id)); 
                                } 
                        } 
                } 
        }       
} 

Thanks for any help that you can provide. 
-- Ricky



--
View this message in context: 
http://apache-ignite-users.70518.x6.nabble.com/How-to-do-write-behind-caching-tp12138p12216.html
Sent from the Apache Ignite Users mailing list archive at Nabble.com.

Reply via email to