![]() ![]() |
PunxsutawneyPhil3 |
![]() |
I am working with Postgres as an external persistent store Ignite and want to
know the best way to define caches for objects who’s data is spread over multiple tables. E.G. for to work with this Person and Car class and their tables below, I have provided my own Implementation of the CacheStore. This approach seems to be very verbose however as I need to manually assign the field values myself. Are there any other methods I should be using to do this? public class PersonMO{ private int id; private String name; private String address; private Set<Car> cars public PersonMO() {}; public PersonMO(int id, String name, String address) { this.id = id; this.name = name; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String toString() { return "ID: "+id +", Name: "+name+" AD: " +address; } public void setCars(Set<Car> cars) { this.cars = cars; } public Set<Car> getCars() { return cars; } } public class Car { int id; private String name; public Car(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class PersonMOCacheStore implements CacheStore<Integer, PersonMO>{ @SpringResource(resourceName = "pgDataSource") private DriverManagerDataSource pgDataSource; @LoggerResource private IgniteLogger log; //public void loadCache(IgniteBiInClosure<Integer, PersonMO> clo, @Nullable Object... args) @Override public void loadCache(IgniteBiInClosure<Integer, PersonMO> clo, Object... args) throws CacheLoaderException { log.info(">> Loading cache from store..."); try(Connection conn = pgDataSource.getConnection()){ try(PreparedStatement st = conn.prepareStatement("select * from PERSON")){ try(ResultSet rs = st.executeQuery()){ while(rs.next()) { PersonMO person = new PersonMO(rs.getInt(1),rs.getString(2), rs.getString(3)); person.setCars(getCarSet(conn, person.getId() ) ); clo.apply(person.getId(), person); } log.info(">> Finished Loading cache from store..."); } } }catch(SQLException e) { throw new CacheLoaderException("Failed to load values from cache store.",e); } } //implementation for IgniteCache.get @Override public PersonMO load(Integer key) throws CacheLoaderException { log.info(">> Loading person from store..."); try (Connection conn = pgDataSource.getConnection()) { try(PreparedStatement st = conn.prepareStatement("select * from PERSON where id = ?")){ st.setString(1, key.toString()); ResultSet rs = st.executeQuery(); if(rs.next()) { PersonMO p= new PersonMO(rs.getInt(1),rs.getString(2), rs.getString(3)); //p.setCars( getCarSet(conn, p.getId() ) ); return p; }else { return null; } } }catch(SQLException e) { throw new CacheLoaderException("Failed to load values from cache store.",e); } } private Set<Car> getCarSet(Connection conn, int personId) throws SQLException{ Set<Car> carSet = new HashSet<Car>(); PreparedStatement st = conn.prepareStatement("select * from CAR where id = "+ personId); ResultSet rs = st.executeQuery(); while(rs.next()) { carSet.add(new Car(rs.getInt(1),rs.getString(2) )); } return carSet; } } -- Sent from: http://apache-ignite-users.70518.x6.nabble.com/ |
![]() ![]() |
ilya.kasnacheev |
![]() |
Hello! There's an answer on stack overflow: If you have further questions, you can ask here as well. Regards, -- Ilya Kasnacheev сб, 20 мар. 2021 г. в 02:05, PunxsutawneyPhil3 <[hidden email]>: I am working with Postgres as an external persistent store Ignite and want to |
Free forum by Nabble | Edit this page |