この記事では、Spring BootにSharding JDBCを使用する構成方法を紹介します。私はあなたとそれを共有します。詳細は次のとおりです。
説明します
DataSourceAutoconfigurationを除外するには、それ以外の場合は複数のデータソースを構成できません
@springbootapplication@enableautoconfiguration(explude = {datasourceautoconfiguration.class})public class application {public static void main(string [] args){springapplication.run(application.class、args); }}構成された複数のデータソースが管理のためにSharding-JDBCに引き渡され、Sharding-JDBCはMyBatis使用のデータソースデータソースを作成します
公式文書:http://shardingjdbc.io/index_zh.html
ステップ
複数のデータソースを構成すると、データソースの名前の特定のルールを作成して、データベースの計算ルールの構成を促進することが最善です。
@bean(initmethod = "init"、destroymethod = "close"、name = "dataSource0")@configurationproperties(prefix = "spring.datasource")public datasource0(){return new Druiddatasource();}@bean(initmethod = "init"、destrymethod = "" name = "dataSource1")@configurationproperties(prefix = "spring.datasource2")public dataSource dataSource1(){return new DruiddataSource();}データソースルール、つまり、複数のデータソースを管理して管理のためにSharding-JDBCに配置し、デフォルトのデータソースを設定できます。テーブルにデータベースルールが構成されていない場合、デフォルトのデータソースが使用されます。
@BeanPublic DataSourule DataSourcerule(@Qualifier( "DataSource0")DataSource DataSource0、 @Qualifier( "DataSource1")DataSource DataSource1){Map <String、DataSource> DataSourceMap = new Hashmap <>(); DataSourcemap.put( "dataSource0"、dataSource0); DataSourcemap.put( "dataSource1"、dataSource1);新しいDataSourceruleを返します(dataSourceMap、 "dataSource0");}データソースポリシーとテーブルポリシーを構成し、特定のポリシーを自分で実装します。
@beanpublic shardingrule shardingrule(dataSourcerule dataSourcerule){// TableポリシーTableule OrderTableule = Tablerule.Builder( "T_ORDER").ACTUALTABLES(ARRAYS.ASLIST( "T_ORDE_0"、 "T_ORDER_1")).TABLESHARDINGSINGSTRAGEATY(NEW TABERSHARDINGSINGY(NEW TABERSHARDINGSING) modulotableshardingalgorithm())).datasourcerule(datasourcerule).build(); TableRule OrderItemTableule = TableRule.Builder( "T_ORDER_ITEM").ACTUALTABLES(ARRAYS.ASLIST( "T_ORDER_ITEM_0"、 "T_ORDER_ITEM_1")).TABLESHARDINGSTRATEY(NEW TABERSHARDINGSTRATEY( "ORDER_ID") .datasourcerule(datasourcerule).build(); //バインディングテーブルポリシー、メインテーブル戦略は、クエリ時にルーティングされたデータソースを計算するために使用されるため、テーブルポリシーをバインドすることに同意するテーブルのルールは一貫性がある必要があります。 BindingTableRes.Add(new BindingTablerule(arrays.Aslist(OrderTablerule、OrderItemTableRule))); return shardingrule.builder().datasourcerule(datasourcerule).tablerules(arrays.aslist(ordertablerule、orderitemtablerule)).bindingtablerule(bindingtablerule).databaseshardingstrategy(new databaseshardingstrategy(new databaseshardingstrategy( "user _id」 modulodatabaseshardingalgorithm())).TableShardingsTrategy(new TableShardingsTrategy( "Order_id"、new modulotableShardingalgorithm())).build();} Sharding-JDBCのデータソースDataSourceを作成します。
@Bean( "DataSource")Public DataSource ShardingDataSource(Shardingrule Shardingrule){return shardingdatasourcefactory.createdatasource(shardingrule);}トランザクションマネージャーを手動で構成する必要があります(理由は不明です)
//構成トランザクションは手動で宣言する必要があります@BeanPublic DataSourcetransactionManager TransactionItonManager(@Qualifier( "DataSource")DataSource DataSource){新しいDataSourcetransactionManager(dataSource);}ライブラリパーティション戦略の簡単な実装、インターフェイス:DatabaseShardingAlgorithm
java.util.collection; Import java.util.linkedhashset; import com.dangdang.ddframe.rdb.sharding.api.shardingValue; Import com.dangdang.ddframe.rdb.sharding.api.strategy.database.singlekeydatabaseshardingingorithm; com.google.common.collect.range;/** *は2017年5月11日にfuwei.dengによって作成されました。それぞれ:databasenames){if(exl.endswith(shardingValue.getValue()%2 + "")){return itile; }}新しいIllegalargumentException(); } @Override public Collection <string> doinsharding(collection <string> databasenames、shardingValue <long> shardingValue){collection <string> result = new linkedhashset <>(databasenames.size()); for(long value:shardingValue.getValues()){for(string tableName:databasenames){if(tableName.Endswith(value%2 + "")){result.add(tableName); }} return result; } @Override public collection <string> dobetweensharding(collection <string> databasenames、shardingvalue <long> shardingValue){collection <string> result = new linkedhashset <>(databasenames.size());範囲<long> range =(range <long>)shardingValue.getValuerange(); for(long i = range.lowerEndpoint(); i <= range.upperendpoint(); i ++){for(string eblity:databasenames){if(exhEndswith(i%2+"")){result.add(hile); }} return result; }}テーブルサブステージ戦略の基本的な実装、インターフェイス:TableShardingalgorithm
java.util.collection; Import java.util.linkedhashset; Import com.dangdang.ddframe.rdb.sharding.api.shardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.table. com.google.common.collect.range;/** * fuwei.dengが2017年5月11日に作成しました。 {if(fry.endswith(shardingValue.getValue()%2 + "")){return itile; }}新しいIllegalargumentException(); } @Override public Collection <string> doinsharding(collection <string> tablenames、shardingvalue <long> shardingValue){collection <string> result = new linkedhashset <>(tableNames.size()); for(long value:shardingValue.getValues()){for(string tableName:tableNames){if(tableName.Endswith(value%2 + "")){result.add(tableName); }}} return result; } @Override public Collection <string> dobetweensharding(collection <string> tablenames、shardingvalue <long> shardingValue){collection <string> result = new linkedhashset <>(tableNames.size());範囲<long> range =(range <long>)shardingValue.getValuerange(); for(long i = range.lowerEndpoint(); i <= range.upperendpoint(); i ++){for(string科目:tablenames){if(eld.Endswith(i%2+"")){result.add(hirl); }} return result; }}この時点で、データベースを分割してテーブルを分割する機能が実装されています
分離の読み取りと書き込み
DataSourceruleを作成する前に、分離を読むには、マスターとスレーブのデータソースの作成の層を追加する必要があります
//読み取りワイト分離データソースを作成します。読み取りワイト分離データソースは、データソースとして直接処理できるDataSourceインターフェイスを実装します。 // masterdatasource0、slavedatasource00、slavedatasource01などは、DBCPおよびその他の接続プールを使用して構成された実際のデータソースです。 DataSource MasterSlaveds0 = MasterSlavedataSourceFactory.CreateDataSource( "MS_0"、MasterDataSource0、SlavedataSource00、SlavedataSource01); DataSource MastersLaveds1 = MasterSlavedatasourceFactory.createdatasource SlavedataSource11、SlavedataSource11); //サブストアデータソースマップ<String、DataSource> dataSourcemap = new Hashmap <>(2); dataSourcemap.put( "MS_0"、MasterSlaveds0); ShardingDataSourceFactory
メインライブラリを使用する場合
hintmanager hintmanager = hintmanager.getInstance(); hintmanager.setmasterRouteonly(); // JDBC操作を続行します
強制ルーティング
hintmanager hintmanager = hintmanager.getInstance(); hintmanager.adddatabaseshardingvalue( "t_order"、 "user_id"、1l); hintmanager.addtableShardingValue( "t_order"、 "order_id"、 Order.getOrderId()); hintmanager.adddatabaseshardingValue( "t_order_item"、 "user_id"、1l); hintmanager.addtableShardingValue( "t_order_item"、 "order_id"、order.getordid();
トランザクション
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。