/[projects]/dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/db/DatabaseCoverageUpdate.java
ViewVC logotype

Contents of /dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/db/DatabaseCoverageUpdate.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3115 - (show annotations) (download)
Wed Sep 21 09:10:40 2016 UTC (7 years, 7 months ago) by torben
File size: 8576 byte(s)
better handling of update count
1 package dk.daoas.adressevedligehold.db;
2
3 import java.io.InputStream;
4 import java.sql.Connection;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8 import java.sql.Statement;
9 import java.util.ArrayList;
10 import java.util.List;
11 import java.util.Properties;
12
13 import dk.daoas.adressevedligehold.beans.Address;
14 import dk.daoas.adressevedligehold.beans.Address.AddressState;
15 import dk.daoas.adressevedligehold.tasks.TaskLogger;
16 import dk.daoas.adressevedligehold.util.DeduplicateHelper;
17 import dk.daoas.adressevedligehold.util.TimingHelper;
18
19 /*
20 *
21 */
22
23 public class DatabaseCoverageUpdate {
24
25 //static boolean DEBUG = false;
26
27 private TaskLogger logger = TaskLogger.getInstance();
28
29 Properties queries;
30
31 public DatabaseCoverageUpdate() throws SQLException {
32
33 //On some platforms it may be necessary to load as "META-INF/queries.properties"
34 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
35 InputStream is = classLoader.getResourceAsStream("sql.xml");
36
37 queries = new Properties();
38 try {
39 queries.loadFromXML(is);
40 } catch (Exception e) {
41 throw new SQLException("Error loading queries", e);
42 }
43
44 }
45
46
47 public List<Address> getAllAdresses() throws SQLException {
48 TimingHelper timing = new TimingHelper();
49
50 //String debugFilter = DatabaseLayerImplementation.DEBUG ? " WHERE postnr >= 6000 " : "";
51
52 String sql =
53 "SELECT id,vejnavn,husnr,husnrbogstav,kommunekode,vejkode,postnr,gadeid,upper(distributor) AS distributor,dbkbane,latitude,longitude, "
54 + "rutema,korelistema,ruteti,korelisteti,ruteon,korelisteon,ruteto,korelisteto,rutefr,korelistefr,rutelo,korelistelo,ruteso,korelisteso "
55 + "FROM fulddaekning.adressetabel "
56 //+ debugFilter
57 ;
58
59 try ( Connection conn = DBConnection.getConnection();
60 Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
61 ) {
62 stmt.setFetchSize(Integer.MIN_VALUE);
63 ResultSet res = stmt.executeQuery(sql);
64
65 List<Address> list = new ArrayList<Address>(2600000);//initial capacity 2.6 mio
66
67 DeduplicateHelper<String> vejnavnCache = new DeduplicateHelper<String>(81920);
68 DeduplicateHelper<String> husnrbogstavCache = new DeduplicateHelper<String>();
69 DeduplicateHelper<String> distributorCache = new DeduplicateHelper<String>();
70 DeduplicateHelper<String> dirigeringsCache = new DeduplicateHelper<String>(16*1024);
71
72 DeduplicateHelper<String> baneCache = new DeduplicateHelper<String>();
73
74
75 while (res.next()) {
76
77 Address a = new Address();
78 a.id = res.getInt(1);
79 a.vejnavn = vejnavnCache.getInstance( res.getString(2) );
80 a.husnr = (short) res.getInt(3);
81 a.husnrbogstav = husnrbogstavCache.getInstance( res.getString(4) );
82 a.kommunekode = (short) res.getInt(5);
83 a.vejkode = (short)res.getInt(6);
84 a.postnr = (short)res.getInt(7);
85 a.gadeid = res.getInt(8);
86 a.distributor = distributorCache.getInstance(res.getString(9));
87 a.dbkBane = baneCache.getInstance(res.getString(10));
88 a.latitude = (float) res.getDouble(11);
89 a.longitude = (float) res.getDouble(12);
90
91 a.ruteMandag = dirigeringsCache.getInstance( res.getString(13) );
92 a.korelisteMandag = dirigeringsCache.getInstance( res.getString(14) );
93
94 a.ruteTirsdag = dirigeringsCache.getInstance( res.getString(15) );
95 a.korelisteTirsdag = dirigeringsCache.getInstance( res.getString(16) );
96
97 a.ruteOnsdag = dirigeringsCache.getInstance( res.getString(17) );
98 a.korelisteOnsdag = dirigeringsCache.getInstance( res.getString(18) );
99
100 a.ruteTorsdag = dirigeringsCache.getInstance( res.getString(19) );
101 a.korelisteTorsdag = dirigeringsCache.getInstance( res.getString(20) );
102
103 a.ruteFredag = dirigeringsCache.getInstance( res.getString(21) );
104 a.korelisteFredag = dirigeringsCache.getInstance( res.getString(22) );
105
106 a.ruteLordag = dirigeringsCache.getInstance( res.getString(23) );
107 a.korelisteLordag = dirigeringsCache.getInstance( res.getString(24) );
108
109 a.ruteSondag = dirigeringsCache.getInstance( res.getString(25) );
110 a.korelisteSondag = dirigeringsCache.getInstance( res.getString(26) );
111
112
113 list.add(a);
114 }
115 res.close();
116
117
118 logger.info("DB Loaded " + list.size() + " adresses in " + timing.getElapsed() + "ms");
119
120 return list;
121 }
122 }
123
124 public int saveNewAddresses(List<Address> addresses) throws Exception {
125
126 logger.info("DB::saveNewAddresses size:" + addresses.size() );
127
128 final String SQL_INSERT_NEW_ADDRESS = queries.getProperty("SQL_INSERT_NEW_ADDRESS");
129
130
131
132
133 try (Connection con = DBConnection.getConnection()) {
134
135
136 try (PreparedStatement stmt = con.prepareStatement(SQL_INSERT_NEW_ADDRESS)) {
137 int insertCount = 0;
138 for (Address addr : addresses) {
139
140 String david = String.format("%04d%03d%04d", addr.postnr, addr.kommunekode, addr.vejkode);
141
142 stmt.setString(1, addr.vejnavn);
143 stmt.setShort(2, addr.husnr);
144 stmt.setString(3, addr.husnrbogstav);
145 stmt.setShort(4, addr.kommunekode);
146 stmt.setShort(5, addr.vejkode);
147 stmt.setShort(6, addr.postnr);
148 stmt.setInt(7, addr.gadeid);
149 stmt.setString(8, addr.dbkBane);
150 stmt.setString(9, david);
151
152 stmt.setString(10, addr.ruteMandag);
153 stmt.setString(11, addr.korelisteMandag);
154 stmt.setString(12, addr.ruteTirsdag);
155 stmt.setString(13, addr.korelisteTirsdag);
156 stmt.setString(14, addr.ruteOnsdag);
157 stmt.setString(15, addr.korelisteOnsdag);
158 stmt.setString(16, addr.ruteTorsdag);
159 stmt.setString(17, addr.korelisteTorsdag);
160 stmt.setString(18, addr.ruteFredag);
161 stmt.setString(19, addr.korelisteFredag);
162 stmt.setString(20, addr.ruteLordag);
163 stmt.setString(21, addr.korelisteLordag);
164 stmt.setString(22, addr.ruteSondag);
165 stmt.setString(23, addr.korelisteSondag);
166
167 stmt.setString(24, addr.kommentar);
168
169 if (addr.latitude != 0.0) {
170 stmt.setDouble(25, addr.latitude);
171 } else {
172 stmt.setNull(25, java.sql.Types.DOUBLE);
173 }
174 if (addr.longitude != 0.0) {
175 stmt.setDouble(26, addr.longitude);
176 } else {
177 stmt.setNull(26, java.sql.Types.DOUBLE);
178 }
179
180
181 stmt.execute();
182 if (stmt.getUpdateCount() == 1) {
183 insertCount++;
184 } else {
185 logger.info("Error executing insert: " + addr);
186 addr.state = AddressState.CREATE_FAIL;
187 }
188
189 }
190
191 return insertCount;
192 }
193
194 //con.commit();
195 } catch (SQLException e) {
196 logger.warning("Error inserting addresses", e );
197 throw e;
198 }
199 }
200
201 public int updateAddresses(List<Address> addresses) throws Exception{
202 logger.info("DB::UpdateAddresses size:" + addresses.size() );
203
204
205 final String SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS = queries.getProperty("SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS");
206
207
208
209
210 try (Connection con = DBConnection.getConnection()) {
211 //con.setAutoCommit(false);
212
213 try (PreparedStatement stmt = con.prepareStatement(SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS)) {
214 int count = 0;
215
216 for (Address addr : addresses) {
217 stmt.setInt(1, addr.id);
218 stmt.setString(2, addr.ruteMandag);
219 stmt.setString(3, addr.korelisteMandag);
220 stmt.setString(4, addr.ruteTirsdag);
221 stmt.setString(5, addr.korelisteTirsdag);
222 stmt.setString(6, addr.ruteOnsdag);
223 stmt.setString(7, addr.korelisteOnsdag);
224 stmt.setString(8, addr.ruteTorsdag);
225 stmt.setString(9, addr.korelisteTorsdag);
226 stmt.setString(10, addr.ruteFredag);
227 stmt.setString(11, addr.korelisteFredag);
228 stmt.setString(12, addr.ruteLordag);
229 stmt.setString(13, addr.korelisteLordag);
230 stmt.setString(14, addr.ruteSondag);
231 stmt.setString(15, addr.korelisteSondag);
232
233 stmt.setString(16, addr.distributor);
234 stmt.setString(17, addr.dbkBane);
235
236
237
238 stmt.addBatch();
239 count++;
240 if ( (count%200) == 0) {
241 stmt.executeBatch();
242
243 if ( (count%50000) == 0 ) {
244 logger.info("Update count " + count);
245 }
246 }
247 }
248
249 stmt.executeBatch(); //update remainding queries
250 return count;
251 }
252
253 //con.commit();
254 } catch (SQLException e) {
255 logger.warning("Error updating addresses", e );
256 throw e;
257 }
258
259 }
260
261 }

  ViewVC Help
Powered by ViewVC 1.1.20