/[projects]/dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/Lookup.java
ViewVC logotype

Diff of /dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/Lookup.java

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

revision 2145 by torben, Wed Apr 30 08:15:48 2014 UTC revision 2227 by torben, Mon Sep 22 07:39:46 2014 UTC
# Line 2  package dk.daoas.fulddaekning; Line 2  package dk.daoas.fulddaekning;
2    
3  import java.io.File;  import java.io.File;
4  import java.io.FileReader;  import java.io.FileReader;
 import java.io.IOException;  
 import java.sql.Connection;  
 import java.sql.DriverManager;  
 import java.sql.SQLException;  
 import java.util.ArrayList;  
5  import java.util.List;  import java.util.List;
6  import java.util.Map;  import java.util.Map;
 import java.util.Properties;  
7  import java.util.Queue;  import java.util.Queue;
8  import java.util.concurrent.ConcurrentHashMap;  import java.util.concurrent.ConcurrentHashMap;
9    import java.util.logging.FileHandler;
10  import java.util.logging.Level;  import java.util.logging.Level;
11  import java.util.logging.Logger;  import java.util.logging.Logger;
12    import java.util.logging.SimpleFormatter;
13    
14  import dk.daoas.fulddaekning.BoundingBox.BoundingBoxException;  import dk.daoas.fulddaekning.BoundingBox.BoundingBoxException;
15    
16  public class Lookup {  public class Lookup {
17    
18            static final String CONFIG_FILENAME = "fulddaekning.properties";
19    
20          static int max_workers;          static int max_workers;
21          static boolean verbose;          static boolean verbose;
22                    
23          static Properties conf;          static boolean rename_tables;
24            static String distributor;
25            
26            static SafeProperties conf;
27          static Logger logger = Logger.getLogger( Lookup.class.toString() );          static Logger logger = Logger.getLogger( Lookup.class.toString() );
28                    
29          int postnr;          int postnr;
30          Database db;          Database db;
31                                    
32          ArrayList<Adresse> daekkedeAdresser;          Adresse daekkedeAdresser[];
33          Queue<Adresse> queue;          Queue<Adresse> queue;
34                    
35          Map<Integer, LookupWorker> workers = new ConcurrentHashMap<Integer, LookupWorker>();          Map<Integer, LookupWorker> workers = new ConcurrentHashMap<Integer, LookupWorker>();
36    
37                    
38            static Statistik flestDaekkede = new Statistik();
39            static Statistik flestIkkeDaekkede = new Statistik();
40            static Statistik mestBrugteTid = new Statistik();
41            static Statistik stoersteDataset = new Statistik();
42            
43            
44            static class Statistik {
45                    int postnr;
46                    int antalDaekkede = 0;
47                    int antalIkkeDaekkede = 0;
48                    int totalDataset = 0;          
49                    long forbrugtTid = 0;
50    
51                    
52                    @Override
53                    public String toString() {
54                            return "postnr=" + postnr + " antalIkkeDaekkede=" + antalIkkeDaekkede + " antalDaekkede="  + antalDaekkede + " forbrugtTid=" + forbrugtTid + " totalDataset=" + totalDataset;
55                    }
56            }
57            
58                    
59          public Lookup(int postnr, Database db) {          public Lookup(int postnr, Database db) {
60                  this.postnr = postnr;                  this.postnr = postnr;
61                  this.db = db;                  this.db = db;
62          }          }
63                    
64                    public static void saveStatistics(Statistik stat) {
65                    if (stat.antalDaekkede > flestDaekkede.antalDaekkede) {
66                            flestDaekkede = stat;
67                    }
68                    if (stat.antalIkkeDaekkede > flestIkkeDaekkede.antalIkkeDaekkede) {
69                            flestIkkeDaekkede = stat;
70                    }
71                    
72                    if (stat.totalDataset > mestBrugteTid.totalDataset) {
73                            stoersteDataset = stat;
74                    }
75                    
76                    if (stat.forbrugtTid > mestBrugteTid.forbrugtTid) {
77                            mestBrugteTid = stat;
78                    }
79            }
80                    
81          public void doLookup() throws BoundingBoxException {          public void doLookup() throws BoundingBoxException {
82                  logger.info("Starting for postnr=" + postnr);                  logger.info("Starting for postnr=" + postnr);
83                                    
84                  int queueSize=-1;                  Statistik stat = new Statistik();
85                                                    
86                  long start1 = System.currentTimeMillis();                                long start1 = System.currentTimeMillis();              
87                  long start2 = 0;                  long start2 = 0;
88                                    
# Line 62  public class Lookup { Line 99  public class Lookup {
99                                                    
100                          logger.info("Henter _ikke_ daekkede adresser i " + postnr);                          logger.info("Henter _ikke_ daekkede adresser i " + postnr);
101                          queue = db.hentIkkedaekkedeAdresser(postnr);                          queue = db.hentIkkedaekkedeAdresser(postnr);
                         queueSize = queue.size();  
102                                                    
103                            stat.postnr = postnr;
104                            stat.antalDaekkede = daekkedeAdresser.length;
105                            stat.antalIkkeDaekkede = queue.size();
106                            stat.totalDataset = stat.antalDaekkede * stat.antalIkkeDaekkede;
107                                                                            
108                                                    
109                          logger.info("Starter beregning for " + postnr);                          logger.info("Starter beregning for " + postnr);
110                          start2 = System.currentTimeMillis();                          start2 = System.currentTimeMillis();
# Line 80  public class Lookup { Line 121  public class Lookup {
121                                  Thread.sleep(10);//wait for worker threads                                  Thread.sleep(10);//wait for worker threads
122                          }                          }
123                                                    
124                            db.saveBatch();//Save any unsaved rows
125                            
126                                                    
127                  } catch(Exception e) {                  } catch(Exception e) {
128                          logger.log(Level.WARNING, "Exception during lookup", e);                          logger.log(Level.WARNING, "Exception during lookup", e);
# Line 92  public class Lookup { Line 135  public class Lookup {
135                  }                  }
136                  long now = System.currentTimeMillis();                  long now = System.currentTimeMillis();
137                                    
138                  logger.info("Antal daekkede:" + daekkedeAdresser.size() );                  stat.forbrugtTid = (now-start1);
139                  logger.info("Antal ikke-daekkede:" + queueSize );                  saveStatistics(stat);
140                    
141                  logger.info("Done! elapsed=" + (now-start1) + "/" +  (now-start2) );                  logger.info( stat.toString() );
142                    logger.info("Done! elapsed=" + (now-start1) + "/" +  (now-start2) + "  postnr=" + postnr);
143          }          }
144                    
145          public void shutdownWorker(int workerid) {          public void shutdownWorker(int workerid) {
146                  logger.info("Shutting down worker: " + workerid);                  logger.info("Shutting down worker: " + workerid);
147                  workers.remove(workerid);                  LookupWorker key = workers.remove(workerid);
148                    
149                    if (key == null) {
150                            System.out.println("Error removing worker from set");
151                            System.exit(0);
152                    }
153          }          }
154                    
155          // Getters and setters          // Getters and setters
# Line 112  public class Lookup { Line 161  public class Lookup {
161    
162    
163    
164          public ArrayList<Adresse> getDaekkedeAdresser() {          public Adresse[] getDaekkedeAdresser() {
165                  return daekkedeAdresser;                  return daekkedeAdresser;
166          }          }
167    
# Line 133  public class Lookup { Line 182  public class Lookup {
182                    
183          public static void main(String[] args) throws Exception {          public static void main(String[] args) throws Exception {
184                                    
185                  File confFile = new File("fulddaekning.properties");                  //Setup j.u.l Logger
186                    Logger root = Logger.getLogger("");
187                    FileHandler fhandler = new FileHandler("fulddaekning.log"); // Ingen max størrelse, ingen rotation og ingen append
188                    fhandler.setFormatter( new SimpleFormatter() );
189                    root.addHandler( fhandler );
190                    
191                    
192                    
193                    
194                    File confFile = new File( CONFIG_FILENAME );
195                  if (! confFile.exists() ) {                  if (! confFile.exists() ) {
196                          logger.warning("Config file not found");                          logger.warning("Config file not found: " + CONFIG_FILENAME);
197                          System.exit(1);                          System.exit(1);
198                  }                  }
199                                                                    
200                  conf = new Properties();                  conf = new SafeProperties();
201                  conf.load( new FileReader(confFile) );                  conf.load( new FileReader(confFile) );
202                                    
203                  max_workers = Integer.parseInt( conf.getProperty("MAX_WORKERS") );                  max_workers = Integer.parseInt( conf.getSafeProperty("MAX_WORKERS") );
204                  logger.info("Starting with MAX_WORKERS:" + max_workers);                  logger.info("Starting with MAX_WORKERS:" + max_workers);
205                                    
206                  verbose = Boolean.parseBoolean( conf.getProperty("VERBOSE") );                  verbose = Boolean.parseBoolean( conf.getSafeProperty("VERBOSE") );
207                  logger.info("Starting with VERBOSE:" + verbose);                  logger.info("Starting with VERBOSE:" + verbose);
208                                    
209                  Connection conn = getConnection();                  rename_tables = Boolean.parseBoolean( conf.getSafeProperty("RENAMETABLES") );
210                  Database db = new Database(conn);                  logger.info("Starting with RENAMETABLES:" + rename_tables);
211                    
212                    distributor = conf.getSafeProperty("DISTRIBUTOR");
213                    distributor = distributor.toUpperCase();
214                    Constants.init(distributor);
215    
216                    
217                    Database db = new Database(conf);
218                    
219                    
220    
221                                    
222                                    
# Line 160  public class Lookup { Line 227  public class Lookup {
227                  logger.info("Finder postnumre");                  logger.info("Finder postnumre");
228                  List<Integer> postnumre = db.hentPostnumre();                  List<Integer> postnumre = db.hentPostnumre();
229                                    
230                    // Først validerer vi BBox på alle postnummre, for at undgå fuldt stop midt i beregningen
231                    for(Integer postnr : postnumre) { //
232                            logger.info("Validerer BBox for " + postnr);
233                            BoundingBox bbox = db.getBoundingbox(postnr);
234                            bbox.validateBbox();
235                    }
236                    
237                    
238                    //pre-check er ok - reset tmp tabel og start søgningen
239                    db.resetResultTable();
240                    
241                  for(Integer postnr : postnumre) {                  for(Integer postnr : postnumre) {
242                          Lookup lookup = new Lookup(postnr, db);                          Lookup lookup = new Lookup(postnr, db);
243                          lookup.doLookup();                                                lookup.doLookup();                      
244                  }                  }
245                                    
246                  long now = System.currentTimeMillis();                  if (rename_tables) {
247                                            db.renameResultTables();
248                  logger.info("Fuld load done : " + (now-start) );                  } else {
249                            logger.info( "Rename tables is disabled !!!" );
250                    }
251                                    
252                    long now = System.currentTimeMillis();
253                    long elapsed = now - start ;
254    
255                    logger.info("Mest brugte tid: " + mestBrugteTid);
256                    logger.info("Flest Ikke-dækkede, " + flestIkkeDaekkede);
257                    logger.info("Flest Dækkede, " + flestDaekkede);
258                    logger.info("Største Dataset, " + stoersteDataset);
259                    logger.info("Fuld load done : " + formatMilliSeconds(elapsed) );
260    
261                                    
262                  //Lookup lookup = new Lookup(7400, db);                  /*
263                  //lookup.doLookup();                              /// Test
264                    db.resetResultTable();
265                    Lookup lookup = new Lookup(2750, db);
266                    lookup.doLookup();              
267                    long now = System.currentTimeMillis();
268                    long elapsed = now - start ;
269                    logger.info("Fuld load done : " + formatMilliSeconds(elapsed) );*/
270          }          }
271                    
272          public static Connection getConnection() throws SQLException, IOException {          static String formatMilliSeconds(long milliseconds) {
273                                                    int mseconds = (int) milliseconds % 1000;
274                  String db_host = conf.getProperty("DB_HOST");                  int seconds = (int) (milliseconds / 1000) % 60 ;
275                  String db_user = conf.getProperty("DB_USER");                  int minutes = (int) ((milliseconds / (1000*60)) % 60);
276                  String db_pass = conf.getProperty("DB_PASS");                  int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
   
                   
277                                    
278                    return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, mseconds);
             Connection conn = null;  
             Properties connectionProps = new Properties();  
             connectionProps.put("user", db_user);  
             connectionProps.put("password", db_pass);  
   
                 conn = DriverManager.getConnection(  
                            "jdbc:mysql://" +  
                            db_host +  
                            ":3306/",  
                            connectionProps);  
             logger.info("Connected to database");  
             return conn;  
279          }          }
280                            
281  }  }

Legend:
Removed from v.2145  
changed lines
  Added in v.2227

  ViewVC Help
Powered by ViewVC 1.1.20