Hi Ricky,

I see no property *writeBehindEnabled=true* in your config.

On Tue, Apr 25, 2017 at 10:02 AM, Ricky Nauvaldy Ruliputra <
[email protected]> wrote:

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



-- 
Best regards,
Andrey V. Mashenkov

Reply via email to