数据库设计

微服务的数据库设计

天涯浪子 提交于 2019-12-02 03:22:29
单独的数据库: 微服务设计的一个关键是数据库设计,基本原则是每个服务都有自己单独的数据库,而且只有微服务本身可以访问这个数据库。它是基于下面三个原因。 优化服务接口:微服务之间的接口越小越好,最好只有服务调用接口(RPC或消息),没有其他接口。如果微服务不能独享自己的数据库,那么数据库也变成了接口的一部分,这大大拓展了接口范围。 错误诊断:生产环境中的错误大部分都是和数据库有关的,要么是数据出了问题,要么是数据库的使用方式出了问题。当你不能完全控制数据库的访问时,会有各种各样的错误发生。它可能是别的程序直接连到你的数据库或者是其他部门直接用客户端访问数据库的数据,而这些都是在程序中查不到的,增加了错误排查难度。如果是程序中的问题,只要修改了代码,那么这个错误就不会再有。而上面提到的错误,你永远都没法预测它们什么时候还会再次发生。 性能调优:性能调优也是一样,你需要对数据库有全权控制才能保证它的性能。如果其他部门一定要访问数据库,而且只是查询的话,那么可以另外创建一份只读数据库,让他们在另一个库中查询,这样才不会影响到你的库。 理想的设计是你的数据库只有你的服务能访问,你也只调用自己数据库中的数据,所有对别的微服务的访问都通过服务调用来实现(请参阅“微服务之间调用的最佳设计“)。当然,在实际应用中,单纯的服务调用可能不能满足性能或其他要求,不同的微服务都多少需要共享一些数据。

Mybatis映射器之ResultMap解析

我是研究僧i 提交于 2019-12-01 23:21:50
Mybatis映射器之ResultMap解析 在 Mybatis映射器之select解析 这篇文章最后我们只是简单的介绍了一下ResultMap的使用,而ResultMap功能非常多,他也包含了很多子元素,本篇我们将详细的介绍下。 1. Result Maps概述 resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来, 并在一些情形下允许你做一些 JDBC 不支持的事情。 实际上,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的同等功能的代码。 ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。 你已经见过简单映射语句的示例了,但没有明确的 resultMap。比如: < select id= "selectUsers" resultType= "map" > select id, username, hashedPassword from some_table where id = #{id} </ select > 上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的领域模型。你的程序更可能会使用

Mybatis之ResultMap和ResultType

断了今生、忘了曾经 提交于 2019-12-01 22:58:06
在写MyBatis mapper xml文件时,对于返回的数据会映射到对象中,ResultMap和ResultType和mapUnderscoreToCamelCase都是控制这种映射关系的,因为数据库字段命名和实体类property name未必对应,所以需要手动控制这种映射关系,mapUnderscoreToCamelCase配置是让数据库下划线命名方式能对应成驼峰命名,如数据库字段名user_name,实体属性名userName,开启mapUnderscoreToCamelCase=true之后,mybatis自动能识别这种对应关系,查询和更新都能识别这种对应关系。resutlType的使用比较简单,直接给一个实体类型即可,当然可以通过配置别名(注解和配置文件都行),resultMap的话就需要自己配置字段对应关系,并指定实体类型,然后使用的时候给定resultMap的相应id即可,resultMap能映射复杂到POJO,resultType只能映射到简单的没有嵌套没有集合的类型。 还需要说明的是@Column这个注解,属于JPA规范,不要误认为是MyBatis相关定义,他的作用是我们通过类型创建表的时候有用,在进行数据库查询和修改时是不需要的,而且我们推荐的做法是手动设计表并创建,而不是通过代码创建,所以按照这种原则,你的代码中是不会需要使用这种注解的。

iBATIS ResultMap基础浅析

拜拜、爱过 提交于 2019-12-01 22:49:23
ibatis resultmap 是我们学习 ibatis 中非常重要的一个内容,在我个人看来,能否真正用好 ibatis 的一个关键,这就是 resultmap 。字面上理解,它就是结果集的映射,就是将返回的记录逐 个字段的映射赋值给对象的属性上。其实如果没有特殊需求的话我们完全可以使用 resultclass 来代替它,因为如果字段与属性一模一样的话,查询出来数据集会自动匹配到 resultclass 指定的类的实例对象,如果字段名不在属性中的话,那这个字段将不会被返回的 实例体类对象接受,相当于没有查询出这个字段一样的。 每个 resultmap 都有一个自己的 id ,如果你在 sqlmap.config 中没有配置使用命名空间的话, 那么这个 resultemap id 是全局(这点在所有的 ibatis 配置元素都是一样的), resultmap 一个 重要的属性的是 class, 它将决定这个 resultmap 对应的实例的类,换句话讲,它的作用是指出 结果集要映射的数据类型。在 extends 属性中可以设置它将要继承的 resultmap ,如果给他指 定的了值,那么它将会从 super resultmap 继承所的映射配置字段。定义如下: ﹤ resultmaps ﹥ ﹤ resultmap id="demoresultmap" class=

Hibernate4实战 之 第三部分:Hibernate的基本开发

