l'intégrité de la base de données mise en veille prolongée avec de multiples applications java

StackOverflow https://stackoverflow.com/questions/2817092

Question

Nous avons 2 java applications web à la fois sont en lecture / écriture et 3 java autonome lecture / applications d'écriture (une question de charges par e-mail, un processus d'un flux xml, on envoie email aux abonnés) tous hiberner utiliser et partager une base de code commune .

Le problème que nous avons récemment rencontré est que les questions chargées par email des questions parfois créées dans Ecraser l'une des applications Web. Remarque, ce sont des questions distinctes qui devraient avoir de id séparés. Nous avons pensé à l'origine que ce soit un problème de mise en cache. Nous avons essayé d'éteindre le cache de second niveau, mais cela ne fait pas de différence.

<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>

Question:

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

Nous utilisons MySQL btw.

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

Nous ne sommes pas ouvrir explicitement et des séances de clôture, mais veille prolongée plutôt les laisser gérer par Util.getSessionFactory().getCurrentSession().

Nous préférons ne pas installer un cache de niveau 2 en cluster à ce stade car cela crée une autre couche de complexité et nous sommes plus que satisfaits du niveau de performance que nous recevons de l'application dans son ensemble.

ne mettant en œuvre un modèle ouvert de session en vue dans les applications Web et de gérer manuellement les sessions dans les applications autonomes son comme il résoudre ce problème?

Ou d'autres suggestions / idées vous plaît?

Était-ce utile?

La solution 2

Il se trouve que ce problème n'a pas été lié à Hibernate du tout.

L'une des tables de base de données sur le serveur de mise en scène a été rempli avec les anciennes données qui auraient dû être nettoyées. Cela a d'abord donné l'impression d'être écrasé, mais une enquête plus approfondie de id prouvé le contraire!

Une fois que nous avons supprimé les données louches, tout allait bien.

Autres conseils

Étant donné que toutes les questions ont ids, alors je suppose que toutes les questions sont extraites de la base de données MySql.

En supposant que vous n'avez pas besoin de stocker les questions comme les objets transparents dans la mémoire, mais que vous sélectionnez toutes les questions pour chaque fois que vous les présentez, je une simple suggestion.

Remplacer le générateur d'identité avec une séquence dans la base de données. (Finalement, l'identifiant en tant que numéro automatique dans MySql). Ensuite, la base de données au lieu des applications garantit que chaque question obtient un identifiant unique.

Cette solution est assez simple et réduit votre complexité. Et il ne fonctionne que si vous persistez toutes les questions entrant des différentes sources dans votre base de données, puis de les sélectionner à partir d'ici.

Si cette solution vous donne des problèmes de performance, vous devriez enquêter davantage sur la façon dont votre travail de générateur identifiant Hibernate. Hibernate fournit plusieurs générateurs différents pour différents scénarios.

Hope cette aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top