社区
.NET技术其他语言
帖子详情
问个nhibernate的问题
talinte
2012-11-22 10:20:16
公司、用户两个类,用户和公司关联,公司和公司自关联,即公司有上级公司,查询公司信息时(ToList),用户表和公司表会关联,但nhibernate还会再发送一条SQL语句,获取公司的上级公司信息,请问怎样才能避免公司类的自关联查询?
...全文
9134
1
打赏
收藏
问个nhibernate的问题
公司、用户两个类,用户和公司关联,公司和公司自关联,即公司有上级公司,查询公司信息时(ToList),用户表和公司表会关联,但nhibernate还会再发送一条SQL语句,获取公司的上级公司信息,请问怎样才能避免公司类的自关联查询?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
threenewbee
2012-11-22
打赏
举报
回复
将关联的属性配置成懒惰加载。
高并发数据库设计.pdf
⾼并发数据库设计 随着乐视硬件抢购的不断升级,乐视集团⽀付⾯临的请求压⼒百倍乃⾄千倍的暴增。作为商品购买的最后⼀环,保证⽤户快速稳定的完成⽀ 付尤为重要。所以在15年11⽉,我们对整个⽀付系统进⾏了全⾯的升级,使之具备了每秒稳定处理10万订单的能⼒。为乐视⽣态各种形式 的抢购秒杀活动提供了强有⼒的⽀撑。 ⼀、库分表 ⼀、库分表 在,memcached等缓存系统盛⾏的互联⽹时代,构建⼀个⽀撑每秒⼗万只读的系统并不复杂,⽆⾮是通过⼀致性哈希扩展缓存节点,⽔平 扩展web服务器等。⽀付系统要处理每秒⼗万笔订单,需要的是每秒数⼗万的更新操作(insert加update),这在任何⼀个独⽴数据库上都 是不可能完成的任务,所以我们⾸先要做的是对订单表(简称order)进⾏分库与分表。 在进⾏数据库操作时,⼀般都会有⽤户ID(简称uid)字段,所以我们选择以uid进⾏分库分表。 分库策略我们选择了"⼆叉树分库",所谓"⼆叉树分库"指的是:我们在进⾏数据库扩容时,都是以2的倍数进⾏扩容。⽐如:1台扩容 到2台,2台扩容到4台,4台扩容到8台,以此类推。这种分库⽅式的好处是,我们在进⾏扩容时,只需DBA进⾏表级的数据同步,⽽不需 要⾃⼰写脚本进⾏⾏级数据同步。 光是有分库是不够的,经过持续压⼒我们发现,在同⼀数据库中,对多个表进⾏并发更新的效率要远远⼤于对⼀个表进⾏并发更新,所以我 们在每个分库中都将order表拆分成10份:order_0,order_1,….,order_9。 最后我们把order表放在了8个分库中(编号1到8,分别对应DB1到DB8),每个分库中10个分表(编号0到9,分别对应order_0到 order_9),部署结构如下图所⽰: 根据uid计算数据库编号: 数据库编号 = (uid / 10) % 8 + 1 根据uid计算表编号: 表编号 = uid % 10 当uid=9527时,根据上⾯的,其实是把uid分成了两部分952和7,其中952模8加1等于1为数据库编号,⽽7则为表编号。所以 uid=9527的订单信息需要去DB1库中的order_7表查找。具体算法流程也可参见下图: 有了分库分表的结构与算法最后就是寻找分库分表的实现⼯具,⽬前市⾯上约有两种类型的分库分表⼯具: 1. 客户端分库分表,在客户端完成分库分表操作,直连数据库 2. 使⽤分库分表中间件,客户端连分库分表中间件,由中间件完成分库分表操作 这两种类型的⼯具市⾯上都有,这⾥不⼀⼀列举,总的来看这两类⼯具各有利弊。客户端分库分表由于直连数据库,所以性能⽐使⽤分库分 表中间件⾼15%到20%。⽽使⽤分库分表中间件由于进⾏了统⼀的中间件管理,将分库分表操作和客户端隔离,模块划分更加清晰,便于 DBA进⾏统⼀管理。 我们选择的是在客户端分库分表,因为我们⾃⼰开发并开源了⼀套数据层访问框架,它的代号叫"芒果",芒果框架原⽣⽀持分库分表功 能,并且配置起来⾮常简单。 芒果主页:mango.jfaster.org 芒果源码:github.com/jfaster/mango ⼆、订单 ⼆、订单ID( (uid维度) 维度) 订单系统的ID必须具有全局唯⼀的特征,最简单的⽅式是利⽤数据库的序列,每操作⼀次就能获得⼀个全局唯⼀的⾃增ID,如果要⽀持每秒 处理10万订单,那每秒将⾄少需要⽣成10万个订单ID,通过数据库⽣成⾃增ID显然⽆法完成上述要求。所以我们只能通过内存计算获得全 局唯⼀的订单ID。 领域最著名的唯⼀ID应该算是UUID了,不过UUID太长⽽且包含字母,不适合作为订单ID。通过反复⽐较与筛选,我们借鉴了Twitter的 Snowflake算法,实现了全局唯⼀ID。下⾯是订单ID的简化结构图: 上图分为3个部分: 1. 时间戳 这⾥时间戳的粒度是毫秒级,⽣成订单ID时,使⽤System.currentTimeMillis()作为时间戳。 1. 机器号 每个订单服务器都将被分配⼀个唯⼀的编号,⽣成订单ID时,直接使⽤该唯⼀编号作为机器号即可。 1. ⾃增序号 当在同⼀服务器的同⼀毫秒中有多个⽣成订单ID的请求时,会在当前毫秒下⾃增此序号,下⼀个毫秒此序号继续从0开始。⽐如在同⼀服务 器同⼀毫秒有3个⽣成订单ID的请求,这3个订单ID的⾃增序号部分将分别是0,1,2。 上⾯3个部分组合,我们就能快速⽣成全局唯⼀的订单ID。不过光全局唯⼀还不够,很多时候我们会只根据订单ID直接查询订单信息,这时 由于没有uid,我们不知道去哪个分库的分表中查询,遍历所有的库的所有表?这显然不⾏。所以我们需要将分库分表的信息添加到订单ID 上,下⾯是带分库分表信息的订单ID简化结构图: 我们在⽣成的全局订单ID头部添加了分库与分表的信息,这样只根据订单ID,我们也能快速的查询到
7.网络之路 第七期——存储专题
7.网络之路 第七期——存储专题7.网络之路 第七期——存储专题7.网络之路 第七期——存储专题7.网络之路 第七期——存储专题
敢问路在何方--一个程序员从迷茫到坚定到再次迷茫之路
敢问路在何方--一个程序员从迷茫到坚定到再次迷茫之路敢问路在何方--一个程序员从迷茫到坚定到再次迷茫之路
基于Extjs的DirectCenter框架源码
基于Extjs的DirectCenter框架源码 DirectCenter主要分为用户管理,部门管理,公司管理三个模块。 DirectCenter: DirectCenter.Model (类库项目)实体类库,其中包括hibernate映射文件(可以把映射文件放到DAL层,这样使Model也比较单纯,而DAL则只是
Nhibernate
的完整实现) DirectCenter.IDAL (类库项目)数据访问层接口 DirectCenter.DAL (类库项目)数据库访问层实现(采用
NHibernate
) DirectCenter.IBLL (类库项目)业务层接口 DirectCenter.BLL (类库项目)业务层实现(使用IDAL,通过spring.net的IOC注入实际的数据访问层) DirectCenter.App (类库项目)系统的配置,其中包括
Nhibernate
,Spring.net的一些配置信息,业务层的DAL注入. DirectCenter.UnitTest (类库项目) 使用nunit对业务层进行单元测试 DirectCenter.DTO (类库项目) data transform object 用于和前台UI层交互的实体。之所以分出来,也是为了考虑不只是为了Web项目,同时包括WebService等其它UI.(可能会有不少人会问已经有Model了,为什么还需要DTO?) DirectCenter.Controllers (类库项目) Web控制器。用户请求和后台业务层的中转,接收并分析用户请求,调用业务层完成请求,再分发给用户。(注意这里调用的是IBLL,是业务逻辑接口,也是通过Spring.Net的IOC注入具体的业务实现)。 DirectCenter.Web (Web Application) 单纯的View层,主要由ExtJs完成界面和Ajax请求。
Moon.Orm.NET.zip
Moon.Orm 主要特性如下: 高性能 这也是架构创建的目的之一,已经将它的性能提升到了极致,大家可以自己测试。简单给大家一个和ADO.NET 的性能对比测试。更多有关内容请看:http://www.cnblogs.com/humble/p/3472764.html (说明:同时请求10000 条数据,此图为一网友公司对moon.orm 的测评) 易用性强 用过Moon.Orm 的用户应该可以知道这点.配置简单,智能感知,代码生成器的辅助,会 sql 就可使用之。 多数据库多数据源同时支持 在同一个项目中我们常常需要处理这些情况时.目前moon 的目标,支持sqlserver 、sqlite、oracle、mysql 。 1.如果您需要换数据库:直接修改配置文件然后一键生成实体层即可; 2.如果您需要多数据库:直接添加配置文件即可.详情:Moon 使用配置说明 3.如果您的数据库表结构发生变动:一键重新生成实体层代码即可. 智能感知 这个不用讲了,值得一提的是MQL,她能够为你提供强大的智能感知功能,并且无数据库类型差异。 NET 2.0 原生支持. 有人问:为什么没有LINQ、lambda,因为设计理念不同.觉得MQL 复杂的人们,有了智能感知,你们就适应适应,因为这是萝卜白菜的
问题
。 使用便捷. 这个其实上面的链接也谈到,详情见:http://www.cnblogs.com/humble/p/3293500.html 灵活的事务支持 Moon.Orm 与其他数据库的对比: EF 微软团队支持(可谓强大的后盾) Linq lambda支持、可谓正统 坑多、性能欠佳、 多数据源及多数数据库变动支持不是很方便
Nhibernate
国外第三方支持 历史悠久( java hibernate),后续版本支持LINQ 使用麻烦、配置一堆、学习成本大 Moon.Orm 5.0 性能卓越 便捷易用 多数据源、多数据支持、.NET2.0原生支持 不支持Linq,因为和EF不是一个设计思路,但MQL便捷易用、灵活高效.同样提供MQL智能感知型的查询语言 标签:moonorm
.NET技术其他语言
1,979
社区成员
12,447
社区内容
发帖
与我相关
我的任务
.NET技术其他语言
.NET技术 其他语言讨论
复制链接
扫一扫
分享
社区描述
.NET技术 其他语言讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章