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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/db/DatabaseLayerImplementation.java revision 2840 by torben, Mon Jan 25 10:25:22 2016 UTC dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/db/DatabaseCoverageUpdate.java revision 3025 by torben, Wed Apr 27 18:19:53 2016 UTC
# Line 1  Line 1 
1  package dk.daoas.adressevedligehold.db;  package dk.daoas.adressevedligehold.db;
2    
3    import java.io.InputStream;
4  import java.sql.Connection;  import java.sql.Connection;
5  import java.sql.PreparedStatement;  import java.sql.PreparedStatement;
6  import java.sql.ResultSet;  import java.sql.ResultSet;
# Line 7  import java.sql.SQLException; Line 8  import java.sql.SQLException;
8  import java.sql.Statement;  import java.sql.Statement;
9  import java.util.ArrayList;  import java.util.ArrayList;
10  import java.util.List;  import java.util.List;
11    import java.util.Properties;
12    
13  import dk.daoas.adressevedligehold.beans.Address;  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;  import dk.daoas.adressevedligehold.util.DeduplicateHelper;
17  import dk.daoas.adressevedligehold.util.TimingHelper;  import dk.daoas.adressevedligehold.util.TimingHelper;
18    
19  /*  /*
  * TODO: Batched skrivning af updates  
  * TODO: Skrivning af nye adresser  
20   *     *  
21   */   */
22    
23  public class DatabaseLayerImplementation  {  public class DatabaseCoverageUpdate  {
24                    
25          static boolean DEBUG = false;          //static boolean DEBUG = false;
26            
27            private static TaskLogger logger = TaskLogger.getInstance();
28            
29            static Properties queries;
30            
31            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          public List<Address> getAllAdresses() throws SQLException {          public List<Address> getAllAdresses() throws SQLException {
50                  TimingHelper timing = new TimingHelper();                  TimingHelper timing = new TimingHelper();
51                                    
52                  String debugFilter = DatabaseLayerImplementation.DEBUG ? " WHERE postnr = 8700 " : "";                  //String debugFilter = DatabaseLayerImplementation.DEBUG ? " WHERE postnr >= 6000 " : "";
53                                    
54                  String sql =                  String sql =
55                                  "SELECT id,vejnavn,husnr,husnrbogstav,kommunekode,vejkode,postnr,gadeid,upper(distributor) AS distributor,dbkbane,latitude,longitude, "                                  "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 "                                  + "rutema,korelistema,ruteti,korelisteti,ruteon,korelisteon,ruteto,korelisteto,rutefr,korelistefr,rutelo,korelistelo,ruteso,korelisteso "
57                                  + "FROM fulddaekning.adressetabel "                                  + "FROM fulddaekning.adressetabel "
58                                  + debugFilter                                  //+ debugFilter
59                                  ;                                  ;
60                                    
61                  try ( Connection conn = DBConnection.getConnection();                            try ( Connection conn = DBConnection.getConnection();          
62                                  Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);                                  Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
63                                  ) {                                  ) {
64                          stmt.setFetchSize(Integer.MIN_VALUE);                          stmt.setFetchSize(Integer.MIN_VALUE);
65                          ResultSet res = stmt.executeQuery(sql);                          ResultSet res = stmt.executeQuery(sql);
# Line 92  public class DatabaseLayerImplementation Line 115  public class DatabaseLayerImplementation
115                          res.close();                          res.close();
116                                                    
117                                                    
118                          System.out.println("DB Loaded " + list.size() + " adresses in " + timing.getElapsed() + "ms");                          logger.info("DB Loaded " + list.size() + " adresses in " + timing.getElapsed() + "ms");
119                                                    
120                          return list;                          return list;
121                  }                  }
122          }          }
123                    
124          private void updateAddressesBatch(List<Address> addresses)  throws SQLException {          public void 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                                    
         }  
           
         public void updateAddresses(List<Address> addresses) {  
131                                    
                 String sql = "UPDATE fulddaekning.adressetabel " +  
                                         "SET " +  
                                         "RuteMa=?, KorelisteMa=?, " +  
                                         "RuteTi=?, KorelisteTi=?, " +  
                                         "RuteOn=?, KorelisteOn=?, " +  
                                         "RuteTo=?, KorelisteTo=?, " +  
                                         "RuteFr=?, KorelisteFr=?, " +  
                                         "RuteLo=?, KorelisteLo=?, " +  
                                         "RuteSo=?, KorelisteSo=?  " +  
                                         "WHERE id=?";  
                                           
                                           
132                                    
133                  try (Connection con = DBConnection.getConnection()) {                  try (Connection con = DBConnection.getConnection()) {
134                          con.setAutoCommit(false);  
135                                                    
136                          try (PreparedStatement stmt = con.prepareStatement(sql)) {                          try (PreparedStatement stmt = con.prepareStatement(SQL_INSERT_NEW_ADDRESS)) {
137                                  for (Address addr : addresses) {                                  for (Address addr : addresses) {
138                                          stmt.setString(1, addr.ruteMandag);                                          
139                                          stmt.setString(2, addr.korelisteMandag);                                          String david = String.format("%04d%03d%04d", addr.postnr, addr.kommunekode, addr.vejkode);
140                                          stmt.setString(3, addr.ruteTirsdag);                                          
141                                          stmt.setString(4, addr.korelisteTirsdag);                                          stmt.setString(1, addr.vejnavn);
142                                          stmt.setString(5, addr.ruteOnsdag);                                          stmt.setShort(2, addr.husnr);
143                                          stmt.setString(6, addr.korelisteOnsdag);                                          stmt.setString(3, addr.husnrbogstav);
144                                          stmt.setString(7, addr.ruteTorsdag);                                          stmt.setShort(4, addr.kommunekode);
145                                          stmt.setString(8, addr.korelisteTorsdag);                                          stmt.setShort(5, addr.vejkode);
146                                          stmt.setString(9, addr.ruteFredag);                                          stmt.setShort(6, addr.postnr);
147                                          stmt.setString(10, addr.korelisteFredag);                                          stmt.setInt(7, addr.gadeid);
148                                          stmt.setString(11, addr.ruteLordag);                                          stmt.setShort(8, addr.dbkBane);
149                                          stmt.setString(12, addr.korelisteLordag);                                          stmt.setString(9, david);
150                                          stmt.setString(13, addr.ruteSondag);                                          
151                                          stmt.setString(14, addr.korelisteSondag);                                          stmt.setString(10, addr.ruteMandag);
152                                            stmt.setString(11, addr.korelisteMandag);
153                                          stmt.setInt(15, addr.id);                                          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                                            
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    
179                                                                                    
180                                          stmt.execute();                                          stmt.execute();
181                                          if (stmt.getUpdateCount() != 1) {                                          if (stmt.getUpdateCount() != 1) {
182                                                  System.out.println("Error executing update");                                                  logger.info("Error executing insert: " + addr);
183                                                    addr.state = AddressState.CREATE_FAIL;
184                                          }                                          }
185                                                                                    
186                                  }                                  }
187                          }                          }
188                                                    
189                          con.commit();                          //con.commit();
190                  } catch (SQLException e) {                  } catch (SQLException e) {
191                          System.out.println("Error updating addresses" + e.getMessage() );                          logger.warning("Error inserting addresses", e  );
192                            throw e;
193                  }                  }
194          }          }
195                    
196          private static String nullify(String str) {          public void updateAddresses(List<Address> addresses) throws Exception{
197                  if (str == null)                  logger.info("DB::UpdateAddresses size:" + addresses.size() );
198                          return null;                  
                   
                 if (str.equals("")) {  
                         return null;  
                 } else {  
                         return str;  
                 }  
         }  
199    
200                    final String SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS = queries.getProperty("SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS");
201                                            
202                                            
203                                            
204                    
205                    try (Connection con = DBConnection.getConnection()) {
206                            //con.setAutoCommit(false);
207                            
208                            try (PreparedStatement stmt = con.prepareStatement(SQL_INSERT_ON_DUPLICATE_KEY_UPDATE_ADDRESS)) {
209                                    int count = 0;
210                                    
211                                    for (Address addr : addresses) {
212                                            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    
228          /*                                          stmt.setString(16, addr.distributor);
229          private static int safeInt(String str) {                                          stmt.setInt(17, addr.dbkBane);
230                  try {                                          
231                          return Integer.parseInt( str );                                          
232                  } catch (NumberFormatException e) {                                          
233                          return 0;                                          stmt.addBatch();
234                                            count++;
235                                            if ( (count%200) == 0) {
236                                                    stmt.executeBatch();
237                                                    
238                                                    if ( (count%50000) == 0 ) {
239                                                            logger.info("Update count " + count);
240                                                    }
241                                            }                                      
242                                    }
243                                    
244                                    stmt.executeBatch(); //update remainding queries
245                                    
246                            }
247                            
248                            //con.commit();
249                    } catch (SQLException e) {
250                            logger.warning("Error updating addresses", e );
251                            throw e;
252                  }                  }
253          }          }
254                    
   
           
         private static String coalesce(String s1, String s2) {  
                 if (s1 != null)  
                         return s1;  
                   
                 return s2;  
         }  
   
         */  
255  }  }

Legend:
Removed from v.2840  
changed lines
  Added in v.3025

  ViewVC Help
Powered by ViewVC 1.1.20