不用分布式方式,处理大量数据的问题

前提:

由于数据量比较大,但是,数据库用的还是mysql,等关系型数据库,如何处理大批量数据的问题。

一句话说,分表来实现。

如何分表,这个需要看业务逻辑的。

比如,写一个医院的系统,稍微说这么一点逻辑

其中,每个检查项目,是一个对象,一个检查套餐,包括很多检查项目,一个人,可能会一次性检查几个套餐+外加几个额外的检查项目,而且,这些检查项目,和检查套餐,很多医院都适用的。所以说,如果这个项目很多医院同时使用,而且,用到的是一个数据库,就会遇到这样的问题。

要么,用分布式数据库,redis,等,,要么,就分开用不同的数据库服务器,要么,就是分表,额,我暂时,只想到这几种方式。

下面说说分表。

上面的前提已经交代的很清楚了。

现在有这么一张表,保存的是,人,医院,检查项目,一次来医院检查的记录,等等一系列信息。

如果这个数据量特别大,可以按照这几个地方来分表。

1、按照检查项目分表

2、按照医院分表

3、按照用户分表

上面说了一堆不是废话的废话,下面说怎样来分表。

////稍等,我先写一篇,java   CRC32  的用法

好了,文章写完了,可以先看看我写的crc32的文章,利用CRC32  的特性,生成一个唯一的值,然后来定义表的名字。

下面贴代码。先写可以创建很多数据库的代码。

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class CreateTableScript {

    private JdbcTemplate ecdTemplate;
    private JdbcTemplate ecdUserTemplate;
    private JdbcTemplate ecdMRecordTemplate;
    private JdbcTemplate ecdReportTemplate;

    @Before
    public void setup() {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        ecdMRecordTemplate = (JdbcTemplate) context.getBean("ecdMRecrodMasterTemplate");
    }

    @Test
    public void createTreatTpl(){
    	String tableName = "hospital_dingdan_hid";
    	for(int i = 0; i <256 ; i++){
    		String tab = String.format(tableName+"_%02x", i);
    		String sql = "CREATE TABLE `"
    				   + tab
    				   + "` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,"
    				   +"`tplid` bigint(20) NOT NULL,"
    				   +"`treatid` bigint(20) NOT NULL,"
    				   +"`docid` bigint(20) NOT NULL,"
    				   +"`addtime` int(11) NOT NULL,"
    				   +"`modtime` int(11) NOT NULL,"
    				   +"`status` tinyint(4) NOT NULL,"
    				   +"  PRIMARY KEY (`id`)"
    				   +"   ) ENGINE=InnoDB DEFAULT CHARSET=utf8";

    		ecdMRecordTemplate.execute(sql);
    	}
    }
}

我稍微说一下我的代码,我这里用的是,单元测试的方法,只需要执行这一个@Test方法就可以了。

项目中,用的是springMVC+JDBC

稍微有点经验的人能看出来。

所以说,在setup()方法中,我需要先加载applicationcontext.xml,然后通过,spring注解,找到对应的数据库。

然后再用JDBC链接数据库来操作数据,

然后,代码中,tableName 的后缀,是hid ,我这里用的是hid分表。

同理,其他的分表 可以用其他的后缀,方便就可以了。

根据数据大小,感觉,分出来256张表,应该就够用了。

这里,%02x  不懂的,自己百度去,这个,跟C语言用法一样。

然后,就可以创建256张表了。

下面是具体的用法:

////我先去吃饭,下午回来再写。

时间: 2024-09-11 01:09:17

不用分布式方式,处理大量数据的问题的相关文章

不用分布式方式,处理大量数据的问题(2)

