comparison flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java @ 501:04d449f7f0c9

Importer: Change caching strategy not to cause OOM any more. flys-backend/trunk@1855 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 09 May 2011 00:15:45 +0000
parents d50cd3a632e0
children c6889097f81f
comparison
equal deleted inserted replaced
500:d50cd3a632e0 501:04d449f7f0c9
1 package de.intevation.flys.importer; 1 package de.intevation.flys.importer;
2 2
3 import java.util.Iterator; 3 import java.util.Iterator;
4 import java.util.Map; 4 import java.util.Map;
5 import java.util.HashMap; 5 import java.util.HashMap;
6 import java.util.LinkedHashMap;
6 7
7 import java.math.BigDecimal; 8 import java.math.BigDecimal;
8 9
9 import org.hibernate.SessionFactory; 10 import org.hibernate.SessionFactory;
10 import org.hibernate.Session; 11 import org.hibernate.Session;
24 25
25 public class ImporterSession 26 public class ImporterSession
26 { 27 {
27 private static Logger log = Logger.getLogger(ImporterSession.class); 28 private static Logger log = Logger.getLogger(ImporterSession.class);
28 29
30 public static final int MAX_WST_CACHE_SIZE = 20;
31 public static final int MAX_AT_CACHE_SIZE = 20;
32
29 private static final ThreadLocal<ImporterSession> SESSION = 33 private static final ThreadLocal<ImporterSession> SESSION =
30 new ThreadLocal<ImporterSession>() { 34 new ThreadLocal<ImporterSession>() {
31 @Override 35 @Override
32 protected ImporterSession initialValue() { 36 protected ImporterSession initialValue() {
33 return new ImporterSession(); 37 return new ImporterSession();
34 } 38 }
35 }; 39 };
36 40
37 protected Session databaseSession; 41 protected Session databaseSession;
38 42
39 protected Map<IdValueKey, WstColumnValue> wstColumnValues; 43 protected Map<Integer, Map<ValueKey, WstColumnValue>> wstColumnValues;
40 44
41 protected Map<IdValueKey, DischargeTableValue> dischargeTableValues; 45 protected Map<Integer, Map<ValueKey, DischargeTableValue>>
46 dischargeTableValues;
42 47
43 protected Map<IdValueKey, Range> ranges; 48 protected Map<IdValueKey, Range> ranges;
44 49
45 public static ImporterSession getInstance() { 50 public static ImporterSession getInstance() {
46 return SESSION.get(); 51 return SESSION.get();
49 public ImporterSession() { 54 public ImporterSession() {
50 SessionFactory sessionFactory = 55 SessionFactory sessionFactory =
51 SessionFactoryProvider.createSessionFactory(); 56 SessionFactoryProvider.createSessionFactory();
52 databaseSession = sessionFactory.openSession(); 57 databaseSession = sessionFactory.openSession();
53 databaseSession.setFlushMode(FlushMode.MANUAL); 58 databaseSession.setFlushMode(FlushMode.MANUAL);
59
60 wstColumnValues =
61 new LinkedHashMap<Integer, Map<ValueKey, WstColumnValue>>() {
62 @Override
63 protected boolean removeEldestEntry(
64 Map.Entry<Integer, Map<ValueKey, WstColumnValue>> eldest
65 ) {
66 return size() > MAX_WST_CACHE_SIZE;
67 }
68 };
69
70 dischargeTableValues =
71 new LinkedHashMap<Integer, Map<ValueKey, DischargeTableValue>>() {
72 @Override
73 protected boolean removeEldestEntry(
74 Map.Entry<Integer, Map<ValueKey, DischargeTableValue>> eldest
75 ) {
76 return size() > MAX_AT_CACHE_SIZE;
77 }
78 };
54 } 79 }
55 80
56 public Session getDatabaseSession() { 81 public Session getDatabaseSession() {
57 return databaseSession; 82 return databaseSession;
58 } 83 }
60 public WstColumnValue getWstColumnValue( 85 public WstColumnValue getWstColumnValue(
61 WstColumn column, 86 WstColumn column,
62 BigDecimal position, 87 BigDecimal position,
63 BigDecimal w 88 BigDecimal w
64 ) { 89 ) {
65 if (wstColumnValues == null) { 90 Integer c = column.getId();
66 loadWstColumnValues(); 91
92 Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c);
93
94 if (map == null) {
95 map = new HashMap<ValueKey, WstColumnValue>();
96 wstColumnValues.put(c, map);
97 Query query = databaseSession.createQuery(
98 "from WstColumnValue where wstColumn.id=:cid");
99 query.setParameter("cid", c);
100 for (Iterator iter = query.iterate(); iter.hasNext();) {
101 WstColumnValue wcv = (WstColumnValue)iter.next();
102 map.put(new ValueKey(wcv.getPosition(), wcv.getW()), wcv);
103 }
67 } 104 }
68 105
69 IdValueKey key = new IdValueKey(column.getId(), position, w); 106 ValueKey key = new ValueKey(position, w);
70 107
71 WstColumnValue wcv = wstColumnValues.get(key); 108 WstColumnValue wcv = map.get(key);
72 109
73 if (wcv != null) { 110 if (wcv != null) {
74 return wcv; 111 return wcv;
75 } 112 }
76 113
77 wcv = new WstColumnValue(column, position, w); 114 wcv = new WstColumnValue(column, position, w);
78 115
79 databaseSession.save(wcv); 116 databaseSession.save(wcv);
80 117
81 wstColumnValues.put(key, wcv); 118 map.put(key, wcv);
82 119
83 return wcv; 120 return wcv;
84 }
85
86 protected void loadWstColumnValues() {
87 log.info("load wst column values");
88 wstColumnValues = new HashMap<IdValueKey, WstColumnValue>();
89
90 Query query = databaseSession.createQuery("from WstColumnValue");
91
92 for (Iterator iter = query.iterate(); iter.hasNext();) {
93 WstColumnValue wcv = (WstColumnValue)iter.next();
94 wstColumnValues.put(new IdValueKey(wcv), wcv);
95 }
96 log.info(wstColumnValues.size() + " values loaded");
97 } 121 }
98 122
99 public DischargeTableValue getDischargeTableValue( 123 public DischargeTableValue getDischargeTableValue(
100 DischargeTable table, 124 DischargeTable table,
101 BigDecimal q, 125 BigDecimal q,
102 BigDecimal w 126 BigDecimal w
103 ) { 127 ) {
104 if (dischargeTableValues == null) { 128 Integer t = table.getId();
105 loadDischargeTableValues(); 129
130 Map<ValueKey, DischargeTableValue> map =
131 dischargeTableValues.get(t);
132
133 if (map == null) {
134 map = new HashMap<ValueKey, DischargeTableValue>();
135 dischargeTableValues.put(t, map);
136 Query query = databaseSession.createQuery(
137 "from DischargeTableValue where dischargeTable.id=:tid");
138 query.setParameter("tid", t);
139 for (Iterator iter = query.iterate(); iter.hasNext();) {
140 DischargeTableValue dctv = (DischargeTableValue)iter.next();
141 map.put(new ValueKey(q, w), dctv);
142 }
106 } 143 }
107 144
108 IdValueKey key = new IdValueKey(table.getId(), q, w); 145 ValueKey key = new ValueKey(q, w);
109 146
110 DischargeTableValue dtv = dischargeTableValues.get(key); 147 DischargeTableValue dctv = map.get(key);
111 148
112 if (dtv != null) { 149 if (dctv != null) {
113 return dtv; 150 return dctv;
114 } 151 }
115 152
116 dtv = new DischargeTableValue(table, q, w); 153 dctv = new DischargeTableValue(table, q, w);
117 154
118 databaseSession.save(dtv); 155 databaseSession.save(dctv);
119 156
120 dischargeTableValues.put(key, dtv); 157 map.put(key, dctv);
121 158
122 return dtv; 159 return dctv;
123 }
124
125 protected void loadDischargeTableValues() {
126 log.info("load discharge table values");
127
128 dischargeTableValues = new HashMap<IdValueKey, DischargeTableValue>();
129
130 Query query = databaseSession.createQuery("from DischargeTableValue");
131
132 for (Iterator iter = query.iterate(); iter.hasNext();) {
133 DischargeTableValue dtv = (DischargeTableValue)iter.next();
134 dischargeTableValues.put(new IdValueKey(dtv), dtv);
135 }
136 log.info(dischargeTableValues.size() + " values loaded");
137 } 160 }
138 161
139 public Range getRange(River river, BigDecimal a, BigDecimal b) { 162 public Range getRange(River river, BigDecimal a, BigDecimal b) {
140 163
141 if (ranges == null) { 164 if (ranges == null) {

http://dive4elements.wald.intevation.org