java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.java
author František Kučera <franta-hg@frantovo.cz>
Sun, 15 Feb 2009 00:32:53 +0100
changeset 28 dbb434bd4b99
parent 23 b22c06c8a55c
child 32 3bc16e43872b
permissions -rw-r--r--
Generátor vytváří souhrny pro období od-do (včetně)
Funguje, ale kvůli překladům IP adres to trvá příliš dlouho.
Bude potřeba nejdříve vytvořit souhrn bez překladů (bude tam null)
a v dalším kole provést překlad IP adres → tím zkrátíme první databázovou transakci
a ušetříme přibližně třetinu času na překlady (pokud každá IP útočila třikrát)
nebo i více, pokud máme více cílů (je dost možné, že IP adresy útočníků budou stejné a nebudeme je muset překládat několikrát)
     1 package cz.frantovo.hrisniciSpameri.dao;
     2 
     3 import cz.frantovo.hrisniciSpameri.dto.Cil;
     4 import java.net.InetAddress;
     5 import java.sql.Connection;
     6 import java.sql.Date;
     7 import java.sql.PreparedStatement;
     8 import java.sql.ResultSet;
     9 import java.util.Collection;
    10 import java.util.logging.Level;
    11 
    12 /**
    13  *
    14  * @author fiki
    15  */
    16 public class GeneratorSouhrnuDAO extends HrisniciSuperDAO {
    17 
    18     private enum SQL {
    19 
    20         VLOZ_SOUHRN,
    21         SMAZ_SOUHRNY
    22     }
    23 
    24     /**
    25      * Vygeneruje souhrn pro daný cíl a datum a uloží ho do databáze
    26      * @param cil cíl, pro který generujeme souhrn
    27      * @param den den, pro který souhrn generujeme.
    28      */
    29     public void generujSouhrn(Cil cil, Date zacatek, Date konec) {
    30         Connection dbZdroj = getSpojeni(cil.getDatabaze());
    31         Connection dbSouhrn = getSpojeni(null);
    32 
    33         if (konec == null) {
    34             konec = zacatek;
    35         }
    36 
    37         if (dbZdroj == null || dbSouhrn == null) {
    38             /** TODO: Chyba spojení */
    39         } else {
    40             PreparedStatement ps = null;
    41             PreparedStatement psSmazat = null;
    42             ResultSet rs = null;
    43             try {
    44                 /** pokud už něco vygenerovaného pro daný den a cíl máme, smažeme to */
    45                 psSmazat = dbSouhrn.prepareStatement(getSQL(SQL.SMAZ_SOUHRNY));
    46                 psSmazat.setInt(1, cil.getId());
    47                 psSmazat.setDate(2, zacatek);
    48                 psSmazat.setDate(3, konec);
    49                 psSmazat.executeUpdate();
    50 
    51                 ps = dbZdroj.prepareStatement(cil.getSelekt());
    52                 ps.setDate(1, zacatek);
    53                 ps.setDate(2, konec);
    54                 rs = ps.executeQuery();
    55                 PreparedStatement psSouhrn = dbSouhrn.prepareStatement(getSQL(SQL.VLOZ_SOUHRN));
    56                 while (rs.next()) {
    57                     /**
    58                      * Souhrn bychom mohli vkládat pomocí SouhrnDAO,
    59                      * ale z výkonnostních důvodů to budeme dělat tady
    60                      * (jedno spojení a jeden předpřipravený příkaz).
    61                      */
    62                     psSouhrn.setDate(1, rs.getDate("den"));
    63                     psSouhrn.setString(2, rs.getString("ip"));
    64                     psSouhrn.setString(3, prelozIP(rs.getString("ip")));
    65                     psSouhrn.setInt(4, rs.getInt("pocet"));
    66                     psSouhrn.setInt(5, cil.getId());
    67                     psSouhrn.executeUpdate();
    68                 }
    69                 zavri(null, psSouhrn, null);
    70                 dbSouhrn.commit();
    71             } catch (Exception e) {
    72                 log.log(Level.SEVERE, "Chyba při generování souhrnu.", e);
    73             } finally {
    74                 zavri(dbZdroj, ps, rs);
    75                 zavri(dbSouhrn, psSmazat, null);
    76             }
    77         }
    78     }
    79 
    80     /**
    81      * Vygeneruje denní souhrny pro všechny cíle za dané období.
    82      * @param zacatek začátek období – včetně
    83      * @param konec konec období – včetně
    84      */
    85     public void generujSouhrny(Date zacatek, Date konec) {
    86         Collection<Cil> cile = new CilDAO().getCile();
    87         for (Cil c : cile) {
    88             generujSouhrn(c, zacatek, konec);
    89         }
    90     }
    91 
    92     /**
    93      * Přeloží IP adresu na doménu
    94      * @param ip IP adresa
    95      * @return doména
    96      */
    97     private static String prelozIP(String ip) {
    98         try {
    99             return InetAddress.getByName(ip).getHostName();
   100         } catch (Exception e) {
   101             return "Chyba: nepodařilo se přeložit.";
   102         }
   103     }
   104 }