为啥分成两篇呢,原因有两个, 一个是,很多人不愿意看太长的文章,另一个原因是,我想多骗点积分.骗了积分没啥用,就是为了提升逼格. 上一篇说了根据需求,创建分表. 下面说,如何使用已经创建的分表. 想看下面的文章呢,先看看 CRC32 直接贴代码,用代码说话. public static String shard(String tableName, int tableNumber, String DivisionType) { CRC32 crc = new CRC32(); crc.update

Bigtable:一个分布式的结构化数据存储系统

Bigtable:一个分布式的结构化数据存储系统 本文的英文原文为Google在2006年发布的Google Bigtable paper 本文的翻译版本由Alex完成,原文地址为: http://blademaster.ixiezi.com/ 这是我很长时间以来一直想要翻译的文章,不过由于其文太长,以及本人精力有限,未能如愿,今天偶遇此文,感觉译者此文的翻译已远远超越本人,因此将此翻译版本转载于此. Bigtable:一个分布式的结构化数据存储系统译者:alex 摘要 Bigtable是一个分

以独占方式的锁定数据表的解决方法参考_Dreamweaver

对于Dreamweaver的所有版本软件,在连接数据库正确,绑定记录集成功的情况下 在页面中插入记录,预览网页进行测试时,突然遇到问题大致如下: 错误类型:Microsoft OLE DB Provider for ODBC Drivers (0x80004005)[Microsoft][ODBC Microsoft Access Driver] 机器 'BLUES' 上的用户 'Admin' 以独占方式的锁定数据表 'c_test'. 引起这个错误的可能是: 1,数据库采用的Access文件

android post方式提交中文数据到服务器乱码问题

问题描述 android post方式提交中文数据到服务器乱码问题 Android端代码 AsyncHttpClient client = new AsyncHttpClient(); //URLEncoder.encode(categoryutf-8""); RequestParams params = new RequestParams(); if(path1!=null){ file1=new File(path1); } if(path2!=null){ file2=new F

数据的价值主要体现:图形化方式来呈现数据

文章描述:数据的价值主要体现:图形化方式来呈现数据. 在可用性测试中,数据的价值主要体现在为测试结论提供支持,换句话说,如果我们不能用数据很好的和别人进行交流,我们数据的价值有非常有限. 用表格形式来呈现数据是一种比较简便的方式,但是,为了更好的对数据做出解释,我们需要图形化的方式来呈现数据. 通常情况下,我们用到的数据图的类型有以下几种: l  条形图(柱状图) Column or bar graphs l  折线图 Line graphs l  散点图 Scatter plots l  饼图

mfc-我已经通过MFC ODBC连上mysql数据库了,怎样以最简单的方式访问到数据?

问题描述 我已经通过MFC ODBC连上mysql数据库了,怎样以最简单的方式访问到数据? 已经连上mysql了,现在只需要读出数据库里的数据就行,希望能读出某一个字段中的所有值,按顺序这样读下来,存到我的程序里,怎么读最简单?本人比较菜,最好有易懂的代码,谢谢了 解决方案 就是select * from table这样的比较的理想 解决方案二: 参考:http://www.cnblogs.com/good90/archive/2012/03/04/2379371.htmlMFC通过ODBC连接

post请求-Android post方式上传数据给服务器

问题描述 Android post方式上传数据给服务器 做了一个小例子.Tomcat服务器发布Server.然后在Android手机上用httpurlconnection连接服务器.用post方式上传数据.有个问题很怪.在公司测试的时候没有任何问题.但是到家里运行,链接返回的状态码一直是404.在公司和家里的区别就是公司是局域网IP,在家里我是用的无线路由器自动分配的IP.地址192.168.1.100.我用手机浏览器都能访问到tomcat网站.但是就是post不了数据.各位大侠谁了解,指点一下

activemq-使用消息队列的方式从一个数据平台获取数据

问题描述 使用消息队列的方式从一个数据平台获取数据 是如何保证数据的不重复?也就是说每次取数据都要按照时间字段做限制?还是说不需要关心这个,他给什么就收什么?是多线程的吗,实时保持通信?望好心人做做解答.多谢 解决方案 看什么数据来源,它本身是否支持对消息的唯一编码.如果没有唯一的编码,那么只能以时间戳来作为唯一的依据.消息队列一般都是支持多线程并发的,但是你的程序仍然需要做相应的处理. 解决方案二: 虽然你没有提供多少细节,但是一些常识性的东西可以回答你,根据著名的cap原则,在分布式系统上,

javaweb-spring mvc接收不到put方式提交的数据

问题描述 spring mvc接收不到put方式提交的数据 在做修改的时候,提交的方式是put请求,然后spring mvc中的一个方法处理请求,接收参数是一个实体bean,但是这个接收参数就是接收不到提交的数据不知道除了过滤器能解决还有什么办法没有? 解决方案 spring MVC 接收PUT方式请求关于HTTP提交方式之PUT让spring mvc支持put请求 解决方案二: 假设方法为,接受的参数为User实体类 public void Test1(){} 第一种方式为: public v