Mercurial > dive4elements > river
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) { |