บทความนี้แนะนำวิธีการกำหนดค่าของการใช้ charding JDBC สำหรับการบูตฤดูใบไม้ผลิ ฉันจะแบ่งปันกับคุณ รายละเอียดมีดังนี้:
อธิบาย
เพื่อยกเว้น DataSourceAutoconFiguration มิฉะนั้นไม่สามารถกำหนดค่าแหล่งข้อมูลหลายแหล่ง
@springbootapplication@enableautoconfiguration (exclude = {dataSourceAutoconFiguration.class}) แอปพลิเคชันระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] 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 (คำนำหน้า = "spring.datasource") DataSource Public DataSource0 () {ส่งคืน druidDataSource () name = "dataSource1")@configurationProperties (prefix = "spring.datasource2") DataSource DataSource1 () {ส่งคืน druidDataSource ใหม่ ();} กำหนดค่ากฎแหล่งข้อมูลคือส่งมอบแหล่งข้อมูลหลายแหล่งให้กับ Sharding-JDBC สำหรับการจัดการและสามารถตั้งค่าแหล่งข้อมูลเริ่มต้น เมื่อตารางไม่มีการกำหนดค่ากฎฐานข้อมูลแหล่งข้อมูลเริ่มต้นจะถูกใช้
@BeanPublic DataSourCerule DataSourCerule (@qualifier ("DataSource0") DataSource DataSource0, @qualifier ("DataSource1") DataSource1) {แผนที่ <สตริง, dataSource DataSourceMap.put ("DataSource0", DataSource0); DataSourceMap.put ("DataSource1", DataSource1); ส่งคืน DataSourCerule ใหม่ (DataSourceMap, "DataSource0");} กำหนดค่านโยบายแหล่งข้อมูลและนโยบายตารางและใช้นโยบายเฉพาะด้วยตัวคุณเอง
@BeanPublic ShardingRule ShardingRule (DataSourCerule DataSourCerule) {// นโยบายตาราง tablerule OrderTableRule = tablerule.builder ("t_order") .ActualTables (array.aslist ("t_order_0" modulotableshardingalgorithm ())) .datasourcerule (DataSourcerule) .build (); tablerule orderItemTablerule = tablerule.builder ("t_order_item") .actualTables (array.aslist ("t_order_item_0", "t_order_item_1")) .tableshardingstrategy .DatasourCerule (DataSourCerule) .build (); // นโยบายตารางที่มีผลผูกพันกลยุทธ์ตารางหลักจะถูกใช้ในการคำนวณแหล่งข้อมูลที่กำหนดเส้นทางเมื่อสอบถามดังนั้นกฎของตารางที่ตกลงที่จะผูกนโยบายตารางจะต้องสอดคล้องกันซึ่งสามารถปรับปรุงประสิทธิภาพในรายการขอบเขตที่กำหนด bindingTableReruS.add (ใหม่ BindingTableRule (array.aslist (OrderTablerule, OrderItEmTableRule))); return ShardingRule.builder () .datasourcerule (DataSourcerule) .tablerules (array.aslist (OrderTablerule, OrderItEmTablerule)) .BindingTablerules (BindingTablerule) Modulodatabaseshardingalgorithm ())) .tableshardingStrategy (ใหม่ tableshardingsTrategy ("order_id", modulotableshardingalgorithm ใหม่ ()) .build ();};}; สร้างแหล่งข้อมูลแหล่งข้อมูลสำหรับ Sharding-JDBC ซึ่ง MyBatisautoconfiguration จะใช้
@Bean ("DataSource") Public DataSource ShardingDataSource (ShardingRule ShardingRule) {ส่งคืน ShardingDataSourceFactory.createdataSource (ShardingRule);} จำเป็นต้องกำหนดค่าตัวจัดการธุรกรรมด้วยตนเอง (ไม่ทราบเหตุผล)
// การทำธุรกรรมการกำหนดค่าจะต้องมีการประกาศด้วยตนเอง @BeanPublic DataSourceTransactionManager TransactionItonManager (@qualifier ("DataSource") DataSource DataSource) {ส่งคืน DataSourceTransactionManager (DataSource);}} การใช้กลยุทธ์การแบ่งพาร์ติชันไลบรารีอย่างง่ายอินเตอร์เฟส: DatabaseshardingAlgorithm
นำเข้า Java.util.Collection; นำเข้า Java.util.linkedhashset; นำเข้า com.dangdang.ddframe.rdb.sharding.api.shardingValue; นำเข้า com.dangdang.ddframe.rdb.sharding.api.strategy.database com.google.common.collect.Range;/** * สร้างโดย fuwei.deng เมื่อวันที่ 11 พฤษภาคม 2017. */คลาสสาธารณะ Modulodatabaseshardingalgorithm ใช้ singlekeydatabaseshardingalgorithm <long> {@override public String (สตริงแต่ละ: databasenames) {ถ้า (แต่ละรายการ endswith (shardingvalue.getValue () % 2 + "")) {ส่งคืนแต่ละ; }} โยน unlegalargumentException ใหม่ (); } @Override Public Collection <String> doinsharding (คอลเลกชัน <String> Databasenames, ShardingValue <lont> ShardingValue) {คอลเลกชัน <String> result = ใหม่ linkedHashSet <> (databasenames.size ()); สำหรับ (ค่ายาว: chardingValue.getValues ()) {สำหรับ (String tablename: databasenames) {ถ้า (tablename.endswith (value % 2 + "")) {result.add (tablename); }} ผลการส่งคืน; } @Override Public Collection <String> DobetWeenSharding (คอลเลกชัน <String> Databasenames, ShardingValue <long> ShardingValue) {คอลเลกชัน <String> ผลลัพธ์ = new LinkedHashSet <> (databasenames.size ()); ช่วง <long> range = (ช่วง <long>) ShardIngValue.getValuerange (); สำหรับ (long i = range.lowerEntPoint (); i <= range.upperendpoint (); i ++) {สำหรับ (สตริงแต่ละ: databasenames) {ถ้า (แต่ละครั้ง. endswith (i % 2+"")) {result.add (แต่ละ); }} ผลการส่งคืน; - การใช้งานขั้นพื้นฐานของกลยุทธ์ขั้นตอนย่อยตารางอินเทอร์เฟซ: TableShardingAlgorithm
นำเข้า java.util.Collection; นำเข้า Java.util.linkedhashset; นำเข้า com.dangdang.ddframe.rdb.sharding.api.shardingValue; นำเข้า com.dangdang.ddframe.rdb.sharding.api.strategy.table.singlekey com.google.common.collect.Range;/** * สร้างโดย fuwei.deng เมื่อวันที่ 11 พฤษภาคม 2017. */คลาสสาธารณะ modulotableshardingalgorithm ใช้ singlekeytableshardingalgorithm <long> {@override สตริงสาธารณะ Tablenames) {ถ้า (แต่ละรายการ endswith (shardingValue.getValue () % 2 + "")) {ส่งคืนแต่ละ; }} โยน unlegalargumentException ใหม่ (); } @Override Public Collection <string> doinsharding (คอลเลกชัน <String> Tablenames, ShardIngValue <lont> ShardingValue) {คอลเลกชัน <String> ผลลัพธ์ = ใหม่ linkedHashSet <> (tablenames.size ()); สำหรับ (ค่ายาว: ShardingValue.getValues ()) {สำหรับ (String tablename: tablenames) {ถ้า (tablename.endswith (value % 2 + "")) {result.add (tablename); }}} ผลการส่งคืน; } @Override Public Collection <String> DobetWeenSharding (คอลเลกชัน <String> Tablenames, ShardingValue <lont> ShardingValue) {คอลเลกชัน <String> ผลลัพธ์ = new LinkedHashSet <> (tablenames.size ()); ช่วง <long> range = (ช่วง <long>) ShardIngValue.getValuerange (); สำหรับ (long i = range.lowerEntPoint (); i <= range.upperendpoint (); i ++) {สำหรับ (สตริงแต่ละ: tablenames) {ถ้า (แต่ละรายการ endswith (i % 2+"")) {result.add (แต่ละ); }} ผลการส่งคืน; - ณ จุดนี้ฟังก์ชั่นของการหารฐานข้อมูลและการหารตารางได้ถูกนำไปใช้
อ่านและเขียนแยก
อ่านและเขียนการแยกต้องเพิ่มเลเยอร์ของการสร้างต้นแบบและการสร้างแหล่งข้อมูล Slave ก่อนที่จะสร้าง DataSourCerule
// สร้างแหล่งข้อมูลการแยกอ่าน-เขียน แหล่งข้อมูลการแยกอ่าน-เขียนใช้อินเทอร์เฟซ DataSource ซึ่งสามารถประมวลผลโดยตรงเป็นแหล่งข้อมูล // MasterDataSource0, SlavedataSource00, SlavedataSource01 เป็นต้นเป็นแหล่งข้อมูลจริงที่กำหนดค่าโดยใช้ DBCP และกลุ่มการเชื่อมต่ออื่น ๆ DataSource Masterslaveds0 = MasterslavedataSourceFactory.createdataSource ("MS_0", MasterDataSource0, SlavedataSource00, SlavedataSource01); DataSource Masterslaveds1 = MasterDataSourceFactory.cratouce slavedataSource11, slavedataSource11); // สร้างแผนที่แหล่งข้อมูลย่อยร้านค้า <สตริง, แหล่งข้อมูล> dataSourceMap = 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.getOrderId ());การทำธุรกรรม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น