Dans Ruby on Rails, comment puis-je conserver les objets en mémoire entre les sessions
Je suis en train de construire quelque chose (en fin de compte un bijou, mais pour l'instant une application) qui fonctionne comme suit.
Supposons, par exemple, la DB enregistrements sont des races de chien. Il y a un Chien classe parent et un enfant de la classe pour chaque race. La réelle races ne sont pas connus jusqu'à l'exécution.
Lorsque le serveur commence il va charger des enregistrements à partir de la DB et instancier des instances de classes basé sur les enregistrements, par exemple, j'ai peut-être deux beagles et le caniche. Quand quelqu'un vient sur le serveur qu'ils souhaitent accéder à l'un de ces chien instances.
Pourquoi ne pas simplement créer une instance à la volée? Dans mon cas, le "chiens" sont essentiellement des classes qui contiennent un algorithme et des données. L'algorithme ne change pas, les données changent rarement (de l'ordre de jours), mais l'exécution de l'algorithme lui-même, qui utilise à la fois des données et la dynamique de données passées comme un timestamp, sera consulté à plusieurs reprises un deuxième.
Il serait ridicule d'avoir à recréer une instance de l'objet et de charger les données à chaque fois juste pour faire une demande seulement de le faire à nouveau sur la prochaine demande (la demande ne modifie pas l'état de l'objet). Je serais la création et la destruction de plusieurs objets une seconde quand je pourrais réutiliser le même objet.
il n'est pas judicieux de le garder dans la session, car quelqu'un qui veut un caniche ne devriez pas besoin d'avoir les beagles les informations dans sa session d'objet; c'est hors de propos (et n'est pas à l'échelle).
Comment dois-je persister ces objets en mémoire? En gros, je veux un tableau de recherche pour tenir les instances. En Java, je voudrais créer un singleton avec un certain type de table de hachage ou d'un tableau qui se trouve dans la mémoire. Dans les rails, j'ai essayé en créant une classe singleton dans le dossier lib. Je pense-j'ai peut-être pas la compréhension de ce droit; que l'instance (le fait que c'est un singleton est discutable) est en train d'être perdu lors de la session disparaît.
Le plus proche de la réponse que j'ai trouvé était http://www.ruby-forum.com/topic/129372 qui, fondamentalement, met tout dans des champs de la classe et les méthodes. De toute façon qui ne semble pas juste.
TIA!
Ajout: je viens de Java. En Java que je venais de créer un objet qui se trouve sur le tas ou peut-être dans une arborescence JNDI et que les requêtes HTTP sont venus dans ils seraient manipulés par un servlet ou EJB ou certains par-requête élément qui pourrait alors accéder à l'objet persistant. Je n'arrive pas à trouver l'équivalent dans les rails.
source d'informationauteur hershey | 2010-07-28
Vous devez vous connecter pour publier un commentaire.
Peut-être que votre exemple est confus dans sa simplicité. Je suppose que vos objets sont assez compliqués et que votre analyse comparative montre que leur construction est déraisonnable de faire à chaque demande.
Dans le mode de production, les classes ne sont pas déchargées entre les demandes, mais les instances de ces classes. Donc, en utilisant les membres de la classe d'une classe de sons comme la voie à suivre pour moi. Simplement l'utiliser pour stocker vos instances.
Je n'aurais pas trop de soucis sur le chargement et jetant des objets, sauf si vous pouvez venir avec un indice de référence qui prouve que c'est une question. Chaque requête crée une quantité extraordinaire d'objets intermédiaires comme une question de cours, et ceux-ci sont généralement créés et détruits en l'espace de plusieurs millisecondes.
Il est généralement préférable de se concentrer sur le chargement seulement ce qui est nécessaire, de normaliser votre base de données de pousser des données fréquemment consultées ou les méthodes dans un emplacement idéal, ou la sauvegarde des résultats des calculs complexes dans un champ cache.
De référence tout d'abord, optimiser uniquement lorsque nécessaire.
D'économie d'instances de modèles à une classe de cache peut fonctionner, mais c'est seulement une option dans un environnement de production où les classes du modèle ne sont pas rechargés à chaque requête. Il peut également vous exposer à des erreurs causées par des données périmées.
Si vous avez un problème de montée en charge qui ne peut être résolu avec ces méthodes, vous pourriez vouloir étudier la construction d'une persistante serveur pour une partie de votre fonctionnalité en utilisant une combinaison de Rack et EventMachine. Il y a un certain nombre de façons de construire un processus d'arrière-plan qui peut effectuer des calculs complexes à l'aide d'un pré-chargement des données, mais l'approche spécifique dépendra de plusieurs facteurs tels que le type de données que vous utilisez et la façon dont il est d'ailleurs souvent consulté.
Dans la production, les contrôleurs et les classes du modèle ne sont pas rechargées entre les demandes, de sorte que vous disposez de plusieurs options:
Oui, les cours peuvent être empêchés de déchargement, le mode de Développement, trop. Ce n'est pas seulement un mode de Production de la chose. Mais il arrive par défaut dans le mode de Production, où vous devez définir manuellement le mode de Développement.
Afin de ne pas avoir de vos classes rechargé sur chaque demande, même en mode de développement, vous pouvez les déplacer à l'extérieur de l'autochargement des chemins d'accès (si vous utilisez les valeurs par défaut en dehors de l'app et lib). De cette façon, vous pouvez avoir ces classes d'objets persistent entre les demandes, et donc de les utiliser pour stocker des données qui est la même pour chaque demande.