- 浏览: 488855 次
- 性别:
- 来自: 武汉
-
最新评论
-
zyzyzy123:
请问有工程吗,我现在正在实现打电话的功能,但是一直不通,怀疑是 ...
实用的java 串口通信程序 -
wuhaitong:
引用[img][/img][*][url][/url] ...
jbpm -
迷糊_le:
maven命令, 蛮好的,谢谢
maven eclipse -
Wuaner:
不错的文章 , 谢谢分享!
Hadoop -
yuqihengsheng:
strong 很细
HighLighter
最近讨论db shard的帖子比较多,感觉很多都是在参考hibernate shard的思路,但hibernate分表真的那么好吗?我觉得它最少有2个问题:
1. 改成shard后,代码的API调用要变。代码改动很大。
2. 设计很复杂,不清晰,逻辑关系难以理解。
hibernate shard基本上就是为了shard而对hibernate做的增增补补,凑合用还行,根本不具备设计上的参考价值。
对数据库分切方面,到目前为止,我觉得还是guzz的设计最清晰,如果我说的不对,欢迎理性讨论。不管您是否使用guzz,但是guzz在数据库分切方面的设计,对于清晰的设计模式,比hibernate shard更具有借鉴意义。
guzz垂直切分
垂直切分是指将不同的表分别存储到不同的数据库中。guzz默认配置级支持,不需要写任何代码,可以在任何时候,在需要时,将每张表存储到自己单独的一组服务器上,应该说是垂直分切的极限了。而且设计上,无论什么时候怎么分切,都不需要你改动代码。开发时你可以让所有表在一个库上;部署时,分到多个库上;以后业务增加了,再更加分散的放。
垂直分切简单配置方式:
1. 声明你要用多少台数据库,数据库之间什么关系。
这里我们声明了3组数据库,而且数据库类型还不一样。
2. 对每张表,配置应该存储到那个库里
简单的配置,将三个对象分别存储到3台不同的数据库中,完成垂直分切。
guzz水平切表
水平切表是指将一张大表,分切成许多小表。guzz的设计是当需要水平分表时,原先代码不变,为每个需要分切的表编写一个分表策略类,配置到系统中。然后在调用前,声明分表策略即可。
整个过程只需要新写一个类,在调用出增加一行代码即可,对原始系统入侵非常小,风险可控。
流程总比hibernate shard要清晰很多,具体可以看http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans
数据库主从分离
从垂直分切部分可以看到,guzz也是配置性的原生支持读写分离。如果需要增加从数据库,可以随时加上,不需要改任何代码。不需要改动代码,而且配置也不复杂,应该算是设计上的极限了吧?
你只需要在dbgroup中增加一个属性“slaveDBConfigName”,然后在一个properties文件中加上所有你需要的从数据库连接池配置即可,从数据库可以有许多台。
这个hibernate shard根本就没有涉及到。而且guzz允许程序控制读写库选取,和proxy模式的中间件路由各有优势,毕竟更加容易控制。如果你做过内容提前审核再允许发布的系统,就会明白proxy中间件解决不了全部问题,有些读操作不允许延迟,只能读主库,而是也是读事务,proxy中间件会很尴尬。
异构数据库
这个hibernate以及ibatis之类的更没有了。而且也是对应用透明的,你可以随时选择增加一种数据库,然后把某些表放到上面,如增加一个H2做应用端缓存数据库,自己完成类似Timesten + oracle的架构。
配置方式在上面的垂直分切小节也可以看到。
数据库连接池配置
随着表垂直和水平切分的进行,数据库会越来越多,数据源配置也会越来越多。guzz的设计是配置分组管理,类似Mysql的配置文件。每个数据源配置都在一个组内,无论增加多少都清晰了然,不会名字相互冲突。
示例:
如果一些数据库对某些连接池支持更好,guzz设计上还允许为不同的数据源指定不同的连接池实现。
如果您需要分表,还是放弃hibernate shard或ibatis的设计模式吧,哪些只是临时拼凑出来的东西,设计上根本就不怎么样!
1. 改成shard后,代码的API调用要变。代码改动很大。
2. 设计很复杂,不清晰,逻辑关系难以理解。
hibernate shard基本上就是为了shard而对hibernate做的增增补补,凑合用还行,根本不具备设计上的参考价值。
对数据库分切方面,到目前为止,我觉得还是guzz的设计最清晰,如果我说的不对,欢迎理性讨论。不管您是否使用guzz,但是guzz在数据库分切方面的设计,对于清晰的设计模式,比hibernate shard更具有借鉴意义。
guzz垂直切分
垂直切分是指将不同的表分别存储到不同的数据库中。guzz默认配置级支持,不需要写任何代码,可以在任何时候,在需要时,将每张表存储到自己单独的一组服务器上,应该说是垂直分切的极限了。而且设计上,无论什么时候怎么分切,都不需要你改动代码。开发时你可以让所有表在一个库上;部署时,分到多个库上;以后业务增加了,再更加分散的放。
垂直分切简单配置方式:
1. 声明你要用多少台数据库,数据库之间什么关系。
- <dialect class="org.guzz.dialect.H2Dialect"></dialect>
- <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" />
- <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" />
- <tran>
- <dbgroup name="default" masterDBConfigName="masterDB" />
- <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" />
- <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" />
- </tran>
<dialect class="org.guzz.dialect.H2Dialect"></dialect> <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" /> <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" /> <tran> <dbgroup name="default" masterDBConfigName="masterDB" /> <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" /> <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" /> </tran>
这里我们声明了3组数据库,而且数据库类型还不一样。
2. 对每张表,配置应该存储到那个库里
- <a-business dbgroup="default" name="filterWord" class="com.guzzservices.business.FilterWord" />
- <a-business dbgroup="mysql" name="filterWordGroup" class="com.guzzservices.business.FilterWordGroup" />
- <a-business dbgroup="oracle" name="configuration" class="com.guzzservices.business.Configuration" />
<a-business dbgroup="default" name="filterWord" class="com.guzzservices.business.FilterWord" /> <a-business dbgroup="mysql" name="filterWordGroup" class="com.guzzservices.business.FilterWordGroup" /> <a-business dbgroup="oracle" name="configuration" class="com.guzzservices.business.Configuration" />
简单的配置,将三个对象分别存储到3台不同的数据库中,完成垂直分切。
guzz水平切表
水平切表是指将一张大表,分切成许多小表。guzz的设计是当需要水平分表时,原先代码不变,为每个需要分切的表编写一个分表策略类,配置到系统中。然后在调用前,声明分表策略即可。
整个过程只需要新写一个类,在调用出增加一行代码即可,对原始系统入侵非常小,风险可控。
流程总比hibernate shard要清晰很多,具体可以看http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans
数据库主从分离
从垂直分切部分可以看到,guzz也是配置性的原生支持读写分离。如果需要增加从数据库,可以随时加上,不需要改任何代码。不需要改动代码,而且配置也不复杂,应该算是设计上的极限了吧?
你只需要在dbgroup中增加一个属性“slaveDBConfigName”,然后在一个properties文件中加上所有你需要的从数据库连接池配置即可,从数据库可以有许多台。
这个hibernate shard根本就没有涉及到。而且guzz允许程序控制读写库选取,和proxy模式的中间件路由各有优势,毕竟更加容易控制。如果你做过内容提前审核再允许发布的系统,就会明白proxy中间件解决不了全部问题,有些读操作不允许延迟,只能读主库,而是也是读事务,proxy中间件会很尴尬。
异构数据库
这个hibernate以及ibatis之类的更没有了。而且也是对应用透明的,你可以随时选择增加一种数据库,然后把某些表放到上面,如增加一个H2做应用端缓存数据库,自己完成类似Timesten + oracle的架构。
配置方式在上面的垂直分切小节也可以看到。
数据库连接池配置
随着表垂直和水平切分的进行,数据库会越来越多,数据源配置也会越来越多。guzz的设计是配置分组管理,类似Mysql的配置文件。每个数据源配置都在一个组内,无论增加多少都清晰了然,不会名字相互冲突。
示例:
- [masterDB]
- guzz.identifer=blogMasterDB
- guzz.IP=localhost
- guzz.maxLoad=120
- driverClass=com.mysql.jdbc.Driver
- jdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true
- user=root
- password=root
- acquireIncrement=10
- idleConnectionTestPeriod=60
- [updateMasterDB]
- guzz.identifer=incUpdateDB1
- guzz.IP=localhost
- guzz.maxLoad=20
- driverClass=com.mysql.jdbc.Driver
- jdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&characterEncoding=UTF-8
- user=slowupdate
- password=slowupdate
- acquireIncrement=10
- idleConnectionTestPeriod=60
- [logMasterDB]
- ....
[masterDB] guzz.identifer=blogMasterDB guzz.IP=localhost guzz.maxLoad=120 driverClass=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true user=root password=root acquireIncrement=10 idleConnectionTestPeriod=60 [updateMasterDB] guzz.identifer=incUpdateDB1 guzz.IP=localhost guzz.maxLoad=20 driverClass=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&characterEncoding=UTF-8 user=slowupdate password=slowupdate acquireIncrement=10 idleConnectionTestPeriod=60 [logMasterDB] ....
如果一些数据库对某些连接池支持更好,guzz设计上还允许为不同的数据源指定不同的连接池实现。
如果您需要分表,还是放弃hibernate shard或ibatis的设计模式吧,哪些只是临时拼凑出来的东西,设计上根本就不怎么样!
发表评论
-
安装和使用memcached
2014-04-16 16:24 652如何将 memcached 融入到 ... -
applicationContext.xml
2013-08-09 09:05 954<?xml version="1.0&quo ... -
注释驱动的 Spring cache 缓存介绍
2013-08-08 07:04 672概述 Spring 3.1 引入了激动人心的基于注释(an ... -
Spring2.5 Annotations
2013-08-08 06:33 871完成setXxxx功能,即配置文件的 <propert ... -
Spring基于注解的缓存配置--EHCache AND OSCache
2013-08-07 23:21 1043本文将构建一个普通工程来说明spring注解缓存的使用方式, ... -
Ehcache 整合Spring 使用页面、对象缓存
2013-08-07 22:51 907Ehcache 整合Spring 使用页面、对象缓存 ... -
javassist教程和示例
2013-05-18 08:57 2025Javassist是一个执行字节 ... -
ZooKeeper官方文档
2013-05-16 17:09 1569介绍(源自ZooKeeper官方文档) 学习HBase过程 ... -
ZooKeeper -例子
2013-05-16 17:08 1233ZooKeeper ZooKeepe ... -
Spring整合Hessian访问远程服务
2013-05-15 13:44 869Spring整合Hessian访问远程服务 目录 1.1 ... -
redis
2013-05-14 11:44 778redis是一个key-value存储系统。和Memcach ... -
spring 资源访问
2013-05-13 08:26 1019spring在java基础上封装了资源访问,简单易用。 R ... -
ZooKeeper——入门
2013-05-08 16:12 920ZooKeeper——入门 博客分类: ZooK ... -
分布式服务框架 Zookeeper -- 管理分布式环境中的数据(IBM)
2013-05-08 14:07 794安装和配置详解 本文 ... -
分布式协调服务---Zookeeper
2013-05-08 14:05 7861、Zookeeper overview Zookee ... -
Hibernate
2013-03-28 13:04 939一、简述 Hibernate 和 JD ... -
Apache+Tomcat集群配置详解
2013-02-01 10:52 909Apache + Tomcat集群配置详解(1) 一、 ... -
Apache+Jboss集群基于反向代理的负载均衡
2013-02-01 10:40 2514假设三台机器IP分别为172.29.128.100、172. ... -
spring + ibatis 多数据源事务(分布式事务)管理配置方法
2012-12-17 15:18 1285spring + ibatis 多数据源事务(分布式事务 ... -
Hessian序列化不设SerializerFactory性能问题
2012-10-31 09:47 1523Hessian序列化不设SerializerFactor ...
相关推荐
电子政务是指政府机构利用信息技术,如互联网、数据库等,来提升公共服务效率,实现政务信息公开,提高行政管理水平。在这个场景中,它可能涉及到电容器制造业与政府相关政策、标准或监管的信息。 描述中的内容与...
最后,材料科学中的“临界分切应力”是指在材料内部产生滑移所需达到的最小应力,这是一个与材料固有性质和外力方向无关的定值。虽然该名词与AI关系不大,但它为材料的力学性能分析提供了理论基础。 综合上述内容,...
系统可以设计为:WinCC作为前端负责数据的采集和初步处理,并与后端的Foxpro数据库进行通信,将收集到的数据传输到数据库进行存储。在数据存储之后,系统可以通过Foxpro数据库的查询和分析功能,对历史数据进行挖掘...
4. 分切与烫印:将带有全息图案的薄膜分切成适合的尺寸,然后使用烫印机将其烫印到产品包装上。 防伪包装盒则是在包装盒设计中融入各种防伪元素,包括但不限于全息防伪标签、条形码、二维码、微缩文字、特殊油墨...
【力控锂离子电池车间数据采集系统】是一个专为锂离子电池生产车间设计的数据采集和管理系统。该系统由力控科技北京力控元通科技提供,旨在整合工业互联网体系,覆盖从生产监控到集团决策的多层次智能管控,助力智能...
在IT行业中,尽管我们主要关注的是软件开发、网络技术、数据库管理和信息安全等方面,但设备装置的设计和制造也是科技领域不可或缺的一部分。"一种热转印纸原纸及其制备工艺"这个主题,虽然不直接涉及编程或硬件组装...
* 提出主要海水养殖动物营养需求参数 1 套以上,构建养殖动物 20 种以上饲料原料数据库,提高水产养殖动物饲料转化效率 8-10% * 开发水产动物新型动植物蛋白源 1-2 个,突破饼粕类饲料发酵关键技术,利用率提高 20% ...