2012-09-14 1 views
0

Je n'arrive pas à saisir certaines des caractéristiques des techniques de mise en mémoire cache/prévention des accès aux bases de données de NHibernates.Réception de données périmées de NHibernate lors du passage à un service Web

J'ai créé un test qui est censé assurer que notre API de service Web crée correctement et enregistre un nouvel objet. Le cas de test se passe correctement lorsque je n'ai pas besoin de sérialiser via le service Web (par exemple, en travaillant directement avec la classe de service Web au lieu de l'ajouter en tant que référence de service et de monter/descendre). Cependant, je reçois des données obsolètes de NHibernate lorsque j'exécute mon test sur le service Web hébergé.

[Test] 
public void CreateInstallTask() 
{ 
    int numberOfTasks = TaskDao.GetAll().Count(); 

    TaskDto taskDto = WorkflowServices.CreateInstallTask(OrderID, TaskTemplateID, SiteID, DataCenterID, 
                  DeviceTemplateID, DeviceName, Username); 

    if (TaskDao.GetAll().Count() == numberOfTasks) 
    { 
     string failureReason = 
      string.Format("Failed to create new Install task with OrderID: {0}", taskDto.OrderID); 

     throw new Exception(failureReason); 
    } 
} 

[WebMethod(Description = "Creates a new install Task.")] 
public TaskDto CreateInstallTask(int orderID, int taskTemplateID, int siteID, int dataCenterID, 
    int deviceTemplateID, string deviceName, string username) 
{ 
    try 
    { 
     Order order = OrderDao.GetByID(orderID, shouldLock: false); 

     if (order == null) 
      throw new Exception(string.Format("Failed to find an order with ID {0}", orderID)); 

     Task task = new Task 
      { 
       Order = order, 
       TaskType = TaskType.Install, 
       TaskTemplateID = taskTemplateID, 
       CreateUserID = username, 
       CreateDateTime = DateTime.Now 
      }; 

     TaskAction taskAction = new TaskAction(TaskDao, TaskDeviceDao, ActivityDao, task, username); 
     //Call TaskDto.Create to convert Task into TaskDto for client-side use. 
     return TaskDto.Create(taskAction.CreateTask()); 
    } 
    catch (Exception exception) 
    { 
     Logger.Error(exception); 
     throw; 
    } 
} 

La méthode GetAll() est simplement un critère.List() pour toutes les lignes d'une table. La méthode CreateTask appelle simplement ISession.SaveOrUpdate();

Je comprends que j'ai la capacité de forcer les données rechargeant, mais je ne comprends pas pourquoi je devrais le faire.

Quand j'appelle saveOrUpdate (entité), cette entité doit être automatiquement ajouté au cache de NHibernate, non? Pourquoi TaskDao.GetAll() retournerait-il des données périmées?

Je m'inquiète de l'utilisation excessive de CommitTransaction(). Je ne pense pas que je devrais appeler CommitTransaction() après chaque SaveOrUpdate() - qui va à l'encontre de la mise en cache de NHibernates. Mais, je ne veux pas non plus de données obsolètes pour mes cas de test. Comment puis-je garder mon cache en synchronisation?

Répondre

2

Vous avez raison dans ce que vous ne devriez pas engager votre transaction après chaque sauvegarde, mais votre service Web devrait créer une nouvelle transaction au début de l'appel Web et engageant à la fin de l'appel Web. Les services Web suivent généralement la même session par modèle de requête que les sites Web suivent généralement; assurez-vous que votre infrastructure de service Web crée à la fois une nouvelle session NHibernate ISession et une nouvelle transaction à chaque demande. À la fin de cette demande, il devrait être engagé toute modification effectuée.

+0

Merci. C'est essentiellement ce que je pensais, mais je voulais que quelqu'un d'autre confirme cette pensée pour moi. :) –

Questions connexes