--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/db/DatabaseLayerImplementation.java 2016/01/26 11:48:37 2847 +++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/db/DatabaseCoverageUpdate.java 2016/04/26 19:34:14 3024 @@ -8,20 +8,24 @@ import java.util.ArrayList; import java.util.List; + + import dk.daoas.adressevedligehold.beans.Address; +import dk.daoas.adressevedligehold.beans.Address.AddressState; +import dk.daoas.adressevedligehold.tasks.TaskLogger; import dk.daoas.adressevedligehold.util.DeduplicateHelper; import dk.daoas.adressevedligehold.util.TimingHelper; -/* - * TODO: Batched skrivning af updates - * TODO: Skrivning af nye adresser +/* * */ -public class DatabaseLayerImplementation { +public class DatabaseCoverageUpdate { //static boolean DEBUG = false; + private TaskLogger logger = TaskLogger.getInstance(); + public List
getAllAdresses() throws SQLException { TimingHelper timing = new TimingHelper(); @@ -36,7 +40,7 @@ ; try ( Connection conn = DBConnection.getConnection(); - 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); ) { stmt.setFetchSize(Integer.MIN_VALUE); ResultSet res = stmt.executeQuery(sql); @@ -92,20 +96,93 @@ res.close(); - System.out.println("DB Loaded " + list.size() + " adresses in " + timing.getElapsed() + "ms"); + logger.info("DB Loaded " + list.size() + " adresses in " + timing.getElapsed() + "ms"); return list; } } - private void updateAddressesBatch(List
addresses) throws SQLException { + public void saveNewAddresses(List
addresses) throws Exception { + + logger.info("DB::saveNewAddresses size:" + addresses.size() ); + + String sql = "INSERT IGNORE INTO fulddaekning.adressetabel " + + "(vejnavn,husnr,husnrbogstav,kommunekode,vejkode,postnr,gadeid,dbkbane,indlast,aendret,david,googlechecked," + + "RuteMa,KorelisteMa,RuteTi,KorelisteTi,RuteOn,KorelisteOn,RuteTo,KorelisteTo,RuteFr,KorelisteFr,RuteLo,KorelisteLo,RuteSo,KorelisteSo, " + + "kommentar,latitude,longitude) " + + "VALUES " + + "(?,?,?,?,?,?,?,?, now(), now(), ?, 0, " + + "?,?,?,?,?,?,?,?,?,?,?,?,?,?," + + "?,?,?) "; + + try (Connection con = DBConnection.getConnection()) { + + + try (PreparedStatement stmt = con.prepareStatement(sql)) { + for (Address addr : addresses) { + + String david = String.format("%04d%03d%04d", addr.postnr, addr.kommunekode, addr.vejkode); + + stmt.setString(1, addr.vejnavn); + stmt.setShort(2, addr.husnr); + stmt.setString(3, addr.husnrbogstav); + stmt.setShort(4, addr.kommunekode); + stmt.setShort(5, addr.vejkode); + stmt.setShort(6, addr.postnr); + stmt.setInt(7, addr.gadeid); + stmt.setShort(8, addr.dbkBane); + stmt.setString(9, david); + + stmt.setString(10, addr.ruteMandag); + stmt.setString(11, addr.korelisteMandag); + stmt.setString(12, addr.ruteTirsdag); + stmt.setString(13, addr.korelisteTirsdag); + stmt.setString(14, addr.ruteOnsdag); + stmt.setString(15, addr.korelisteOnsdag); + stmt.setString(16, addr.ruteTorsdag); + stmt.setString(17, addr.korelisteTorsdag); + stmt.setString(18, addr.ruteFredag); + stmt.setString(19, addr.korelisteFredag); + stmt.setString(20, addr.ruteLordag); + stmt.setString(21, addr.korelisteLordag); + stmt.setString(22, addr.ruteSondag); + stmt.setString(23, addr.korelisteSondag); + + stmt.setString(24, addr.kommentar); + + if (addr.latitude != 0.0) { + stmt.setDouble(25, addr.latitude); + } else { + stmt.setNull(25, java.sql.Types.DOUBLE); + } + if (addr.longitude != 0.0) { + stmt.setDouble(26, addr.longitude); + } else { + stmt.setNull(26, java.sql.Types.DOUBLE); + } + + + stmt.execute(); + if (stmt.getUpdateCount() != 1) { + logger.info("Error executing insert: " + addr); + addr.state = AddressState.CREATE_FAIL; + } + + } + } + + //con.commit(); + } catch (SQLException e) { + logger.warning("Error inserting addresses", e ); + throw e; + } } - public void updateAddresses(List
addresses) { - System.out.println("DB::UpdateAddresses size:" + addresses.size() ); + public void updateAddresses(List
addresses) throws Exception{ + logger.info("DB::UpdateAddresses size:" + addresses.size() ); - String sql = "UPDATE fulddaekning.adressetabel " + + /*String sql = "UPDATE fulddaekning.adressetabel " + "SET " + "RuteMa=?, KorelisteMa=?, " + "RuteTi=?, KorelisteTi=?, " + @@ -115,8 +192,35 @@ "RuteLo=?, KorelisteLo=?, " + "RuteSo=?, KorelisteSo=?, " + "Distributor=?, " + - "DBKBane=? " + - "WHERE id=?"; + "DBKBane=?, " + + "Aendret=now() " + + "WHERE id=? ";*/ + String sql = "INSERT INTO fulddaekning.adressetabel " + + "(id, " + + "RuteMa, KorelisteMa, RuteTi, KorelisteTi, RuteOn, KorelisteOn, " + + "RuteTo, KorelisteTo, RuteFr, KorelisteFr, RuteLo, KorelisteLo, " + + "RuteSo, KorelisteSo, " + + "Distributor, DBKBane, Aendret, " + + "vejnavn,husnr,husnrbogstav,kommunekode,vejkode,gadeid,postnr) \n" + //Disse har ingen default value + "VALUES " + + "(?," + + "?,?,?,?,?,?," + + "?,?,?,?,?,?," + + "?,?," + + "?,?, now(), " + + "'',0,'',0,0,0,0 ) \n" + + + "ON DUPLICATE KEY UPDATE " + + "RuteMa=VALUES(RuteMa), KorelisteMa=VALUES(KorelisteMa), " + + "RuteTi=VALUES(RuteTi), KorelisteTi=VALUES(KorelisteTi), " + + "RuteOn=VALUES(RuteOn), KorelisteOn=VALUES(KorelisteOn), " + + "RuteTo=VALUES(RuteTo), KorelisteTo=VALUES(KorelisteTo), " + + "RuteFr=VALUES(RuteFr), KorelisteFr=VALUES(KorelisteFr), " + + "RuteLo=VALUES(RuteLo), KorelisteLo=VALUES(KorelisteLo), " + + "RuteSo=VALUES(RuteSo), KorelisteSo=VALUES(KorelisteSo), " + + "Distributor=VALUES(Distributor), " + + "DBKBane=VALUES(DBKBane) "; + @@ -124,41 +228,53 @@ //con.setAutoCommit(false); try (PreparedStatement stmt = con.prepareStatement(sql)) { + int count = 0; + for (Address addr : addresses) { - stmt.setString(1, addr.ruteMandag); - stmt.setString(2, addr.korelisteMandag); - stmt.setString(3, addr.ruteTirsdag); - stmt.setString(4, addr.korelisteTirsdag); - stmt.setString(5, addr.ruteOnsdag); - stmt.setString(6, addr.korelisteOnsdag); - stmt.setString(7, addr.ruteTorsdag); - stmt.setString(8, addr.korelisteTorsdag); - stmt.setString(9, addr.ruteFredag); - stmt.setString(10, addr.korelisteFredag); - stmt.setString(11, addr.ruteLordag); - stmt.setString(12, addr.korelisteLordag); - stmt.setString(13, addr.ruteSondag); - stmt.setString(14, addr.korelisteSondag); - - stmt.setString(15, addr.distributor); - stmt.setInt(16, addr.dbkBane); - stmt.setInt(17, addr.id); + stmt.setInt(1, addr.id); + stmt.setString(2, addr.ruteMandag); + stmt.setString(3, addr.korelisteMandag); + stmt.setString(4, addr.ruteTirsdag); + stmt.setString(5, addr.korelisteTirsdag); + stmt.setString(6, addr.ruteOnsdag); + stmt.setString(7, addr.korelisteOnsdag); + stmt.setString(8, addr.ruteTorsdag); + stmt.setString(9, addr.korelisteTorsdag); + stmt.setString(10, addr.ruteFredag); + stmt.setString(11, addr.korelisteFredag); + stmt.setString(12, addr.ruteLordag); + stmt.setString(13, addr.korelisteLordag); + stmt.setString(14, addr.ruteSondag); + stmt.setString(15, addr.korelisteSondag); + stmt.setString(16, addr.distributor); + stmt.setInt(17, addr.dbkBane); + - stmt.execute(); - if (stmt.getUpdateCount() != 1) { - System.out.println("Error executing update"); - } + stmt.addBatch(); + count++; + if ( (count%200) == 0) { + stmt.executeBatch(); + + if ( (count%50000) == 0 ) { + logger.info("Update count " + count); + } + } } + + stmt.executeBatch(); //update remainding queries + } //con.commit(); } catch (SQLException e) { - System.out.println("Error updating addresses" + e.getMessage() ); + logger.warning("Error updating addresses", e ); + throw e; } } + /* private static String nullify(String str) { if (str == null) return null;