Après avoir lu, je vous garantis que vous comprenez pourquoi beaucoup de gens ne veulent pas utiliser la mise en veille prolongée?

page de navigation blog personnel (cliquez sur le droit lien pour ouvrir un blog personnel): Daniel vous prenez sur la pile de technologie 

A, mise en veille prolongée avantage

de sorte que vous n'écrivez pas mise en veille prolongée sql, qui ne peut que rendre votre application plus portable à d'autres bases de données, mais la chose principale est de laisser le concentré de programmeur plus sur la logique métier, les relations de données, comme objet-relationnel. mise en veille prolongée pour de nombreuses relations pour parvenir est très bonne. Il est essentiel qu'il soutient paresseux, vous pouvez rendre vos données sont chargées uniquement en cas de besoin, que les sons parfaits. mise en veille prolongée il y a un plus de bétail est HQL, il est tout à fait possible de requête mis en correspondance avec votre OO modèle langage de requête, et mybatis cartographie, ou plus pratique et plus puissant qu'eux.

1, Qu'est-ce que @ annotations sont paresseux?

notes @Lazy qui identifie si le haricot paresseux, le code source est la suivante:

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
    /**
     * Whether lazy initialization should occur.
     */
    boolean value() default true;
}

Un seul paramètre, la valeur par défaut est vrai, c'est-à-dire tant que l'ajout de ce commentaire est retardé le chargement.

2, @ Lazy comment utiliser les annotations

Non annotée avant de commencer le conteneur principal instanciera haricot, comme suit:

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);

Créer une instance utilisateur

Et en plus @Lazy commentaire, vous devez charger uniquement la première fois que l'appel suivant:

@Scope
@Lazy
@Bean(value="user0",name="user0",initMethod="initUser",destroyMethod="destroyUser")
public User getUser(){
    System.out.println("创建user实例");
    return new User("张三",26);
}
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
User bean2 = applicationContext2.getBean(User.class);
创建user实例
实例1 === User [userName=张三, age=26]

@Lazy Annotation Annotation fonction principale est de réduire le vaisseau springIOC temps de chargement a commencé

Deux, faiblesses mise en veille prolongée

Après avoir lu l'avantage, la sensation veille prolongée toute-puissante, et comment invincible solitaire Oui. Traitement de grandes quantités de données ou de services à grande concurrence du réseau se sentent pas très bon, donc commence maintenant à parler de problèmes mise en veille prolongée.

1, difficile à utiliser certaines des caractéristiques de la base de données

mise en veille prolongée et développeur de bases de données isolées, les développeurs ne nécessitent pas l'attention ou la base de données Oracle est MySQL, mise en veille prolongée instruction SQL pour vous aider à générer des requêtes, mais la question est, si vous voulez utiliser une sorte de fonctionnalités spécifiques de base de données, ou une demande de renseignements la pleine conformité sql avec votre esprit, ce qui est difficile. Si vous utilisez mise en veille prolongée, mais il peut être personnalisé pour certains programmes génèrent des requêtes, mais tout du sentiment de bottes gratter, et vous les développer un salaire plus élevé. À l'appui de la mise en veille prolongée sql natif, ou tout à fait parfait, ce sql natif peut retourner entité non gérée, ne vont pas mise en veille prolongée cache, l'optimisation est d'obtenir, mais si l'ensemble du projet sont si forte, et qui était avec mybatis il.

