在延续了许久的2.0.x系列之后,Npgsql社区终于在今年3月发布了Npgsql 2.1.1。这个版本有很多重大改进,一会我会列出来。如果你细心观察代码,你会惊讶的发现几乎一半的代码被修改了。是的,最近一年左右的时间内,Npgsql社区的修正相当活跃,完全不是以前那种慢腾腾的状态。这一切可能得益于Francisco Figueiredo Jr.将代码托管到github之后提交Patch变得方便了,从而引爆了一部分hacker的热情。
下面来看看Npgsql 2.1有哪些主要的新功能吧!
1)Entity Framework 6.0的支持
提供对Entity Framework 6.0的初始支持,以后应该还会进一步加强。
Npgsql同时提供两个版本的Entity Framework支持dll。
Npgsql.LegacyEntityFramework.dll
EF6.0以前的dll
Npgsql.EntityFramework.dll
EF6.0及以前的dll
2)查询优化
这一版做了大量的客户端查询优化,我印象比较深的主要有下面两点
a)尽量使用Binary格式而不是Text格式发送数据。
b)可以要求Npgsql总是使用Prepare的方式发送查询。(需要设置AlwaysPrepare连接参数)
那么和以前的区别在什么地方呢?
举个例子,以前要把一个10字节的bytea参数传到服务端,要发类似这样的SQL语句。
insert into tbbytea values(1,((E'\\000\\001\\000\\000\\000\\000\\000\\000\\000\\000')))
每个字节编码成4个字符。.NET中每个字符占用系统字节数不止一个。 这样做无形中把本来只需10字节的数据的占用空间放大了很多倍,我们的实测表明在有1G内存的的系统里,最多只能插入30M大的bytea数据。响应的网络通信量也被放大了。
这只是一个方面,除了内存使用量的放大,Text格式也带来了很多不必要的数据转换上的时间消耗。
现在的版本更加倾向于使用Binary格式发送数据(对于上面的例子只需使用10个裸的字节);Text格式仍然支持,因为某些场合还离不开它。
需要说明的是,这个修正可不像表面看上去那么轻松。它涉及几十种数据类型,各种数据类型的转换以及处理流程上的各个函数。这大概也是Francisco Figueiredo Jr.在发布公告里把这些Patch的作者Glen Parker作为第一个感谢对象的原因。
3)使用.NET自带的SSLStream来支持SSL
以前Npgsql是通过Mono.Security.dll支持SSL的,现在由于使用.NET自带的SSLStream,用户可以扔掉恼人的Mono.Security.dll了。但出于兼容性的考虑,暂时现在同时提供两种方案,并且缺省还是使用Mono.Security.dll。
如果想使用新的SSLStream,需要设置下面的连接参数:
NpgsqlConnection.UseSslStream = true
4)项目重组
调整了项目的目录布局和一些其它东西。现在的Npgsql更容易在不同环境下编译,测试和发布。
其它还有很多修正(包括我的2个微不足道的修正),详细请看这里
https://github.com/npgsql/Npgsql/releases/tag/v2.1.0
和v2.1.0相比,v2.1.1只多了一个小的Bug修正
https://github.com/npgsql/Npgsql/releases/tag/v2.1.1