2016-12-17 1 views
0

j'ai écrit ci-dessous le programme pour y parvenir:La meilleure façon d'archiver (dans le fichier plat) puis purger les données énormes

  try { 
       PreparedStatement statement = connection.prepareStatement(
        "SELECT * FROM some_table some_timestamp<?)"); 
       statement.setTimestamp(1, new java.sql.Timestamp(dt.getTime())); 
       ResultSet resultSet = statement.executeQuery(); 

       CSVWriter csvWriter = new CSVWriter(new FileWriter(activeDirectory + "/archive_data" + timeStamp + ".csv"), ','); 
       csvWriter.writeAll(resultSet, true); 
       csvWriter.flush(); 

       } catch (Exception e) { 
       e.printStackTrace(); 
       } 


      // delete from table 
      try { 
       PreparedStatement statement = connection.prepareStatement(
         "DELETE FROM some_table some_timestamp<?)"); 
       statement.setTimestamp(1, new java.sql.Timestamp(dt.getTime())); 
       statement.executeUpdate(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 


     } 

     dbUtil.close(connection); 

programme ci-dessus serait tout simplement fonctionner correctement pour un scénario moyen, mais je voudrais savoir comment puis-je améliorer ce programme qui:

  1. fonctionne bien pour un million de disques sans surcharger le serveur d'application

  2. Considérant qu'il y aurait beaucoup de dossiers obtenir inséré dans la même table au moment où ce programme s'exécute, comment puis-je assurer ce programme d'archives, puis purge exactement les mêmes dossiers.

Mise à jour: Je suis à l'aide openscv http://opencsv.sourceforge.net/

+0

pourriez-vous ajouter le code CSVWriter? –

+0

Est-il raisonnable de supposer que les lignes nouvellement insérées auront un horodatage supérieur à la valeur limite que vous utilisez pour votre exportation/purge? Si oui, alors cet aspect de votre question est un non-problème. –

+0

@VladislavKysliy, j'ai ajouté la source pour l'opencsv. @ Gord Thomson, je vois de quoi tu parles. L'horodatage prendrait soin du point n ° 2. – JackSparrow

Répondre

0

Je voudrais suggérer plusieurs choses:

  1. éviter d'utiliser le temps comme point limite. Il peut être cause bogues imprévisibles. Le temps peut être différent dans différents endroits et environnement différent, donc nous devrions faire attention avec le temps. Au lieu de cela temps utiliser sequence
  2. Utilisez connection pool pour obtenir des données de base de données
  3. Enregistrer les informations de db dans des fichiers différents. Vous pouvez les stocker sur lecteurs différents. Après cela, vous devez concaténer des informations à partir d'eux.
  4. Utilisez memory mapped files. Utilisez le modèle multithread pour obtenir et stocker/restaurer les informations . Remarque: JDBC doens't prendre en charge plusieurs threads si la piscine est votre connexion aide

Et ces étapes sont seulement une partie de java. Vous devez avoir une bonne conception de votre côté DB. Pas facile, non? Mais c'est le prix pour l'utilisation de données volumineuses.