Spring AOP、MySQLマスタースレーブ構成は、読み取りと書き込みの分離を実現します。次に、次の操作を容易にするために遭遇した独自の構成プロセスと問題を記録します。友達を助けたいと思っています。
1.スプリングAOP傍受メカニズムを使用して、データソースの動的な選択を実現します。
java.lang.annotation.ElementTypeをインポートします。 java.lang.annotation.targetをインポートします。 java.lang.annotation.retentionをインポートします。 java.lang.annotation.retentionPolicyをインポートします。 /** *ランタイム *コンパイラはクラスファイルにコメントを記録し、VMは実行時にコメントを保持するため、反射的に読むことができます。 * @author yangguang * */ @retention(retentionpolicy.runtime)@target(elementtype.method)public @interface datasource {string value(); } 3. SpringのAbstractroutingDataSourceを使用して、複数のデータソースの問題を解決する
Import org.springframework.jdbc.datasource.lookup.abstractroutingdatasource; public class choodedatasourceは、abstractroutingdatasourceを拡張します{@override保護されたオブジェクトsecurreantlookupkey(){return handledatasource.getDatasource(); }} 4. threadlocalを使用して、スレッドの安全性の問題を解決します
public class 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. AOPを介してアクセスされ、Spring構成ファイルで構成されているデータソースファセットクラスを定義するため、AOPアノテーションは使用されません。
java.lang.reflt.methodをインポートします。 org.aspectj.lang.joinpointをインポートします。 org.aspectj.lang.annotation.aspectをインポートします。 import org.aspectj.lang.annotation.before; org.aspectj.lang.annotation.pointcutをインポートします。 org.aspectj.lang.reflt.methodsignatureをインポートします。 org.springframework.stereotype.componentをインポートします。 //@asepeent //@component public class datasourceaspect {//@pointcut( "execution(*com.apc.cms.service。*。*(..)")public void pointcut(){}; // @before(value = "pointcut()")public void before(joinpoint point){object target = point.getTarget(); system.out.println(target.toString()); string method = point.getSignature()。getName(); system.out.println(method); class <? class <? try {method m = classz [0] .getmethod(method、parametertypes); System.out.println(m.getName()); if(m!= null && m.isannotationpresent(datasource.class)){dataSource data = m.getAnnotation(dataSource.class); handledatasource.putdatasource(data.value()); }} catch(例外e){e.printstacktrace(); }}}6. ApplicationContext.xmlを構成します
<! - メインライブラリデータソース - > <bean id = "writedatasource" Destroy-method = "close"> <プロパティ名= "driverclass" value = "com.mysql.jdbc.driver"/> <プロパティ名= "jdbcurl" value = "jdbc:mysql://172.22.14.6:3306 name = "username" value = "root"/> <プロパティ名= "パスワード" value = "root"/> <プロパティ名= "partitioncount" value = "4"/> <プロパティname = "releasehelperthreads" value = "3"/> <プロパティname = "quackireincrement" value = "2"/> <プロパティ= <プロパティ= < name = "minconnectionsperpartition" value = "20"/> <プロパティ名= "idlemaxageinseconds" value = "60"/> <プロパティ名= "idleconnectiontestperiodinseconds" value = "60"/> <プロパティ名= "poolavailabilitythreshold" value = "5"/> Destroy-Method = "close"> <プロパティ名= "driverclass" value = "com.mysql.jdbc.driver"/> <プロパティ名= "jdbcurl" value = "jdbc://172.22.14.7:3306/cpp? value = "root"/> <プロパティ名= "partitionCount" value = "4"/> <プロパティ名= "Releasehelperthreads" value = "3"/> <プロパティname = "balue =" 2 "/> <プロパティ名=" maxconnectionSperpation "value =" 40 "/> <プロパティ=" MinContionSpertattition "/> <"/> < name = "idlemaxageinseconds" value = "60"/> <プロパティ名= "idleconnectionTestperioDinsconds" value = "60"/> <プロパティ名= "poolavailabilitythreshold" value = "5"/> </bean> <! < /bean> <! - annotation-loading-> <context:annotation-config /> <! - enaleコンポーネントスキャン(これがマッパースキャンを有効にしないことに注意してください!) - > <コンテキスト:コンポーネント-scanベースパッケージ= " <context:include-filter type = "annotation" expression = "org.springframework.steretype.component" /> < /context:component-scan> <context: "com.apc.cms.auth" /> <! <bean id = "sqlsessionfactory"> <プロパティ名= "dataSource" ref = "dataSource" /> <プロパティ名= "ittyealiasespackage" value "value =" com.apc.cms.model.domain " /> < /bean> <! - マッパーをスキャンして、それらを自動化します-> <bean> <bean> <bean> value = "com.apc.cms.persistence" /> <プロパティ名= "sqlsessionfactory" ref = "sqlsessionfactory" /> < /bean> <bean id = "dataSource"> <プロパティ名= "ターゲットダタソース" value-ref = "writedatasource"/> <! - read-> <entry key = "read" value-ref = "readdatasource"/> </map> </property name = "defaulttargetdatasource" ref = "writedasource"/>> </bean> <! proxy-target-class = "true"/> <! - Database Annotation aop-> <Bean id = "DataSourceaspect"/> <aop:config> <aop:aspect id = "c" ref = "dataSourceaspect"> <aop:pointcut id = "tx" "expression ="実行( pointcut-ref = "tx" method = "before"/> </aop:aspect> </aop:config> <! - configure database annotation aop->
7.アノテーションを使用してデータソースを動的に選択し、ライブラリを読み取り、ライブラリを書き込みます。
@datasource( "write")public void update(user user){usermapper.update(user); } @datasource( "read")公開文書getDocbyid(long id){return documentmapper.getByid(id); }テスト書き込み操作:アプリケーションを介してデータを変更し、メインライブラリデータを変更できます。スレーブライブラリのデータは同期的に更新されているため、定義された書き込み操作はすべてライブラリに記載されています。
テスト読み取り操作:スレーブデータベースデータをバックグラウンドで変更し、メインデータベースのデータが変更されていないことを確認し、アプリケーションページで更新し、スレーブデータベースのデータが読み取られていることを確認します。
遭遇した問題の要約:
質問1:プロジェクトはMavenプロジェクトであり、Spring AOPメカニズムが使用されます。スプリングのコアジャーパッケージに加えて、使用する必要があるjarパッケージは、aspectj.jar、aspectjweaver.jar、およびaopalliance.jarです。プロジェクトのPOMを確認し、依存関係パッケージが欠落していることを確認します。ローカルリポジトリにはこれらの瓶がないため、JARパッケージをダウンロードし、Mavenで構成し、自動的に更新できるMaven Central Libraryを探してください。
<Repository> <id> nexus </id> <name> nexus </name> <url> http://repository.sonatype.org/content/groups/public/ </url> <レイアウト>デフォルト</layout> </repository>
プロジェクトの構成に依存している瓶には、主にこれら2つが欠落しています。
<依存関係> groupId> aspectj </groupid> <artifactid> astifactid> aspectjrt </artifactid> <バージョン> 1.5.4 </version> </dependency> <deplagency> aspecidj </groupid> <artifactid> aspeatjweaver </artifactid> <バージョン> 1.5.4 </lt; lt;
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。