邮差的信 提交于 2019-12-01 20:37:15
1:瞬时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时的。瞬时对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时对象在程序中没有被引用,它会被垃圾回收器销毁。 使用Hibernate Session可以将其变为持久状态,Hibernate会自动执行必要的SQL语句。 2:持久(Persistent) - 持久的实例在数据库中有对应的记录,并拥有一个持久化标识。 持久的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象数据与数据库同步。开发者不需要手动执行UPDATE。将对象从持久状态变成瞬时状态同样也不需要手动执行DELETE语句。 3:脱管(Detached) - 与持久对象关联的Session被关闭后,对象就变为脱管的。 对脱管对象的引用依然有效,对象可继续被修改。脱管对象如果重新关联到某个新的Session上, 会再次转变为持久的,在脱管期间的改动将被持久化到数据库。 通过Session接口来操作Hibernate 新增——save方法、persist方法 1:persist() 使一个临时实例持久化。然而

Hibernate4实战 之 第三部分:Hibernate的基本开发

不问归期 提交于 2019-12-01 20:32:33
1:瞬时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时的。瞬时对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时对象在程序中没有被引用,它会被垃圾回收器销毁。 使用Hibernate Session可以将其变为持久状态,Hibernate会自动执行必要的SQL语句。 2:持久(Persistent) - 持久的实例在数据库中有对应的记录,并拥有一个持久化标识。 持久的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象数据与数据库同步。开发者不需要手动执行UPDATE。将对象从持久状态变成瞬时状态同样也不需要手动执行DELETE语句。 3:脱管(Detached) - 与持久对象关联的Session被关闭后,对象就变为脱管的。 对脱管对象的引用依然有效,对象可继续被修改。脱管对象如果重新关联到某个新的Session上, 会再次转变为持久的,在脱管期间的改动将被持久化到数据库。 通过Session接口来操作Hibernate 新增——save方法、persist方法 1:persist() 使一个临时实例持久化。然而

数据库设计-Mysql数据库表设计的过程中几个关键点

╄→尐↘猪︶ㄣ 提交于 2019-12-01 15:28:34
一.表设计过程中应该注意的数据类型 1)更小的通常更好 控制字节长度 2)使用合适的数据类型: 如tinyint只占8个位,char(1024)与varchar(1024)的对比,char用于类似定长数据存储比varchar节省空间,如:uuid(32),可以用char(32). 3)尽量避免NULL建议使用NOT NULL DEFAULT '' 4)NULL的列会让索引统计和值比较都更复杂。可为NULL的列会占据更多的磁盘空间,在Mysql中也需要更多复杂的处理程 二.索引设计过程中应该注意的点: 1)选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录,保证物理上面唯一 2)为经常需要排序、分组和联合操作的字段建立索引 ,经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间 3)常作为查询条件的字段建立索引 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速 4)数据少的地方不必建立索引:例如gender性别字段,仅有男女2中数据, 如果在这个字段建立索引,缺点:1.索引占用内存,2.索引性能差 三.关于SQL的执行计划   使用explain关键字可以分析SQL的执行计划   下面是对比图: 数据少的字段建立索引   建立索引前   建议索引后(性能提升较少)

Mybatis最权威的知识点

ぐ巨炮叔叔 提交于 2019-12-01 13:28:54
1、什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。 (2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 (3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。 2、Mybaits的优点: (1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。 (2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; (3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。 (4

Hibernate缓存与集合性能分析

情到浓时终转凉″ 提交于 2019-12-01 12:26:45
Hibernate作为一个应用级的数据访问层封装,只能在其作用范围内保持cache中数据的有效性,如果系统与第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。 Hibernate在本地JVM中维护了一个缓存池,并将从数据库获得的数据保存到池中以供下次重用。 外部系统的定义,并非限于本系统之外的第三方系统,即使在本系统中,如果出现了绕过Hibernate数据存储机制的其他数据存取手段,那么Cache的有效性也必须细加考量。 1. Cache分类 Hibernate中的Cache大致分为两层: (1) Session级别缓存:在Session实现,属于事务级数据缓冲;一旦事务结束,这个Cache也就失效。此层为内置实现,无需进行干涉。 (2) 二级缓存:Hibernate中对其实力范围内的数据进行缓存的管理容器。 2. 缓存映射 配置缓存映射时通过设置类或集合映射的<cache>元素来设定的。如: < cache usage ="transactional | read-write | nonstrict-read-write | read-only" region ="RegionName" include ="all | non-lazy" /> usage:必须。说明了缓存的策略;、 ----read-only:如果只需要读取一个持久化类的实例,而无需修改

mybatis一级缓存和二级缓存(二)

旧城冷巷雨未停 提交于 2019-12-01 09:54:12
注意事项与示例配置 一级缓存   Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。               为什么要使用一级缓存,不用多说也知道个大概。但是还有几个问题我们要注意一下。    1、一级缓存的生命周期有多长?    a、MyBatis在开启一个数据库会话时,会 创建一个新的 SqlSession 对象, SqlSession 对象中会有一个新的 Executor 对象。 Executor 对象中持有一个新的 PerpetualCache 对象;当会话结束时, SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。   b、如果 SqlSession 调用了 close() 方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存将不可用。   c、如果 SqlSession 调用了