Spring AOP, конфигурация MySQL Master-Slave реализует разделение чтения и записи. Затем запишите свой собственный процесс конфигурации и проблемы, с которыми сталкиваются, чтобы облегчить следующую операцию. Я также надеюсь помочь некоторым друзьям.
1. Используйте механизм перехвата пружины, чтобы реализовать динамический выбор источников данных.
импортировать java.lang.annotation.elementtype; импортировать java.lang.annotation.target; Импорт java.lang.annotation.retention; импортировать java.lang.annotation.retentionpolicy; /** * Время выполнения * Компилятор будет записывать комментарии в файле класса, а виртуальная машина сохранит комментарии во время выполнения, поэтому его можно прочитать отражающе. * @author yangguang * */ @retention (armentpolicy.runtime) @target (elementtype.method) public @Interface DataSource {String Value (); } 3. Используйте Spring AbstractroutingDatasource для решения проблемы нескольких источников данных
Импорт org.springframework.jdbc.datasource.lookup.abstractroutingDataSource; Общедоступный класс welesataSource расширяет AbstractroutingDatasource {@Override защищенного объекта DegineCurrentLookupKey () {return handleDatasource.getDataSource (); }} 4. Используйте Threadlocal для решения проблем безопасности потока
Общедоступный класс handledatasource {public static final threadlocal <string> holder = new Threadlocal <string> (); public static void putdatasource (String DataSource) {holder.set (dataSource); } public Static String getDatasource () {return holder.get (); }}5. Определите класс Facet Data Facet, доступный через AOP, и настроен в файле конфигурации пружины, чтобы аннотация AOP не используется.
импортировать java.lang.reflect.method; Импорт org.aspectj.lang.joinpoint; Импорт org.aspectj.lang.annotation.aspept; Импорт org.aspectj.lang.annotation.fore; Импорт org.aspectj.lang.annotation.pointcut; Импорт org.aspectj.lang.reflect.methodsignature; Import org.springframework.stereotype.component; //@Ampoys //@Component Public Class DataSourCeaspect {//@pointcut ("execution (*com.apc.cms.service.*.*(..)") public void pointcut () {}; // @before (value = "pointcut ()") public void до (joinpoint point) {object target = point.getTarget (); System.out.println (target.toString ()); String method = point.getSignature (). GetName (); System.out.println (метод); Класс <?> [] Classz = target.getClass (). GetInterfaces (); Class <?> [] ParameterTypes = ((MethodingGust) point.getSignature ()) .getMethod (). GetParameterTypes (); try {method m = classz [0] .getMethod (метод, параметрический); 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. Configure ApplicationContext.xml
<!-Основной библиотечный источник данных-> <bean id = "writedataSource" dressome-method = "close"> <name = "driverclass" value = "com.mysql.jdbc.driver"/> <name = "jdbcurl" value = "jdbc: mysql: //172.22.14.6: 3306/cpp? name = "username" value = "root"/> <name = "password" value = "root"/> <name = "partitionCount" value = "4"/> <property name = "releaseHelperThreads" value = "3"/> <property name = "affireIncrement" value = "2"/> name = "maxConnectionsectionsection". name = "minconnectionsperpartition" value = "20"/> <property name = "idlemaxageinseconds" value = "60"/> <property name = "idleconnectionTesteRiodInseconds" value = "60"/> <name = "poolavailabilityThroshold" value = "5"/> </bean> <!-из библиотечных данных. Drester-method = "close"> <name = "griverclass" value = "com.mysql.jdbc.driver"/> <name = "jdbcurl" value = "jdbc: mysql: //172.22.14.7: 3306/cpp? autoreconnect = true"/> <property name = "username =" root "/root"/root "/root"/"/"/"/"/"/"/"/" "/"/"/" "/" "/"/""/"/" "/" "/" "/" "/". value = "root"/> <name = "partitionCount" value = "4"/> <name = "releasehelperthreads" value = "3"/> <name = "QuicireIncrement" value = "2"/> <name = "maxConnectionspartition" value = "40"/> name = "minConnectionSpertication". name = "idlemaxageinseconds" value = "60"/> <name = "idleconnectionTestPeriodInseconds" value = "60"/> <name = "poolavailabilityThrold" value = "5"/> </bean> <!-менеджер транзакций, управление транзакциями-> <beance id = "TransactionManger"> <name name = "datoScoor"/"datoScoor"/"DATOS Transcemanger"> "DatoScoor"/"DATOS"/"DATOS". < /bean> <!-Аннотационная загрузка-> <Контекст: аннотация-config /> <!-Сканирование компонентов Enale (остерегайтесь, что это не позволяет сканировать Mapper!)-> <Контекст: Component-Scan Base-package = "com.apc.cms.persistence.rdbms" /> <context-scan-scan-scan-package = "com.persistence.rdbms" /> <context: comprone-scan-scan-scan-scan-scan-scan-scan-scan-package. <Context: include filter type = "annotation" Expression = "org.springframework.steretype.component" /> < /context: component-scan> <Контекст: компонент-сканированный базовый package = "com.apc.cms.auth" /> <!-Разграничение транзакции с аннотациями-> <tx: annotation-wauth /> <! id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="com.apc.cms.model.domain" /> </bean> <!-- scan for mappers and let them be autowired --> <bean> <property name="basePackage" value="com.apc.cms.persistence" /> <name = "sqlSessionFactory" ref = "sqlSessionFactory"/> </bean> <bean id = "dataSource"> <name = "targetDataSources"> <map key-type = "java.lang.string"> <!-write-> <write key = "write ref =" writedAtasur value-ref = "readdatasource"/> </map> </property> <name = "defaultTargetDataSource" ref = "writedAtasource"/> </bean> <!-активируйте автоматическую функцию прокси-> <aop: AspectJ-autopproxy proxy-class = "true"/> <! id = "DataSourCeaspect"/> <aop: config> <aop: аспект id = "c" ref = "dataSourCeasepect"> <aop: pointcut id = "tx" Express = "выполнение (*com.apc.cms.service ..*.*(..))"/> <aop: перед pointcut-ref = "tx". <!-настроить аннотацию базы данных AOP->
7. Используйте аннотации, чтобы динамически выбирать источник данных, прочитать библиотеку и написать библиотеку соответственно.
@Datasource ("write") public void update (пользователь пользователя) {usermapper.update (user); } @Datasource ("read") public Document getDocbyId (Long Id) {return DocumentMapper.getByID (id); } Операция тестирования записи: вы можете изменить данные через приложение и изменить основные библиотечные данные. Вы обнаружите, что данные в библиотеке рабов были обновлены синхронно, поэтому все определенные операции записи написаны в библиотеке.
Операция чтения теста: изменить данные подчиненной базы данных в фоновом режиме, убедитесь, что данные в основной базе данных не были изменены, обновите на странице приложения и обнаружите, что данные в базе данных рабов прочитаны, что означает, что разделение чтения и записи в порядке.
Краткое изложение проблем столкнулась:
Вопрос 1: Проект - это проект Maven, и используется механизм Spring AOP. В дополнение к основным пакетам пружины, пакеты JAR, которые необходимо использовать, являются Aspistj.jar, AspistJweaver.jar и Aopalliance.jar. Проверьте POM в проекте и обнаружите, что пакет зависимости отсутствует. Поскольку локальный репозиторий не имеет этих банок, ищите Центральную библиотеку Maven, которая может обеспечить загрузку пакета JAR, настраивать его в Maven и автоматически обновлять:
<perpository> <id> nexus </id> <mame> nexus </name> <url> http://repository.sonatype.org/content/groups/public/ </url> <lapeout> по умолчанию </layout> </Repository>
Банки, которые зависят от настройки проекта, в основном отсутствуют эти два.
<depervice> <groupid> asmej </groupid> <artifactid> aspectJrt </artifactid> <serse> 1.5.4 </version> </depervice> <depervice> <groupid> AspectJ </GroupId> <artifactId> AspectJweaver </artifactid> <sersion> 1.5.4 </version> lt;/зависимость>
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.