Log On
Search
About
Access Count: 16132
Posts: 26
Comment: 0
Welcome

Posts
Matrix blog支持的数据库
( 1/12/2012 2:25:00 AM )

  Matrix blog 在设计之初就考虑支持不同的数据库,因此数据层使用了Repository pattern,第一个实现是基于Entity framework的Code first来做的,避免了直接使用SQL语句,在开发期间只需要关注对象和对象间的关系就可以了,提高了开发效率,这也是Matrix blog开发时间短的一个原因。为了方便部署使用了SQL CE 4数据库,性能表现还不错,足以满足blog的日常事务。

  但部署到我购买的ISP的服务器时就出现问题了。SQL CE 4支持Bin deploy,所以在服务器上没有安装SQL CE也是可以正常运行的,但SQL CE需要运行在Full trust模式下,我的ISP服务器不支持trust模式设置,所以SQL CE没办法使用了,以前一直用Access数据库,所以没发现这问题。另外一个使用SQL CE的应用部署在一个香港ISP提供的服务器上,可以正常运行,他们的服务器支持trust模式设置,所以没费劲网站就上线了。咨询我购买的ISP的技术人员,半天也给不出个解决方案,想单独购买个数据库吧,发现成本比购买虚拟空间的成本还要高,对我一个个人用户来说颇觉得不值,一个做技术的人来说总有解决办法的。

 

方案一

  SQLite一个嵌入型数据库,跨平台,按官方说法支持web应用,并能满足日点击量在10万左右的网站应用。SQLite面世有很多年了,之前在解决一个桌面应用时就想使用了,后因其它原因放弃,现在SQLite提供了对Entity framework的支持,这样我的源代码不需要做任何的调整就可直接使用了,下载并测试果然好用,上传至服务器依然不好,报无法加载程序集的错误,后确定还是因为Medium trust模式所导致的,无法绕过网站的限制。经过实践发现SQLite是一个不错的嵌入数据库解决方案,使用时应该注意以下几个方面。

  • 注意区分32位与64位版本,SQLite是用C实现的,在编译时做了32位和64位编译,用错版本会导致数据库无法加载;
  • 在配置文件中需要做两个工作,一个是注册Entity framework的Provider,另一个是指定在.Net 4.0下的运行模式,如下
      1: <system.data>
    
      2:   <DbProviderFactories>
    
      3:     <remove invariant="System.Data.SQLite"/>
    
      4:     <add name="SQLite Data Provider"
    
      5:          invariant="System.Data.SQLite"
    
      6:          description=".Net Framework Data Provider for SQLite"
    
      7:          type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    
      8:   </DbProviderFactories>
    
      9: </system.data>
    
     10: 
    
     11: <startup useLegacyV2RuntimeActivationPolicy="true">
    
     12:   <supportedRuntime version="v4.0"/>
    
     13: </startup>

 

方案二

  Json.Net是一个不错的Json类库,性能很不错,纯.Net编写,在服务器上肯定可以运行,可以直接串行化和反串行化对象,这样可以与Repository pattern进行结合,我只需要实现一个基于Json的Repository即可。经过一天多的实现运行良好,而且性能还不错,模拟了上千个post文件,每个post被串行化为一个单独的文件,Json的加载速度很快。但问题又出现了,基于文件的保存只能模拟数据的保存,但对于对象之间的关系处理起来就很难,如Post和Category之间是many to many的关系,用文件的形式很难保存这种关系,如果要保存这种关系就需要自定义Json的串行化与反串行化,并在对象加载期间做额外的工作,开发时间与成本就要提高很多,其可维护性和可靠性也不太好保障,因为我需要的是一种简单、可靠的方式,这种方式也只好放弃。

 

方案三

  重新梳理了一下Matrix blog对数据存储的需求。

  • 可以使用Entity framework及Code first,这样我现有的实现都不需要调整;
  • 能够运行在Medium trust模式下;
  • 不需要做过多的工作,并且稳定,可靠;

  这时发现了Effiproz,一个免费、开源、纯.Net代码的数据库,支持medium trust模式,支持entity framework,基本符合我的需求,经初步测试可以在网站上运行。

  之后把已有数据迁移到Effiproz上了,在迁移的过程中出现了不少问题。

  • Effiproz网站经常不能访问,翻墙才可以,所以查文档时很费劲;
  • Effiproz的文档和例子还是不少的,但相对于SQL CE和SQLite来说差距比较明显,遇到问题时能获得的帮助比较少,得不断的摸索,测试;
  • 没有Code first的例子,Effiproz只提供了一个Entity framework的例子,显示的异常信息不准确,很难准确的知道是哪里出现了错误。我遇到一个问题在DbContext定义了个属性,但数据库中没有与其对应的表,这在SQL CE和SQlite中都可以正常运行,但Effiproz不行,并提示“Given key doesn’t exist in the dictionary”,查很久也没找到错误的具体原因;
  • Effiproz名字比较难记,到现在也不清楚作者为什么用这个名字。
  • 在程序运行过程中会出现较多的FormatException,导致性能下降,至今不知为什么。

  

  到目前为止Matrix blog可以支持的数据库如下:

  • SQL Server
  • SQL Server Express
  • SQL CE
  • SQLite
  • Effiproz

Read ( 48 ) | Comment ( 0 )

Comment ( 0 )

Leave a comment