`

java拆分表和拆分库

阅读更多
前言:

在互联网技术开发中 ,大多数都是基于数据库的开发,而随着应用维护的历史,数据量越来越大,

以及业务变得更加复杂,要求更高的响应时间,和更高的计算能力,单台服务器,单表单库的方式存在着比较大的瓶颈。通过加机器,提升硬件的方式成本越来越高。

随着数据量和访问量的增长,业内已经有各种方式的解决方案,对数据进行水平和垂直方面的切分。

根据以往分库分表的一些经验,特意写了这套框架,实现对分库分表的透明性,降低开发难度和复杂 度,提高对分库分表的监控调试和方便维护。

分库分表方面上最主要关注的是如何切分,根据哪些字段进行切分的,这个需要具体的业务使用场景进行分析。

根据以往使用的经验来看:

1. 按照哈希的方式

优点:数据散列比较平均,单库单表访问压力分布比较均匀

缺点:预先需要做好容量规划,扩容方面不容易,需要重新进行数据hash迁移

适用场景:数据变更频繁,并发访问量比较高的情况下,可以利用多台机器将访问压力均匀分布,合理利用资源

2. 按时间段或者按ID段进行划分

优点:可以持续扩容,降低单表压力

缺点:有时候业务数据上,存在着一部分的旧数据,但是这部分数据很少使用到,基于这样的分库分表的方式,不能充分的利用好系统资源。

使用场景:数据归档或者备份,或者数据不存在短期内国企的情况下的场景。

更多的请大家补充................

以上的功能,这套框架都能够很好的支持,

一套基于数据库分库分表的解决方案,当前版本仅支持mybatis,设计上往后可以支持Jdbc方面的扩展,开发的目的是方便在日常开发中对分库分表透明,使用上管理方便,简化开发难度。

目前具有的分库分表功能包括:

1.分库分表路由(目前完成水平切分功能,后续提供垂直切分支持)

2.读写分离

3.跨库跨表事务支持(特殊场景下可以使用,尽量避免使用)

4.查询结果合并

5.分库表直接查询

后续会支持以下功能:

1.对多个库读写的负载均衡

2.failover

3.提供垂直切分功能

4.流量统计功能

5.性能监控功能

6.配置集成管理功能

7.数据复制同步

......

与Spring集成:
<bean id="sqlSessionFactory"
                class="com.opensource.mybatis.spring.ShardingSqlSessionFactoryBean">
                <property name="typeAliasesPackage" value="com.opensource.mybatis.sharding" />
                <property name="dataSource" ref="dataSource1" />
                <property name="plugins" ref="plugins" />
                <property name="shardingConfigLocation" value="classpath*:sharding.xml" />
        </bean>


        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
                <property name="basePackage" value="com.opensource.mybatis.sharding" />
        </bean>
分库分表配置
<?xml version="1.0" encoding="UTF-8"?>
<configurations>
        <datasource id="springconfig" ref="springdatasource-config" />
        <generator id="customGenerator" class="com.test.CustomGenerator" />
        <datasource id="parent" abstract="true">
                <url>jdbc:mysql://localhost:3306/sharding?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>
                <username>root</username>
                <password>root</password>
                <minIdle>5</minIdle>
                <maxIdle>5</maxIdle>
                <initialSize>5</initialSize>
                <maxWait>30000</maxWait>
                <maxActive>128</maxActive>
                <testOnBorrow>true</testOnBorrow>
                <testWhileIdle>true</testWhileIdle>
                <validationQuery>select 1</validationQuery>
                <driverClassName>com.mysql.jdbc.Driver</driverClassName>
        </datasource>
        <datasource id="master1" parent="parent">
                <url>jdbc:mysql://localhost:3306/sharding?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>          
        </datasource>
        <datasource id="slave1" parent="parent">
                <url>jdbc:mysql://localhost:3306/sharding?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>
        </datasource>
        <datasource id="master2" parent="parent">
                <url>jdbc:mysql://localhost:3306/sharding2?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>
        </datasource>
        <datasource id="slave2" parent="parent">
                <url>jdbc:mysql://localhost:3306/sharding?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>
        </datasource>
        <datasource id="master3" parent="parent">
                <url>jdbc:mysql://localhost:3306/sharding?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>
        </datasource>
        <datasource id="slave3" parent="parent">
                <url>jdbc:mysql://localhost:3306/sharding?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>
        </datasource>
        <datasource id="slave4" parent="parent">
                <url>jdbc:mysql://localhost:3306/sharding?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull
                </url>
        </datasource>
        <group id="trade">
                <table name="user_copy" length="16">
                        <database-config>
                                <database masters="master1" slaves="slave1">
                                        <tables range="1-8" />
                                </database>
                                <database masters="master2" slaves="slave2,slave3">
                                        <tables range="9-16" />
                                </database>
                        </database-config>
                        <hashcolumns generator="default">
                                <column>id</column>
                                <script></script>
                        </hashcolumns>
                </table>
                <table name="sample_table" length="16"><!-- <names> <name>table1</name>
                                <name>table2</name> <value>table3,table4,table5,table6,table7,table8,table9,table10</value>
                                </names> -->
                        <database-config>
                                <database masters="master1" slaves="slave1">
                                        <tables range="1-8" />
                                </database>
                                <database masters="master2" slaves="slave2,slave3"
                                        readwrite="true">
                                        <tables>
                                                <names>
                                                        <name>table1</name>
                                                        <name>table2</name>
                                                        <value>table3,table4,table5,table6</value>
                                                </names>
                                        </tables>
                                </database>
                                <database masters="master3" slaves="slave3:80,slave4:10"
                                        readwrite="true">
                                        <tables>
                                                <names>
                                                        <name>table1</name>
                                                        <name>table2</name>
                                                        <value>table3,table4,table5,table6</value>
                                                </names>
                                        </tables>
                                </database>
                        </database-config>
                        <hashcolumns generator="default">
                                <column>member_id</column>
                                <script></script>
                        </hashcolumns>
                </table>
        </group>

        <group id="member">

        </group>
        <group id="market">

        </group>
</configurations>
分享到:
评论

相关推荐

    超额发票单据按照限额拆分java

    - 使用集合框架(如 `List` 和 `Map`)来存储拆分后的单据和明细项。 - 采用循环结构和条件判断来实现明细项的拆分逻辑。 6. **异常处理**: - 对于可能出现的异常情况,如数据类型不匹配、除数为零等,应提前...

    java拆分与合并02

    文件拆分和合并在很多场景下都有用武之地,比如: - 分割大型日志文件,便于分析或上传。 - 在分布式系统中,大文件可以被分割成多个部分,由不同的节点并行处理,提高效率。 - 数据备份,将大文件拆分成多个小文件...

    java拆分exlce

    `jxl.jar`库允许开发者读取、写入和修改Excel文件,包括对单元格的操作,如拆分和合并。在描述中提到的“自动拆分合并的单元格并补充拆分后的值”,意味着我们需要对Excel中的合并单元格进行处理,将它们拆分为多个...

    Java文件的拆分与合并.pdf

    Java文件的拆分是指将一个大的Java文件分割成多个小的文件,以便于更好地管理和维护。在上述代码中,我们可以看到,作者使用了Java的文件操作类库来实现文件的拆分。首先,作者定义了一个SeparatorByLine类,该类...

    Map拆分List拆分

    总的来说,Map拆分和List拆分是大数据处理中的重要技巧,它们有助于优化数据处理的并行性和效率。通过合理地拆分数据,可以充分利用分布式系统的计算资源,加快处理速度,同时降低单个节点的压力,从而在大数据挑战...

    短信拆分规则JAVA代码 拆分规则如下: 1、不超过70字按照一条短信计费 2、超过70字即为长短信,按67字/条分隔成多条计费

    短信拆分规则JAVA代码 拆分规则如下: 1、不超过70字按照一条短信计费 2、超过70字即为长短信,按67字/条分隔成多条计费

    JAVA拆分窗口与卡片布局相结合的经典案例

    ### JAVA拆分窗口与卡片布局相结合的经典案例 #### 案例概述 本案例通过将卡片布局(CardLayout)与拆分窗口(JSplitPane)结合使用,实现了一个动态切换界面的效果。左侧为操作区域,放置了按钮;右侧为展示区域,采用...

    拆分双向链表.zip

    在本文中,我们将深入探讨...这个例子展示了如何利用Java实现双向链表的高效拆分,对于理解和操作链表数据结构非常有帮助。通过这种方式,我们可以解决许多其他涉及链表操作的算法问题,例如合并排序链表或链表的反转。

    IPV4大网段拆分为多个均分子网段

    总的来说,"IPV4大网段拆分为多个均分子网段"是一个涉及网络地址规划和Java编程的问题。理解子网划分的概念和计算方法,以及如何在Java中实现这些计算,对于任何IT专业人士,尤其是网络管理员和软件开发者来说,都是...

    java 按行把一个txt文件平均拆分成N个txt文件

    按行把一个txt文件平均拆分成N个txt文件,结果是一行文本组成一个txt文件,适用于语料的按行切分。

    JAVA WEB高并发项目系统拆分实战

    单体应用已经不符合发展趋势,面对新的业务需求,把业务拆分,系统拆分,加深理解服务的概念,一切皆对象,一切皆服务,SDO(service data object) 一切皆数据

    基于mybatis框架,数据库垂直、水平拆分及读写分离实现

    在面对大量数据时,为了提高系统性能,我们常常需要采用一些数据库优化策略,如垂直拆分、水平拆分和读写分离。这里我们将详细讨论如何基于MyBatis框架实现这些策略,并结合Spring进行整合。 **一、MyBatis框架** ...

    Java实现文件拆分与合并

    ### Java实现文件拆分与合并 #### 一、文件拆分 ...综上所述,《Java实现文件拆分与合并》提供了详细的Java代码实现,不仅有助于理解和掌握文件拆分与合并的基本原理,还可以应用于实际项目中解决实际问题。

    Word文档的拆分合并

    对于一些长文档,特别是包含多个章节或部分的大篇幅文档,有时我们需要将其拆分为更小的部分,方便管理和处理。Word提供了简单易用的拆分功能。 ##### 步骤一:切换到大纲视图 - **视图选项**:首先,点击“视图”...

    java实现日期拆分的方法

    在Java编程中,日期处理是一项常见的任务,包括日期的拆分、比较、格式化和计算等。本篇文章将深入探讨如何使用Java实现日期拆分,特别是通过日期类和日历类来实现对日期字符串的拆分功能。 首先,Java中的日期类...

    itext合并和拆分PDF实例

    根据提供的文件信息,我们可以深入探讨如何使用iText库在Java环境中进行PDF文件的合并与拆分操作。以下是对这些操作的详细解释。 ### iText简介 iText 是一个开源库,用于生成、修改以及处理PDF文件。它支持多种...

    java字符拆分并转成集合.txt

    创建一个字符串“HelloWorld!!!”,将这个字符串拆分并转换成集合的方法。 自己也可以修改成汉字string类型。

    java动态规划-单词拆分(csdn)————程序.pdf

    Java动态规划-单词拆分 Java动态规划是指使用动态规划算法来解决问题的编程技术。动态规划是一种算法设计方法,它将问题分解成更小的子问题,并利用这些子问题的解来解决原问题。动态规划算法通常用于解决具有最...

    IP地址拆分小工具v1.1-用于批量计算、拆分IP地址、地址段,支持批量excel拆分转换

    1、起始IP-终止IP进行拆分、计算,如192.168.1.1-192.168.1.254; 2、输入IP地址段进行拆分、计算,如192.168.1.0/24、192.168.1-255(v1.1版本新增模式); 3、可以根据excel文件进行拆分,excel文件中IP地址,支持...

Global site tag (gtag.js) - Google Analytics