架构设计之分布式数据访问
1:前言
看到这个题目也许有的朋友会问对数据访问层扩展为分布式有没有意义,因为不管怎样到最后都是对数据库进行访问,瓶颈在数据库上。对于这个问题我的答案是“我们提供分布式的查询能力然后和缓存结合让数据库中的数据缓存起来”。解决这个问题后我们来进入正题,如何对数据访问层进行封装。其实数据访问层的方法我们常用的是ExecuteDataset,ExecuteNonQuery,ExecuteReader,ExecuteScalar等这四个方法。
2:类图
3:原理
WCF中可以返回序列化的对象而DataRead是不能被序列化的(网上有人说可以让一个序列化的对象持有DataRead属性,这个方法根本不行)
这里我们就说说如何通过WCF来返回DataReader。
看过底层代码(System.Data.SqlClient)的都知道,微软在实现ExecuteReader这个方法的时候是用了一个类似于游标的东西。每Read一次游标就向下走一行。
这里我们可以借鉴这个思想。我们首先把所有IDataReader中的方法定义到契约中。然后让客户端实现该契约,这样客户端每Read一次服务端也同样Read一次。这样我们就可以获取到该行相应的字段值了。不过这种方法要求WCF的实例模型是PerSession而并发模型是Multiple。
4:一些问题
WCF在开启信道的时候如果通过这种方法
new ChannelFactory<IAdoHelper>(EndpointconfigKey).CreateChannel();
在压力测试的时候会报错。只有通过以下方法
new ChannelFactory<IAdoHelper>(bind, address).CreateChannel();
还有就是WCF中的信道池不知道怎么开启。MaxConnection好像不起作用,因此自己就实现了对象池来解决信道池的问题。【哪位仁兄知道不吝赐教】