上一節我們是手動配置數據源的,直接在java代碼里寫數據庫的東西,這操作我個人是不喜歡的。我覺得這些東西就應該出現在application.yml文件中。
還有,萬一我們的項目在使用之后,突然需要改變分庫分表規則了。我們還要去停服更新。這里有人要說了,你改application.yml文件,你也要停服更新吶!
當然,如果我們的項目不是分布式的,就一單體項目,我們停服更新下也很快的,沒多大影響!但是我們如果都用到分庫分表了,那通常來說,這個項目基本是分布式系統,就是說我們用了springCloud微服務框架。而微服務框架是可以在不停服的情況下更新application.yml文件的。(Spring Cloud Config,這是微服務框架統一管理配置的組件,以后我會在我的springcloud模塊下面說,當然目前博客園上一定有很多人發布過了這篇,想了解的大家看看咯!)
我們新建一個springboot工程
artifactId設為sharding-jdbc-autoConfiguration.目錄結構
大家可以看到,目錄結構和上一節手動配置一樣一樣的,就是把config目錄下面的三個java文件刪掉了。我們說說其他不同的。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itmuch.boot</groupId> <artifactId>sharding-jdbc-autoConfiguration</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>sharding-jdbc-autoConfiguration</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <spring_boot.version>1.5.9.RELEASE</spring_boot.version> <sharding.jdbc.version>3.0.0.M1</sharding.jdbc.version> <druid.version>1.1.3</druid.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- sharding jdbc --> <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding.jdbc.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 這個需要為 true 熱部署才有效 --> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> </dependencies> <!-- 引入spring boot的依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring_boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 添加spring-boot的maven插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
這里主要是這個依賴:
<dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding.jdbc.version}</version> </dependency>
你看你看,這是個starter唉,說明,springboot都幫我們配置好了。這個版本一定要選擇3.0.0.M1,選3.0.0會報錯。啟動時找不到數據源。
我們這次就用阿里的druid數據庫連接池吧。
application.yml
server: port: 9900 spring: application: name: shard-jdbc-starter sharding: jdbc: datasource: names: ds0,ds1,ds2 ds0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/user_0 username: root password: root ds1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/user_1 username: root password: root ds2: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/user_2 username: root password: root config: sharding: props: sql.show: true tables: user_info: key-generator-column-name: user_id actual-data-nodes: ds$->{0..2}.user_info_$->{0..1} database-strategy: inline: sharding-column: user_id algorithm-expression: ds$->{user_id % 3} table-strategy: inline: sharding-column: user_id algorithm-expression: user_info_$->{user_id % 2}
這個文件里所有內容,除了我配置了下端口,指定應用別名,其他所有東西都和我們上面提到的刪掉的三個java類做的事情一樣一樣的。
定義三個數據庫,指定分庫分表的目標數據表,分庫算法,分表算法,一目了然。
Application.java
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
自動配置了,那當然得刪掉@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })注解了呀!
其他
其他所有的類和xml文件都不變。
測試
啟動application.java類,記得先清空一下數據庫。訪問localhost:9900/insert/1
插入100條數據,看數據庫六張表,是不是和前面一樣。哦了嘛!
大家覺得那種方式好?我是一定會選自動配置的。
代碼下載地址:https://gitee.com/fengyuduke/my_open_resources/blob/master/sharding-jdbc-autoConfiguration.rar