Spring AOP, la configuration MySQL Master-Slave réalise la séparation de lecture et d'écriture. Ensuite, enregistrez votre propre processus de configuration et vos problèmes rencontrés pour faciliter la prochaine opération. J'espère aussi aider certains amis.
1. Utilisez le mécanisme d'interception Spring AOP pour réaliser la sélection dynamique des sources de données.
import java.lang.annotation.elementType; import java.lang.annotation.target; import java.lang.annotation.retention; Importer java.lang.annotation.retentionPolicy; / ** * Runtime * Le compilateur enregistrera les commentaires dans le fichier de classe, et la machine virtuelle conservera les commentaires au moment de l'exécution, il peut donc être lu de manière réfléchie. * @author yangGuang * * / @retention (retentionPolicy.runtime) @target (elementType.Method) public @Interface DataSource {String Value (); } 3. Utilisez l'abstractroutingdatasource de Spring pour résoudre le problème de plusieurs sources de données
import org.springframework.jdbc.datasource.lookup.abstractroutingDataSource; La classe publique ChoosedataSource étend AbstractroutingDataSource {@Override Protected Object DeterMectionCurrentLookUpKey () {return mandedataSource.getDataSource (); }} 4. Utilisez des problèmes de filetage pour résoudre les problèmes de sécurité des filetages
classe publique managedataSource {public static final threadLocal <string> holder = new ThreadLocal <string> (); public static void putDataSource (String dataSource) {Holder.set (dataSource); } String statique public getDataSource () {return holder.get (); }}5. Définissez une classe de facettes de source de données, accessible via AOP, et est configurée dans le fichier de configuration de Spring, donc aucune annotation AOP n'est utilisée.
import java.lang.reflect.method; import org.aspectj.lang.joinpoint; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.before; import org.aspectj.lang.annotation.pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.sterereotype.Component; // @ Aspect // @ CLASS PUBLICAUX DE COMPONENT DATASORCEAFEPT {// @ Pointcut ("EXECUTION (* com.apc.cms.service. *. * (..))") public void Pointcut () {}; // @Before (value = "Pointcut ()") public void avant (point joinpoint) {objet Target = Point.getTarget (); System.out.println (Target.ToString ()); String méthode = point.getSignature (). GetName (); System.out.println (méthode); Class <?> [] Classz = cible.getClass (). GetInterfaces (); Class <?> [] ParameterTypes = ((Methodsignature) Point.getSignature ()) .getMethod (). GetParAmEterTypes (); try {Method m = classz [0] .getMethod (méthode, parameterTypes); System.out.println (m.getName ()); if (m! = null && m.isannotationPresent (dataSource.class)) {dataSource data = m.getAnnotation (dataSource.class); HandledataSource.putDataSource (data.value ()); }} catch (exception e) {e.printStackTrace (); }}}6. Configurer ApplicationContext.xml
<! - Source de données de la bibliothèque principale -> <bean id = "wredataSource" destrie-méthod = "close"> <propriété name = "driverclass" value = "com.mysql.jdbc.driver" /> <propriété name = "jdbcurl" value = "jdbc: mysql: //172.22.14.6: 3306 / cpp? name = "username" value = "root" /> <propriété name = "mot de passe" value = "root" /> <propriété name = "partitionCount" value = "4" /> <propriété name = "releaseHelperThreads" value = "3" /> <propriété name = "acquireIncrement" value = "2" /> <propriété name = "maxconnectionPartition" name = "MinConnectionsPerPartition" value = "20" /> <propriété name = "idleMaxageInseConds" value = "60" /> <propriété name = "idleConnectionTestPeriodInsecds" value = "60" /> <! destroy-Method = "close"> <propriété name = "driverclass" value = "com.mysql.jdbc.driver" /> <propriété name = "jdbcurl" value = "jdbc: mysql: //172.22.14.7: 3306 / cp? value = "root" /> <propriété name = "partitionCount" value = "4" /> <propriété name = "releaseHelperThreads" value = "3" /> <propriété name = "acquireIncrement" value = "2" /> <propriété name = "maxconnectionperPartion" value = "40" /> <propriété name = "minconnectionPartion" value = "20" /> <propriété Name = "MinConnectionPartition" name = "idleMaxageInseConds" value = "60" /> <propriété name = "idleConnectionTestPeriodInseConds" value = "60" /> <propriété name = "PoolAvailableTholdold" value = "5" /> </ bean Annotation-loading--> <context:annotation-config /> <!--enale component scanning (beware that this does not enable mapper scanning!)--> <context:component-scan base-package="com.apc.cms.persistence.rdbms" /> <context:component-scan base-package="com.apc.cms.service"> <context:include-filter type = "annotation" expression = "org.springframework.steretype.component" /> </ context: composant-scan> <context: composant-scan base-package = "com.apc.cms.auth" /> <! - Activer la démite des transactions avec les annotations -> <tx: annotation-drive /> <! - Définir le sqlSessionfactory -> <! id = "sqlSessionFactory"> <propriété name = "dataSource" ref = "dataSource" /> <propriété name = "tyciasespackage" value = "com.apc.cms.model.domain" /> </ bean> <! - scan pour les mappers et les laisser être autowired -> <anfet name = "basApackage" value = "com.ap.cms.pers.père />" Basepackage "Value =" com.apc. <propriété name = "sqlSessionFactory" ref = "SqlSessionFactory" /> </Eb> <bean id = "DataSource"> <propriété Name = "TargetDatasources"> <Map Key-Type = "Java.lang.string"> <! - WRITE -> <Entreny Key = "Write" Read-ref = "writeatasource" /> <! Value-ref = "ReadDataSource" /> </ Map> </ Property> <propriété name = "DefaultTargetDataSource" Ref = "wretedataSource" /> </Eban> <! - Activez la fonction de proxy automatique-> <aop: AspectJ-Autopproxy proxy-target-class = "True" /> <! id = "dataSourCeaSpect" /> <aop: config> <aop: aspect id = "c" ref = "dataSourCeaspect"> <aop: Pointcut id = "tx" expression = "EXECUTION (* com.apc.cms.service .. *. * (..))" /> <aop: avant PointCut-ref = "tx" method = "avant" /> </ aop: </ aOpt: Configy: "TX" Method = "avant" /> <! - Configurer l'annotation de la base de données AOP ->
7. Utilisez des annotations pour sélectionner dynamiquement la source de données, et lisez la bibliothèque et écrivez respectivement la bibliothèque.
@DataSource ("Write") public void Update (utilisateur utilisateur) {userMapper.update (utilisateur); } @Datasource ("read") Document public getDocById (Long ID) {return documentMapper.getByid (id); } Opération d'écriture de test: vous pouvez modifier les données via l'application et modifier les données de bibliothèque principales. Vous constaterez que les données de la bibliothèque d'esclaves ont été mises à jour de manière synchrone, de sorte que les opérations d'écriture définies sont toutes écrites dans la bibliothèque.
Opération de lecture de test: modifiez les données de la base de données des esclaves en arrière-plan, vérifiez que les données de la base de données principale n'ont pas été modifiées, actualisent la page de l'application et constatez que les données de la base de données des esclaves sont lues, ce qui signifie que la séparation de lecture et d'écriture est correcte.
Résumé des problèmes rencontrés:
Question 1: Le projet est un projet Maven et le mécanisme Spring AOP est utilisé. En plus des forfaits JAR de base du printemps, les forfaits JAR qui doivent être utilisés sont Aspectj.jar, AspectJwweaver.jar et Aopalliance.jar. Vérifiez le POM dans le projet et constatez que le package de dépendance est manquant. Étant donné que le référentiel local n'a pas ces bocaux, recherchez la bibliothèque Maven Central qui peut fournir le téléchargement du package JAR, le configurer dans Maven et mettre à jour automatiquement:
<Fepository> <id> nexus </ id> <name> nexus </name> <url> http://repository.sonatype.org/content/groups/public/ </url> <onquet> default </ Layout> </ Repository>
Les pots qui dépendent de la configuration du projet manquent principalement de ces deux.
<dependency> <proupId> Aspectj </proupId> <ArtifActid> AspectJrt </RetifActid> <Dersion> 1.5.4 </DERNIFRIENT> </DENDENCENCE> <Dependance> <ProupId> Aspectj </prouverid> <efacactid> AspectJweaver </Artifactid> <in version> 1.5.4 </ version> lt; / Dependency>
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.