Domanda

Abbiamo 2 Java Web apps entrambi sono di lettura / scrittura e 3 standalone Java di lettura / applicazioni di scrittura (una carica domande via e-mail, uno dei processi un feed XML, uno invia email agli abbonati) tutti ibernazione uso e condividere una base di codice comune .

Il problema che abbiamo recentemente incontrato è che le domande caricati tramite e-mail domande a volte di sovrascrittura creati in una delle applicazioni web. Nota, queste sono questioni separate che dovrebbero avere di id separati. Inizialmente abbiamo pensato che questo sia un problema di cache. Abbiamo provato spegnendo la cache di secondo livello, ma questo non fa la differenza.

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

Domanda:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
    return this.id;
}

Stiamo usando MySQL btw.

CREATE TABLE  `question` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

non sono esplicitamente aprendo e chiudendo le sessioni, ma piuttosto lasciare che Hibernate loro riescono tramite Util.getSessionFactory().getCurrentSession().

preferiamo non messa a punto una cache di 2 ° livello di cluster in questa fase, questo crea un altro livello di complessità e siamo più che soddisfatti con il livello di prestazioni che otteniamo dalla app nel suo complesso.

Così fa l'attuazione di un open-session-in-view modello nelle applicazioni web e gestire manualmente le sessioni in standalone applicazioni suono come sarebbe risolvere questo problema?

O qualsiasi altri suggerimenti / idee per favore?

È stato utile?

Soluzione 2

Si scopre che questo problema non è dipesa da Hibernate a tutti.

Una delle tabelle di database sul server di gestione temporanea è stato riempito con i dati vecchi che avrebbe dovuto essere ripulito. Questo inizialmente ha dato l'apparenza di id di sovrascrittura, ma ulteriori indagini prova contraria!

Una volta che abbiamo rimosso i dati ingannevoli, tutto andava bene.

Altri suggerimenti

Dal momento che tutte le domande abbiano ID, quindi suppongo che tutte le domande vengono prelevati dal database MySql.

Supponendo che non è necessario per memorizzare le domande come oggetti trasparenti in memoria, ma di selezionare tutte le domande per ogni volta che li presente, ho una semplice suggestione.

Sostituire il generatore di ID con una sequenza nel database. (Alla fine il ID come autonumber in MySql). Poi il database invece delle applicazioni garantisce che ogni domanda riceve un ID univoco.

Questa soluzione è abbastanza semplice e riduce la complessità. E funziona solo se si persiste a tutte le domande in arrivo da diverse fonti nel database e quindi selezionare li da qui.

Se questa soluzione ti dà problemi di prestazioni, si dovrebbe indagare di più su come la vostra Hibernate lavoro generatore di id. Hibernate fornisce diversi generatori diversi per diversi scenari.

Spero che questo aiuto!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top