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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3025 - (hide annotations) (download)
Wed Apr 27 18:19:53 2016 UTC (8 years, 1 month ago) by torben
File size: 8398 byte(s)
Externalize queries
1 torben 2838 package dk.daoas.adressevedligehold.db;
2    
3 torben 3025 import java.io.InputStream;
4 torben 2838 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 torben 3025 import java.util.Properties;
12 torben 2838
13     import dk.daoas.adressevedligehold.beans.Address;
14 torben 2876 import dk.daoas.adressevedligehold.beans.Address.AddressState;
15 torben 2903 import dk.daoas.adressevedligehold.tasks.TaskLogger;
16 torben 2838 import dk.daoas.adressevedligehold.util.DeduplicateHelper;
17     import dk.daoas.adressevedligehold.util.TimingHelper;
18    
19 torben 2950 /*
20 torben 2840 *
21     */
22 torben 2838
23 torben 2946 public class DatabaseCoverageUpdate {
24 torben 2838
25 torben 2847 //static boolean DEBUG = false;
26 torben 2838
27 torben 3025 private static TaskLogger logger = TaskLogger.getInstance();
28 torben 2838
29 torben 3025 static Properties queries;
30 torben 2903
31 torben 3025 static {
32     try {
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.properties");
36    
37     queries = new Properties();
38     queries.loadFromXML(is);
39    
40    
41     } catch (Exception e) {
42     logger.warning("error", e);
43     throw new RuntimeException(e); //Escalate it to a runtime exception
44     }
45    
46     }
47    
48    
49 torben 2838 public List<Address> getAllAdresses() throws SQLException {
50     TimingHelper timing = new TimingHelper();
51    
52 torben 2847 //String debugFilter = DatabaseLayerImplementation.DEBUG ? " WHERE postnr >= 6000 " : "";
53 torben 2838
54     String sql =
55     "SELECT id,vejnavn,husnr,husnrbogstav,kommunekode,vejkode,postnr,gadeid,upper(distributor) AS distributor,dbkbane,latitude,longitude, "
56     + "rutema,korelistema,ruteti,korelisteti,ruteon,korelisteon,ruteto,korelisteto,rutefr,korelistefr,rutelo,korelistelo,ruteso,korelisteso "
57     + "FROM fulddaekning.adressetabel "
58 torben 2847 //+ debugFilter
59 torben 2838 ;
60    
61     try ( Connection conn = DBConnection.getConnection();
62 torben 2937 Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
63 torben 2838 ) {
64     stmt.setFetchSize(Integer.MIN_VALUE);
65     ResultSet res = stmt.executeQuery(sql);
66    
67     List<Address> list = new ArrayList<Address>(2600000);//initial capacity 2.6 mio
68    
69     DeduplicateHelper<String> vejnavnCache = new DeduplicateHelper<String>(81920);
70     DeduplicateHelper<String> husnrbogstavCache = new DeduplicateHelper<String>();
71     DeduplicateHelper<String> distributorCache = new DeduplicateHelper<String>();
72     DeduplicateHelper<String> dirigeringsCache = new DeduplicateHelper<String>(16*1024);
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 = (short) res.getInt(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 torben 2903 logger.info("DB Loaded " + list.size() + " adresses in " + timing.getElapsed() + "ms");
119 torben 2838
120     return list;
121     }
122     }
123    
124 torben 3024 public void saveNewAddresses(List<Address> addresses) throws Exception {
125 torben 3023
126 torben 2903 logger.info("DB::saveNewAddresses size:" + addresses.size() );
127 torben 2840
128 torben 3025 final String SQL_INSERT_NEW_ADDRESS = queries.getProperty("SQL_INSERT_NEW_ADDRESS");
129 torben 2876
130    
131 torben 3025
132    
133 torben 2876 try (Connection con = DBConnection.getConnection()) {
134 torben 2950
135 torben 2876
136 torben 3025 try (PreparedStatement stmt = con.prepareStatement(SQL_INSERT_NEW_ADDRESS)) {
137 torben 2876 for (Address addr : addresses) {
138    
139     String david = String.format("%04d%03d%04d", addr.postnr, addr.kommunekode, addr.vejkode);
140    
141     stmt.setString(1, addr.vejnavn);
142     stmt.setShort(2, addr.husnr);
143     stmt.setString(3, addr.husnrbogstav);
144     stmt.setShort(4, addr.kommunekode);
145     stmt.setShort(5, addr.vejkode);
146     stmt.setShort(6, addr.postnr);
147     stmt.setInt(7, addr.gadeid);
148     stmt.setShort(8, addr.dbkBane);
149     stmt.setString(9, david);
150    
151     stmt.setString(10, addr.ruteMandag);
152     stmt.setString(11, addr.korelisteMandag);
153     stmt.setString(12, addr.ruteTirsdag);
154     stmt.setString(13, addr.korelisteTirsdag);
155     stmt.setString(14, addr.ruteOnsdag);
156     stmt.setString(15, addr.korelisteOnsdag);
157     stmt.setString(16, addr.ruteTorsdag);
158     stmt.setString(17, addr.korelisteTorsdag);
159     stmt.setString(18, addr.ruteFredag);
160     stmt.setString(19, addr.korelisteFredag);
161     stmt.setString(20, addr.ruteLordag);
162     stmt.setString(21, addr.korelisteLordag);
163     stmt.setString(22, addr.ruteSondag);
164     stmt.setString(23, addr.korelisteSondag);
165 torben 3003
166     stmt.setString(24, addr.kommentar);
167    
168     if (addr.latitude != 0.0) {
169     stmt.setDouble(25, addr.latitude);
170     } else {
171     stmt.setNull(25, java.sql.Types.DOUBLE);
172     }
173     if (addr.longitude != 0.0) {
174     stmt.setDouble(26, addr.longitude);
175     } else {
176     stmt.setNull(26, java.sql.Types.DOUBLE);
177     }
178 torben 2876
179    
180     stmt.execute();
181     if (stmt.getUpdateCount() != 1) {
182 torben 2903 logger.info("Error executing insert: " + addr);
183 torben 2876 addr.state = AddressState.CREATE_FAIL;
184     }
185    
186     }
187     }
188    
189     //con.commit();
190     } catch (SQLException e) {
191 torben 2903 logger.warning("Error inserting addresses", e );
192 torben 3024 throw e;
193 torben 2876 }
194 torben 2840 }
195    
196 torben 3024 public void updateAddresses(List<Address> addresses) throws Exception{
197 torben 2903 logger.info("DB::UpdateAddresses size:" + addresses.size() );
198 torben 2838
199 torben 3025
200     final String SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS = queries.getProperty("SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS");
201 torben 2838
202    
203 torben 3023
204 torben 2838
205     try (Connection con = DBConnection.getConnection()) {
206 torben 2845 //con.setAutoCommit(false);
207 torben 2838
208 torben 3025 try (PreparedStatement stmt = con.prepareStatement(SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS)) {
209 torben 3018 int count = 0;
210    
211 torben 2838 for (Address addr : addresses) {
212 torben 3023 stmt.setInt(1, addr.id);
213     stmt.setString(2, addr.ruteMandag);
214     stmt.setString(3, addr.korelisteMandag);
215     stmt.setString(4, addr.ruteTirsdag);
216     stmt.setString(5, addr.korelisteTirsdag);
217     stmt.setString(6, addr.ruteOnsdag);
218     stmt.setString(7, addr.korelisteOnsdag);
219     stmt.setString(8, addr.ruteTorsdag);
220     stmt.setString(9, addr.korelisteTorsdag);
221     stmt.setString(10, addr.ruteFredag);
222     stmt.setString(11, addr.korelisteFredag);
223     stmt.setString(12, addr.ruteLordag);
224     stmt.setString(13, addr.korelisteLordag);
225     stmt.setString(14, addr.ruteSondag);
226     stmt.setString(15, addr.korelisteSondag);
227 torben 2838
228 torben 3023 stmt.setString(16, addr.distributor);
229     stmt.setInt(17, addr.dbkBane);
230 torben 2838
231    
232 torben 3023
233 torben 3018 stmt.addBatch();
234     count++;
235 torben 3023 if ( (count%200) == 0) {
236 torben 3018 stmt.executeBatch();
237 torben 3023
238     if ( (count%50000) == 0 ) {
239     logger.info("Update count " + count);
240     }
241 torben 3018 }
242 torben 2838 }
243 torben 3018
244     stmt.executeBatch(); //update remainding queries
245    
246 torben 2838 }
247    
248 torben 2845 //con.commit();
249 torben 2838 } catch (SQLException e) {
250 torben 2903 logger.warning("Error updating addresses", e );
251 torben 3024 throw e;
252 torben 2838 }
253     }
254    
255     }

  ViewVC Help
Powered by ViewVC 1.1.20