2016-12-06 3 views
0

J'utilise spring Jdbc pour l'opération Database avec postgres db.La méthode de mise à jour de spring jdbc ne valide pas la mise à jour car l'enregistrement retourne l'ancienne valeur

Je reçois une notification continue que je suis en train de traiter.

  1. nouvel appel de l'événement: j'insérer le nouvel enregistrement dans la base de données
  2. appel de l'événement Lost: mettre à jour l'appel dans le statut perdu DB pour le même enregistrement.
  3. Appel d'événement terminé: je mets à jour l'état terminé dans le DB pour le même enregistrement.

Au cours de l'étape 3 ci-dessus, je reçois le dossier de DB où j'attends appel perdu pour être vrai, mais je ne reçois pas la valeur mise à jour que je fais à l'étape 2.

Note: la les événements sont envoyés par le thread unique qui pousse les événements. Donc, tous les événements arrivent séquentiellement.

public void processEvent(EventData event){ 
    if(event.new){ 
     dao.add(entity) 
    }else if(event.ISLOST){ 
     entity = dao.getEventById(event.id); 
     entity.setLost(true); // setting isLost to true 
     dao.update(entity); 
    }else if(event.COMPLETED){ 
     entity = dao.getEventById(event.id); 
     logger.info("is Lost:"+ event.isLost()) // it returns false. Viz its set to true in stp2 
     dao.update(entity); //error as isLost is overwritten here. 
    } 

}

code DAO:

@Override 
public long registerEvent(final Event callEvent) { 
    KeyHolder keyHolder = new GeneratedKeyHolder(); 
    int row = getJdbcTemplate().update(new PreparedStatementCreator() { 
     @Override 
     public PreparedStatement createPreparedStatement(Connection connection) 
       throws SQLException { 
      PreparedStatement ps = connection.prepareStatement(QueryDefinitions.REGISTER_EVENT_QUERY,Statement.RETURN_GENERATED_KEYS); 
      ps.setLong(1,callEvent.getCategoryID()); 
      ps.setBoolean(2,callEvent.isLost()); 
      ps.setBoolean(3,callEvent.isCompleted()); 
      return ps; 
     } 
    },keyHolder); 
    long generatedRowId = (long)keyHolder.getKeys().get("callregisterid"); 
    return generatedRowId; 
} 

Autres observations:

  1. Quand je vérifie de Postgres administrateur au cours de la mise au point juste après dao mise à jour du dossier dans DB . Je vois que l'enregistrement est mis à jour correctement mais à l'étape 3 ce n'est pas reflété.

  2. À des fins de test. J'ai également mis un peu de retard après la mise à jour de l'enregistrement à l'étape 2 mais je reçois toujours isLost = false

  3. Le troisième événement arrive après quelques millisecondes du deuxième événement.

Pouvez-vous nous suggérer ce qui pourrait ne pas fonctionner ici?

Merci.

+0

Nous aurions besoin de savoir ce qu'est le code DAO, comment vous gérez les transactions, où ils sont démarrés et validés, si ces trois appels sont faits dans la même transaction ou non, etc. –

Répondre

-1

Parfois, vous ne validez pas lorsque vous insérez dans la base de données, ainsi votre sélection obtiendra les anciennes données, car la dernière transaction n'a pas été validée.