2010-01-25 9 views
8

Abbiamo in sviluppo la tua app per Java standard e molti dei record che stiamo creando (entità di Hibernate in MySQL) hanno timestamp 'creati' e 'modificati' su di essi.Con una data/ora, è meglio avere il DB gestirlo o l'applicazione?

Ora, io e uno degli sviluppatori non siamo d'accordo - credo che entrambi i campi dovrebbero avere un valore predefinito MySQL di CURRENT_TIMESTAMP, e quindi la modifica può essere modificata dall'app. Vuole sia gestito dall'app.

C'è una ragione convincente per entrambe le decisioni? Non riesco a capire perché vorresti aggiungere passaggi più espliciti al codice, a meno che tu non sia preoccupato per i tuoi server (db, applicazione) che hanno timestamp incoerenti.

risposta

7
  • utilizzare DB data/ora se è possibile sacrificare la portabilità. Inoltre, se molto piccole differenze sarebbero importanti per l'applicazione e si avrà più di un server applicazioni/un cluster, è possibile avere problemi con la sincronizzazione dei nodi.
  • utilizzare l'applicazione per generare i timestamp nel caso in cui non sia sicuro che il DB prescelto rimanga, oppure se si utilizzano più database, ad esempio MySQL per la produzione, HSQLDB per i test di unità.

Se nessuno di questi argomenti si applicano, utilizzare quello che è più facile per voi (o quello che più gli sviluppatori di votare per)

Se si va per la gestione delle applicazioni, andare per il suggerimento di Pascal Thivent con @PreUpdate , o il vostro campo impostato con un valore predefinito, come:

private Calendar date = Calendar.getInstance(); 
+0

+1 ma puoi approfondire come questo è importante per il cluster. –

+0

Non riesco ancora a ottenere le informazioni sul cluster. Con o senza cache di secondo livello, perché dovresti vedere cose diverse su nodi diversi. Se si dispone di qualcosa di specifico, si prega di chiarire perché questo non mi sembra vero: il clustering dell'applicazione non ti obbliga a utilizzare il timestamp db in alcun modo. –

+0

beh, puoi impostarlo esattamente allo stesso modo ovunque, ma è un overhead + le opzioni di ora legale e fuso orario + la necessità di impostarlo di nuovo su ogni nuovo nodo. Per essere onesti, ho solo avuto un'esperienza molto specifica con questo scenario che non si applica al caso comune e stiamo utilizzando un server di timestamp. – Bozho

3

Ha senso allocare tutti i timestamp nello stesso livello per coerenza.

Questo answer a una domanda correlata fornisce un bell'esempio di come farlo in Hibernate.

3

vorrei gestire questo dal codice e utilizzare Hibernate/dell'APP @PrePersist e @PreUpdate callback:

@PreUpdate 
@PrePersist 
public void setTimeStamps() { 
    modified = new Date(); 
    if (created==null) { 
     created = new Date(); 
    } 
} 

Motivo principale: portabilità (ad es. questo funzionerà con un altro database, ad esempio in un contesto di test, senza alcuna magia di database, senza DEFAULT, senza trigger, niente).

0

Vorrei utilizzare i trigger e le procedure di archiviazione per mantenere questi campi. Quindi metti la logica nel DB.

Problemi correlati