Utilisation de StatelessSession pour le traitement par lots
Si nous avons un cas où nous avons besoin d'insérer 1000 000 lignes/objets:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Pourquoi nous devrions utiliser cette approche? Ce genre de prestation, il nous apporte de la comparaison de statelesssession n':
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.insert(customer);
}
tx.commit();
session.close();
Je veux dire, c' ("autres") dernier exemple n'utilise pas de mémoire, pas besoin de synchroniser, nettoyer le cache, puis-ce censé être la meilleure pratique pour les cas comme cela? Pourquoi utiliser précédente une alors?
source d'informationauteur ses
Vous devez vous connecter pour publier un commentaire.
À partir de la documentation vous lien:
Ceux qui sont certains de limitations significatives!
Si les objets que vous créez, ou bien les modifications que vous faites, sont de simples changements de champs scalaires de chaque objet, puis je pense qu'une session sans état aurait pas d'inconvénients par rapport à un groupées session normale. Cependant, dès que vous voulez faire quelque chose d'un peu plus complexe à manipuler une collection de valeur de la propriété d'un objet, ou un autre objet qui est en cascade à partir du premier, dire - puis la session sans état est plus un obstacle qu'une aide.
Plus généralement, si les lots session ordinaire donne la performance est assez bonne, alors la session sans état est tout simplement inutile complexité. Il ressemble vaguement comme la session ordinaire, mais il a une API différente et différentes de la sémantique, qui est le genre de chose qui invite les bugs.
Il peut certainement y avoir des cas où il est l'outil approprié, mais je pense qu'elles sont l'exception plutôt que la règle.
Stateless Session a un avantage par rapport à la Session en termes de performances, car stateless session ignorer la validation de transaction à la séance ou à la séance, rincer les méthodes utilisées dans l'objet Session. Cependant, il est important de noter que le service/DAO ne devrait PAS essayer d'effectuer une session de manipulation de données à la société mère ou n'importe quel objet enfant. Il va jeter l'exception. Aussi, assurez-vous de fermer la session explicitement sinon on va se retrouver avec une fuite de connexions.
Pour obtenir plus de performance avec Stateless session, si l'on est à l'aide de Printemps entraîné transaction, marquer le Printemps des transactions en lecture seule et définir la propagation nécessaire que JAMAIS.
Mais encore une fois, n'essayez pas ceci où l'on doit manipuler le modèle d'objet.
dans daoSupport
Statelesssession n'ne prend pas en charge le Traitement par Lot.
J'ai vu cela dans la documentation si je ne me trompe pas
Les caractéristiques et les comportements ne sont pas fournis par statelesssession n'
• un cache de premier niveau
• interaction avec une deuxième niveau ou de mise en cache de requêtes
• transactionnelle d'écriture automatique ou sale vérification
et le traitement par Lots qui se passe à l'aide de caches
Pardonnez-moi si je me trompe.