Best Practice Integer-Zahlenfolge über mehrere Programmstarts

HarleyDavidson

Bekanntes Mitglied
Guten Morgen zusammen,
ich stehe vor der Aufgabe, eine Verarbeitungsapplikation zu schreiben,
die die erzeugte Datei mit einer eindeutigen Zahl versehen muss.
Ich benötige also eine Sequenz, deren letzten Stand auch nach Programmende persistent bleibt und beim nächsten Programmstart wieder abrufbar ist.
Auf der finalen Maschine habe ich leider keine Oracle zur Verfügung,
also muss ich die Sequenz (oder die letzte vergebene Zahl) irgendwo und irgendwie fest speichern.
Gibt es hier Best Practice - Ansätze?
Die letzte Zahl in einer Textdatei zu schreiben erscheint mir zu unsicher. Leider finde ich mit Google keine Lösung.

Ich freue mich über eure Vorschläge!
 
Manipulation kannst du durch einen Hash umgehen. Gegen Löschen kannst du sowiso nichts machen (ausser zumindest die Rechte entsprechend setzen das sie nur ein Root User löschen kann). Um sie vorm Löschen zu schützen must du sie schon übers Netz verschicken.
 
mit file.exists() kannst du überprüfen ob die Datei vorhanden ist, und sie im zweifelsfall mit file.createNewFile() anlegen 😉
 
Ich habe mich letztendlich für eine kleine SQLite Datenbank entschieden.
Mit dieser Lösung kann ich zusätzlich überprüfen, welche UID an welchem Tag verwendet wurde. Das ist performant und nimmt keinen Speicher durch zusätzliche Applikationen weg.

Hier mein Code:

Java:
package sqlite;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import main.Main;

public class SQLite_Util
{

    private static final String sql_insertNewValue = "insert into paketuid (datum) values (datetime('now', 'localtime'));";
    private static final String sql_getNewPaketUID = "select max(paketuid) from paketuid;";

    public static String getNewPaketUID()
    {
        String newPaketUID = "";
        Connection c = null;
        Statement stmt = null;
        try
        {
            Class.forName( "org.sqlite.JDBC" );
            c = DriverManager.getConnection( "jdbc:sqlite:paketuid.db" );

            //Neue UID generieren
            stmt = c.createStatement();
            stmt.executeUpdate( sql_insertNewValue );

            //Neuen Wert abholen
            ResultSet rs = stmt.executeQuery( sql_getNewPaketUID );
            if ( rs.next() )
            {
                newPaketUID = String.valueOf( rs.getInt( 1 ) );
            }
            else
            {
                throw new Exception( "Leeres Resultset beim Abrufen der neuen PaketUID" );
            }
        }
        catch ( Exception e )
        {
            Main.logger.error("Fehler beim Ermitteln der neuen PaketUID! " + e );
        }
        finally
        {
            try
            {
                if ( !stmt.isClosed() )
                {
                    stmt.close();
                }
                if ( !c.isClosed() )
                {
                    c.close();
                }
            }
            catch ( SQLException ex )
            {
                Main.logger.error( "Fehler beim Schliessen der Datenbank: " + ex );
            }

        }
        return newPaketUID;
    }
}
 

Zurück
Oben