Este artículo presenta el método de configuración de usar JDBC de fragmentación para el arranque de primavera. Lo compartiré contigo. Los detalles son los siguientes:
ilustrar
Para excluir el dataSourCeautoconfiguration, de lo contrario, no se pueden configurar múltiples fuentes de datos
@Springbootapplication@enableAutOconfiguration (excluir = {dataSourCeautOconfiguration.class}) aplicación de clase pública {public static void main (string [] args) {springapplication.run (application.class, args); }} Las múltiples fuentes de datos configuradas se entregan a Sharding-JDBC para la administración, Sharding-JDBC crea una fuente de datos de fuente de datos para MyBatis use
Documento oficial: http://shardingjdbc.io/index_zh.html
paso
Configurar múltiples fuentes de datos, es mejor tener ciertas reglas para el nombre de la fuente de datos para facilitar la configuración de las reglas de cálculo para la base de datos.
@Bean(initMethod="init", destroyMethod="close", name="dataSource0")@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource0(){ return new DruidDataSource();}@Bean(initMethod="init", destroyMethod="close", name = "DataSource1")@ConfigurationProperties (prefix = "Spring.DataSource2") public dataSource dataSource1 () {return new DruidDataSource ();} Configure las reglas de origen de datos, es decir, entregar múltiples fuentes de datos a Sharding-JDBC para la administración, y puede establecer fuentes de datos predeterminadas. Cuando la tabla no tiene reglas de base de datos configuradas, se utilizarán las fuentes de datos predeterminadas.
@BeanPublic DataSourCerule DataSourCerule (@Qualifier ("DataSource0") DataSourceSource0, @Qualifier ("DataSource1") DataSource DataSource1) {Map <String, DataSource> DataSourCemap = New Hashmap <> ();; DataSourCeMap.put ("DataSource0", DataSource0); DataSourCeMap.put ("DataSource1", DataSource1); devolver nuevo DataSourCerule (DataSourCeMap, "DataSource0");} Configure las políticas de origen de datos y las políticas de tabla, e implemente políticas específicas usted mismo.
@Beanpublic ShardingRule shardingRule(DataSourceRule dataSourceRule){ //Table Policy TableRule orderTableRule = TableRule.builder("t_order") .actualTables(Arrays.asList("t_order_0", "t_order_1")) .tableShardingStrategy(new TableShardingStrategy("order_id", new ModulotableShardingAlgorithm ())) .dataSourcerule (DataSourCerule) .Build (); TABLERULE ORDERIMTABLERULE = Tablerule.Builder ("T_order_item") .ActualTables (arrays.aslist ("t_order_item_0", "t_order_item_1")) .tableShardingStrategy (nueva calbitShardingStrategy ("Order_id", New ModulotableSheshingAlgorithm ()))))))))))))))))))))) .dataSourcerule (DataSourcerule) .Build (); // Política de tabla vinculante, la estrategia principal de la tabla se utilizará para calcular la fuente de datos enrutada al consultar, de modo que las reglas de la tabla que acuerden vincular la política de la tabla deben ser consistentes, lo que puede mejorar la eficiencia en una cierta lista <bindingTablerule> bindingTablerules = new ArrayList <BindingTablerule> ();; BindingTablerules.Add (New BindingTablerule (Arrays.aslist (OrderTableerule, OrderItemtableerule))); return shardingrule.builder () .dataSourcerule (dataSourcerule) .tablerules (arrays.aslist (ordentableerule, ordenitemtableerule)) .bindingtablerules (BindingTablerule) .DataBaseshardingSatygy (new DacTaSeshardingStrategy ("User_id", New ModulOdatAtatEdingAldingAldingAldingAltingAltingAltingAl) .tableShardingStrategy (nuevo TableShardingStrategy ("Order_id", nuevo ModulotableShardingAlgorithm ())) .Build ();} Cree una fuente de datos de fuente de datos para fragmentar-jdbc, que mybatisautoconfiguration utilizará
@Bean ("DataSource") Public DataSource ShardingDataSource (Shardingrule Shardingrule) {return shardingdataSourceFactory.CreateDataSource (Shardingrule);} Necesita configurar manualmente el administrador de transacciones (la razón es desconocida)
// La transacción de configuración debe declararse manualmente @BeanPublic DataSourCetransactionManager TransActionItonManager (@Qualifier ("DataSource") DataSource DataSource) {return New DataSourCetransactionManager (DataSource);};} Implementación simple de la estrategia de partición de la biblioteca, interfaz: DatabashardingAlgorithm
import java.util.collection; import java.util.linkedhashset; import com.google.common.collect.range;/** * creado por fuwei.deng el 11 de mayo de 2017. */public classodatabashardingAlgorithm implementa un solokeyDatabasShardingAlgorithm <Along> {@Override public String doequalalsharding (colección <trabla> de demanda de databasenames, shardingvalue <larga> cada uno: dataBASEnames) {if (cada uno.endswith (shardingValue.getValue () % 2 + "")) {return cada uno; }} tirar nueva ilegalArgumentException (); } @Override Public Collection <String> doInSharding (Collection <String> DataBASEnames, ShardingValue <Long> ShardingValue) {colección <string> result = new LinkedHashset <> (dataBASEnames.size ()); para (Long Value: ShardingValue.getValues ()) {for (String TableName: DataBAsenames) {if (TableName.endswith (valor % 2 + "")) {result.add (TableName); }} Resultado de retorno; } @Override Public Collection <String> Dobetweensharding (Collection <String> DataBASEnames, ShardingValue <Long> ShardingValue) {Collection <String> Result = new LinkedHashset <> (databasenames.size ()); Range <Long> Range = (Range <Long>) ShardingValue.getValueRange (); para (long i = range.lowerEndPoint (); i <= range.upperEndPoint (); i ++) {for (string cada: dataBAsenames) {if (cada uno.endswith (i % 2+"")) {result.add (cada uno); }} Resultado de retorno; }} Implementación básica de la estrategia de subestenso de la tabla, interfaz: TableShardingAlgorithm
import java.util.collection; import java.util.linkedhashset; import com.dangdang.ddframe.rdb.sharding.api.shardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.singlekeytablingalgorithm; import com.google.common.collect.Range;/** * Created by fuwei.deng on May 11, 2017. */public class ModuloTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Long> { @Override public String doEqualSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) { for (String each : tableNames) {if (cada uno.endswith (shardingValue.getValue () % 2 + "")) {return cada uno; }} tirar nueva ilegalArgumentException (); } @Override Public Collection <String> doInSharding (Collection <String> TableNames, ShardingValue <Long> ShardingValue) {colección <string> result = new LinkedHashset <> (Tablenames.size ()); para (valor largo: shardingValue.getValues ()) {for (String TableName: Tablenames) {if (Tablename.endswith (valor % 2 + "")) {result.add (TableName); }}} Resultado de retorno; } @Override Public Collection <String> Dobetweensharding (colección <string> tableNames, ShardingValue <Long> ShardingValue) {colección <String> result = new LinkedHashset <> (Tablenames.size ()); Range <Long> Range = (Range <Long>) ShardingValue.getValueRange (); para (long i = range.lowerEndPoint (); i <= range.upperendPoint (); i ++) {for (string cada: tableNames) {if (cada uno.endswith (i % 2+"")) {result.add (cada uno); }} Resultado de retorno; }} En este punto, se ha implementado la función de dividir la base de datos y dividir la tabla
Leer y escribir separación
La separación de lectura y escritura requiere agregar una capa de creación de la fuente de datos maestro y esclavos antes de crear DataSourCerule
// Construir una fuente de datos de separación de lectura-escritura. La fuente de datos de separación de lectura-escritura implementa la interfaz DataSource, que puede procesarse directamente como una fuente de datos. // MasterDataSource0, SlavedataSource00, SlavedataSource01, etc. son fuentes de datos reales configuradas con DBCP y otros grupos de conexión. DataSource MastersLaveds0 = MastersLaveDataSourceFactory.CreateDataSource ("MS_0", MasterDataSource0, SlavedataSource00, SlavedataSource01); DataSource MastersLaveds1 = MastersLavedataSourceFactory.CreatedataSource ("MS_1", ",", ",", MasterDataTa1, SlaVedataSource11, slaVedataSource11); // crea un mapa de fuente de datos de subsumbres <String, DataSource> DataSoUrcEmap = new Hashmap <> (2); DataSourCeMap.put ("ms_0", MastersLaveds0); DataSourCemp. FragmentardataSourceFactory Al usar la biblioteca principal
Hintmanager Hintmanager = Hintmanager.getInstance (); Hintmanager.setMasterRouteonly (); // Continuar la operación JDBC
Enrutamiento forzado
Hintmanager Hintmanager = Hintmanager.getInstance (); Hintmanager.adddatabashardingValue ("T_order", "user_id", 1l); hintmanager.addtableShardingValue ("t_order", "Order_id",, orden.getOrderId ()); hintmanager.adddatabashardingvalue ("t_order_item", "user_id", 1l); hintmanager.addtablehardingvalue ("t_order_item", "order_id", order.getOrderId ());Actas
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.