Dans de nombreux cas, nous avons une demande: pour obtenir l'heure actuelle du serveur de base de données. En effet , le temps de la machine et l' heure du serveur il y a une différence. Diverses bases de données offrent une fonction pour obtenir, par exemple, MySQL, vous pouvez utiliser « maintenant sélectionner () ». Mise en veille prolongée aussi une current_timestamp de fonction (horodatage parlant, pense personnellement que l'horodatage pauvres de la base de données de le faire, en fait, et datetime est un ordre de grandeur (précision), qui peut être utilisé pour indiquer comment un vrai ah timbre!). Cependant, vous ne pouvez pas utiliser directement l'heure actuelle « select current_timestamp () » pour obtenir le serveur, vous devez également ajouter une requête de table! Par exemple, "select (current_timestamp) de tbl_Good ". Personnel très déprimé, je veux juste utiliser cette fonction simple, pourquoi dois - je savoir dans la table de base de données? ? ? ? On doit également établir une cartographie. . . . . .

Je ne comprends pas que ce monde est trop compliqué. Chaque type de produit sont désespérément compliqué, en fait, ils ont vraiment ignoré l'utilisateur moyen ne nécessite qu'une petite partie. La fonction par défaut devrait être en mesure de répondre aux besoins communs des utilisateurs ordinaires, et est considéré comme un bon produit. Je ne pense pas mise en veille prolongée fait.

2, ne peut pas répondre aux exigences du programme pour le cache

De nombreux services Web, le cache de la dépendance est très grande, mise en veille prolongée intégré dans le cache est censé être très puissant, mais ne peut toujours pas répondre à beaucoup de besoins.

3, de haute couplage

En effet, mise en veille prolongée développement du projet lorsque vous enregistrez beaucoup de temps, mais l'ampleur de ce modèle logique métier et le modèle de base de données dépendent les uns des autres trop. Rien problème à court terme, mais avec l'évolution du projet, qui changera, lorsqu'il est couplé seulement pour maintenir cette relation, vous constaterez que votre code est particulièrement vulnérable, il suffit de changer un schéma de base de données, l'ensemble du projet peut avoir à changer java des dizaines de fois. Et maintenant mybatis la cartographie automatique est aussi bien fait, en cours d'élaboration n'a pas fallu longtemps, et d'autres projets à un stade avancé, vous avez besoin beaucoup de personnalisation et d'optimisation des requêtes lorsque mybatis l'efficacité du développement encore plus apparents.

4, le débogage difficile

En tant que programmeur back-end, j'aime chaque ligne de code, je sais que ce faisant exactement à la fin. Dans le code d'accès de base de données particulière, les goulots d'étranglement du système est souvent le résultat dans ces endroits, chaque ligne ne peut pas être sous-estimée. J'ai lu une version antérieure d'une partie mise en veille prolongée du code, que je pensais beaucoup de complexe et puissant. En effet, beaucoup d'endroits Hibernate ne peut puissante ligne de code pour résoudre beaucoup de problèmes, mais par exemple, une mise à jour () ou save () à la fin a fait quoi, où se hiberner à la fois logique, mais aussi la logique de votre application, si cette ligne avait question, comment voulez-vous le faire? Personnellement, je pense que cela est difficile à faire, et non comme des frais pour commencer quelque chose, cette utilisation mybatis.

En tant que programmeur, je l'ai toujours insisté sur le fait que le code plus facile à changer que de changer le fichier de configuration.

5 Mise en veille prolongée, mise à jour de grandes quantités de données

(1) Mise en veille prolongée mise à jour batch tous les enregistrements champ d'âge est supérieur à zéro table clients:

Transaction transaction = session.beginTransaction();     
Iterator customers=session.find("from Customer c where c.age>0").iterator();     
while(customers.hasNext()){     
    Customer customer=(Customer)customers.next();     
    customer.setAge(customer.getAge()+1);     
}      
transaction.commit();     
session.close();  

Si la table des clients a dix mille enregistrements de plus de zéro, la session de la découverte méthode () va soudainement dix mille objets client chargés en mémoire. Lors de l'exécution de la méthode tx.commit (), il effacera le cache, mise en veille prolongée clients pour effectuer la mise à jour de présentation de la table de mise à jour dix mille:

update CUSTOMERS set AGE=? …. where ID=i;     

(2) Le lot ci-dessus met à jour en mode veille prolongée a deux inconvénients

  • Prenez beaucoup d'espace mémoire, il faut mettre dix mille objets de clients chargés dans la mémoire d'abord, puis 11 à les mettre à jour.
  • Trop de nombre de déclarations de mise à jour exécutées, chaque instruction de mise à jour ne peut mettre à jour un objet client, vous devez mettre à jour dix mille 10000 objet client par la déclaration de mise à jour, un accès fréquent à la base de données, il permettra de réduire considérablement les performances de l'application.

(3) Afin de libérer rapidement les 10 000 ont occupé la mémoire objet client peut être mis à jour après chaque objet client, il appelle la méthode evict session () pour libérer immédiatement sa mémoire:

Transaction transaction = session.beginTransaction();     
Iterator customers=session.find("from Customer c where c.age>0").iterator();     
while(customers.hasNext()){     
    Customer customer=(Customer)customers.next();     
    customer.setAge(customer.getAge()+1);     
    session.flush();     
    session.evict(customer);     
}      
transaction.commit();     
session.close();  

Après la procédure ci-dessus, de modifier la propriété de l'âge d'un procédé permet à hiberner immédiatement en fonction du changement d'état de la mise à jour de synchronisation d'objet client la base de données objet client, appeler immédiatement le procédé de rinçage () Session et méthode evict (), flush (), ainsi immédiatement la mise en œuvre des déclarations pertinentes mise à jour (); méthode evict () pour cet objet client est purgé du cache, la libération rapide de sa mémoire occupée.

Mais evict méthode () ne peut améliorer légèrement les performances des opérations en vrac, car avec ou sans la méthode, Hibernate doit effectuer 10000 déclaration de mise à jour evict d'utilisation () pour mettre à jour l'objet 10000 client, ce qui est une influence importante des performances de fonctionnement en vrac facteur. Si Hibernate peut directement exécuter l'instruction SQL suivante:

update CUSTOMERS set AGEAGE=AGE+1 where AGE>0;   

Donc, plus d'une mise à jour des déclarations de peuvent mettre à jour la table CLIENTS 10.000 dossiers. Cependant, Hibernate ne fournit pas d'interface directe pour effectuer cette déclaration de mise à jour. Les demandes doivent être contournés API Hibernate, directement pour exécuter les instructions SQL via l'API JDBC:

Transaction transaction = session.beginTransaction();     
Connection con=session.connection();     
PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGEAGE=AGE+1 where AGE>0 ");     
stmt.executeUpdate();     
transaction.commit();  

La procédure ci - dessus montre contournée API Hibernate, processus d'accès de base de données directement via l'API JDBC. Applications par la méthode de connexion de session () pour obtenir l'utilisation de la connexion de base de données de session, puis créer des objets PreparedStatement à travers elle et exécuter des instructions SQL. Il convient de noter que l'application est toujours de déclarer les affaires aux limites d'interface par la transaction Hibernate. 
Si la base de données sous - jacente (comme Oracle) de support des procédures stockées, peut également être effectuée par la mise à jour par lots Hibernate procédure stockée. Procédures stockées exécuter directement dans la base de données, la vitesse est plus accélérée. Peut - on définir dans une procédure stockée de base de données Oracle appelé le code batchUpdateCustomer () est la suivante:

create or replace procedure batchUpdateCustomer(p_age in number) as     
begin     
update CUSTOMERS set AGEAGE=AGE+1 where AGE>p_age;     
end;  

Au-dessus de la procédure stockée a un paramètre p_age, au nom de l'âge du client, l'application peut appeler la procédure stockée de la manière suivante:

Transaction transaction = session.beginTransaction();     
Connection con=session.connection();     
String procedure = "{call batchUpdateCustomer(?) }";     
CallableStatement cstmt = con.prepareCall(procedure);     
cstmt.setInt(1,0); //把年龄参数设为0     
cstmt.executeUpdate();     
transaction.commit();  

Vu de ce qui précède, la demande doit également être contournée API Hibernate, directement via l'API JDBC appeler la procédure stockée. 

6, mise en veille prolongée de suppression de grandes quantités de données

Diverses formes de surcharge session de mise à jour des méthodes () sont mises à jour une fois une cible et quelques surcharges méthode delete () permet déclaration HQL comme paramètre, par exemple:

session.delete("from Customer c where c.age>0");  

Si la table CLIENTS a 10.000 dossiers de plus de zéro, le code ci-dessus peut être supprimé dix mille dossiers. Mais la méthode de suppression () de session n'exécute pas l'instruction de suppression suivante

delete from CUSTOMERS where AGE>0;  

méthode delete () de session à l'objet 10000 client est chargé en mémoire par l'instruction select suivante:

select * from CUSTOMERS where AGE>0;  

La déclaration suivante est exécutée dix mille suppression, par suppression d'un objet client:

delete from CUSTOMERS where ID=i;     
delete from CUSTOMERS where ID=j;     
delete from CUSTOMERS where ID=k;  

Cela peut être vu par l'effectuer une mise à jour batch API Hibernate et Hibernate Hibernate directement par la suppression en vrac n'est pas recommandé. La mise en œuvre des instructions SQL pertinentes ou des appels de procédure stockée directement via l'API JDBC, est la meilleure façon de mise en veille prolongée des mises à jour de traitement par lots et supprimer lot.

Su parlez peu chaud printemps JdbcTemplate

Troisièmement, les yeux perçants des masses, ne pas gardes et la ligne

 

Quatrièmement, un certain nombre d'idées après avoir été pulvérisé

Un sentiment qui a dénoncé l'Assemblée générale, je me sens profondément ignorants de la frustration, je veux juste apprendre, je l'espère quelques années plus tard, je ne peux pas changer le début du cœur.

En tant que programmeur junior, il n'y a pas besoin de passer trop de temps pour prouver la technologie inutile, je ne l'ai pas hiverne cadre d'une étude approfondie, mais quelques idées personnelles niveau superficiel.

Cadre lui-même ne dit pas bon ou mauvais, ne convient pas, tout cadre a ses propres capacités, mise en veille prolongée encapsule beaucoup API utile pour nous, ce qui réduit la difficulté et la complexité de l'opération de la base de données, tout en réduisant le code du modèle nombre, mais laissé en veille prolongée à développeur de parent espace opérationnel mybatis beaucoup moins, mybatis utilisation de cadre plus souple, les développeurs peuvent personnaliser la requête, mais augmente la quantité de code de modèle, ne semble pas mise en veille prolongée frontière. Deux cadres dans les deux indicateurs font des compromis et des compromis pratiques et souples, qui ne peut être dit être mauvais cadre. Pour un cadre a besoin d'avoir leurs propres domaines de la vision de mise au point et la conception, vous ne pouvez pas tout de couverture, tout comme le grand frère a dit:

Utilisez tout type de cadre technique, nous devons adapter à la réalité des besoins de l'entreprise, ainsi que leurs capacités technologiques. Lorsque vous n'allez pas comprendre en profondeur de besoins techniques ou d'affaires ne tient pas le cadre actuel, ne critiquez pas aveuglément la qualité du cadre.

Attaché Java / C / C ++ / apprentissage machine / algorithmes et structures de données / front-end / Android / Python / programmeur de lecture / Livres Livres simples Daquan:

(Cliquez sur le droit d'ouvrir là - bas dans le blog personnel sec): sec technique Floraison
===== >> ① [Java Daniel vous prendre sur la route à avancé] << ====
===== >> ② [+ acm algorithme structure de données Daniel vous prendre sur la route à avancé] << ===
===== >> ③ [base de données Daniel vous prendre sur la route à avancé] << == ===
===== >> ④ [Daniel Web front-end pour vous emmener sur la route à avancé] << ====
===== >> ⑤ [ la machine python d'apprentissage et Daniel vous prenez l' entrée à la route avancée] << ====
===== >> ⑥ [architecte Daniel vous prendre sur la route à avancé] << =====
===== >> ⑦ [C ++ Daniel avance pour vous emmener sur la route] << ====
===== >> ⑧ [ios Daniel vous prendre sur la route à avancé] << ====
=====> > ⑨ [sécurité Web Daniel vous prendre sur la route à avancé] << =====
===== >> ⑩ [système d'exploitation Linux et Daniel vous prenez la route à avancé] << = ====

Il n'y a pas de fruits non acquises, espérons que vous jeunes amis, les amis veulent apprendre les techniques, surmonter tous les obstacles sur le chemin de la route déterminée à lier dans la technologie, de comprendre le livre, puis frapper sur le code, comprendre le principe, et aller pratique, sera il vous apportera la vie, votre travail, votre avenir un rêve.

Publié 47 articles originaux · louanges gagnées 0 · Vues 264

Je suppose que tu aimes

Origine blog.csdn.net/weixin_41663412/article/details/104898869
conseillé
Classement