package dk.daoas.fulddaekning; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.logging.Logger; public class Database { Logger logger = Logger.getLogger(Database.class.getName()); Connection conn; Connection writeConn; PreparedStatement saveStmt; public Database(Properties conf) throws SQLException,IOException { conn = getConnection(conf); writeConn = getConnection(conf); String sql = "INSERT INTO fulddaekning.afstand_anden_rute_thn (orgId,orgPostnr, orgAdresse,orgGadeid,orgHusnr,orgHusnrBogstav,orgLatitude,orgLongitude,orgRute,id,postnr,adresse,gadeid,husnr,husnrbogstav,latitude,longitude,rute,afstand,`timestamp`) "+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, now() )"; saveStmt = writeConn.prepareStatement(sql); } public void resetResultTable() throws SQLException { logger.info("Truncating result table"); String sql = "TRUNCATE TABLE fulddaekning.afstand_anden_rute_thn"; writeConn.createStatement().executeUpdate(sql); } public Connection getConnection(Properties conf) throws SQLException, IOException { String db_host = conf.getProperty("DB_HOST"); String db_user = conf.getProperty("DB_USER"); String db_pass = conf.getProperty("DB_PASS"); 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; } public BoundingBox getBoundingbox(int postnr) throws SQLException { String sql = "select max(latitude) latmax, min(latitude) latmin, max(longitude) lngmax,min(longitude) lngmin " + "from fulddaekning.adressetabel WHERE postnr=? and rute is null;"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, postnr); ResultSet res = stmt.executeQuery(); res.next(); //query returnerer altid 1 række BoundingBox bbox = new BoundingBox(); bbox.latitudeMax = res.getDouble("latmax"); bbox.latitudeMin = res.getDouble("latmin"); bbox.longitudeMax = res.getDouble("lngmax"); bbox.longitudeMin = res.getDouble("lngmin"); res.close(); stmt.close(); return bbox; } public Queue hentIkkedaekkedeAdresser(int postnr) throws SQLException { ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); String sql = "SELECT id,postnr,adresse,gadeid,husnr,husnrbogstav,latitude,longitude,rute FROM fulddaekning.adressetabel " + "WHERE rute IS NULL " + //Ingen dækning "AND postnr=? " + "AND latitude IS NOT NULL " + "AND longitude IS NOT NULL " + "AND gadeid IS NOT NULL "; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, postnr); queue.addAll( hentAdresseListe( stmt ) ); return queue; } public List hentPostnumre() throws SQLException { ArrayList list = new ArrayList(); String sql = "SELECT postnr FROM fulddaekning.adressetabel WHERE distributor = 'DAO' and rute is not null GROUP BY postnr ORDER by postnr"; PreparedStatement stmt = conn.prepareStatement(sql); ResultSet res = stmt.executeQuery(); while (res.next()) { int postnr = res.getInt("postnr"); list.add(postnr); } res.close(); stmt.close(); //list.add(8700); return list; } public ArrayList hentDaekkedeAdresser( BoundingBox bbox) throws SQLException { String sql = "SELECT id,postnr,adresse,gadeid,husnr,husnrbogstav,latitude,longitude,rute FROM fulddaekning.adressetabel " + "WHERE rute IS NOT NULL " + "AND latitude BETWEEN ? AND ? " + "AND longitude BETWEEN ? AND ? " + "AND distributor = 'DAO' "; // Forward only + concur_read_only + fetchsize tvinger driver til at hente en række af gangen (bedre performance ved store result sets) // Se http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html //PreparedStatement stmt = conn.prepareStatement(sql); PreparedStatement stmt = conn.prepareStatement(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE); stmt.setDouble(1, bbox.latitudeMin); stmt.setDouble(2, bbox.latitudeMax); stmt.setDouble(3, bbox.longitudeMin); stmt.setDouble(4, bbox.longitudeMax); return hentAdresseListe( stmt ); } public synchronized void gemResultat(Adresse orgAdresse, Adresse bedsteAdresse, double bedsteAfstand) throws SQLException { /*String sql = "INSERT INTO fulddaekning.afstand_anden_rute_thn (orgId,orgPostnr, orgAdresse,orgGadeid,orgHusnr,orgHusnrBogstav,orgLatitude,orgLongitude,orgRute,id,postnr,adresse,gadeid,husnr,husnrbogstav,latitude,longitude,rute,afstand,`timestamp`) "+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, now() )"; PreparedStatement saveStmt = conn.prepareStatement(sql);*/ saveStmt.setInt(1, orgAdresse.id); saveStmt.setInt(2, orgAdresse.postnr); saveStmt.setString(3, orgAdresse.adresse); saveStmt.setInt(4, orgAdresse.gadeid); saveStmt.setInt(5, orgAdresse.husnr); saveStmt.setString(6, orgAdresse.husnrbogstav); saveStmt.setDouble(7, orgAdresse.latitude); saveStmt.setDouble(8, orgAdresse.longitude); saveStmt.setString(9, orgAdresse.rute); saveStmt.setInt(10, bedsteAdresse.id); saveStmt.setInt(11, bedsteAdresse.postnr); saveStmt.setString(12, bedsteAdresse.adresse); saveStmt.setInt(13, bedsteAdresse.gadeid); saveStmt.setInt(14, bedsteAdresse.husnr); saveStmt.setString(15, bedsteAdresse.husnrbogstav); saveStmt.setDouble(16, bedsteAdresse.latitude); saveStmt.setDouble(17, bedsteAdresse.longitude); saveStmt.setString(18, bedsteAdresse.rute); saveStmt.setDouble(19, bedsteAfstand); saveStmt.executeUpdate(); saveStmt.clearParameters(); //saveStmt.close(); } protected ArrayList hentAdresseListe(PreparedStatement stmt) throws SQLException{ ArrayList list = new ArrayList( 30000 ); //logger.info("Starting query"); ResultSet res = stmt.executeQuery(); //logger.info("Starting exec query done"); while (res.next()) { Adresse adr = new Adresse(); adr.id = res.getInt("id"); adr.postnr = res.getInt("postnr"); adr.adresse = res.getString("adresse"); adr.gadeid = res.getInt("gadeid"); adr.husnr = res.getInt("husnr"); adr.husnrbogstav = res.getString("husnrbogstav"); adr.latitude = res.getDouble("latitude"); adr.longitude = res.getDouble("longitude"); adr.rute = res.getString("rute"); list.add(adr); //logger.info( "Adress:" + adr); } res.close(); stmt.close(); return list; } }