xhluo

学习再学习,一切都是为学习。 交流再交流,交流好了再学习。

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  23 Posts :: 9 Stories :: 138 Comments :: 0 Trackbacks

公告

搜索

 

常用链接

我参与的团队

最新随笔

积分与排名

  • 积分 - 56045
  • 排名 - 1359

最新评论

阅读排行榜

评论排行榜

2006年11月1日 #

项目中存在一部分数据迁移的工作,说白了就是从老的系统中将数据倒换的新的系统模型中,老系统的数据来源比较复杂多样,新的自然是Oracle9.2。
本来这也就是一次性工作,用SQL自然是最快的方式,不论是开发还是数据传输的速度。可是甲方偏偏要看到界面,希望这是一个成型的工具,没办法,甲方就是上帝。
公司原来也有一个迁移工具,可是只能适用于表对表的倒换,复杂一些无能为力,而且数据还巨慢,用过的人都是对它无语。
从新开发,不说花费和效果,光是时间也不行。没办法,只好看看现在流行的ETL的工具。
市场前列毋庸置疑,肯定是Informatia 和 DataStage.
Informatia没有,只好看看DataStage是否能适应现在的功能要求。不想,虽然是图形界面,可使用起来一点也不容易,而且安装后,Windows下居然不能脱离域环境,而且不是Server版本的Windows还不能运行Paralle Job。郁闷无比。
试了两天后,暂时放下。Microsoft的易用性比功能强大更吸引我。试试SQL Server 2005中的SSIS,号称企业级的ETL。
一用之后呢,没想还真有点喜欢上了它,从介绍的和界面上看一点也不比DataStage的功能少,性能,哈,下面就是我要说得了。
ETL工具最慢的部分都是L这一部分,按照一般的说法能占到总体时间的五分之四,所以这是关键。
测试也不算复杂,就是同样的数据抽取、转化、然后加载用不同的驱动分别跑一遍,目的库已经确定是Oracle,所以也没有太大的余地了。
在SSIS中,有两个驱动可以连接Oracle数据库,一个是Microsoft OLEDB Provider for Oracle,另外一个是Oracle Provider for OLEDB
不测不知道,还真长了不少见识。































同一机器,同一数据源,同一结果,两者间还真有不少区别。
首先是速度(连续三次):
   
Microsoft OLEDB Provider for Oracle     1分37 1分32 1分30                          
Oracle Provider for OLEDB               1分10 1分07 1分02

在速度上 Oracle Provider for OLEDB 基本符合 1分3万条左右,而Microsoft OLEDB Provider for Oracle 1分钟只有2万条左右。
照这样看,答案似乎也就出来了,Oracle Provider for OLEDB也就成了不二选择。
且慢,我还没有说明为什么选择25万条记录而不是别的数量的数据呢。
这就不得不说说内存的使用:未启动数据迁移时即停留在VS.Net设计界面时,内存已使用了790M左右,而我机器的物理内存也就896M。
运 行开始后,25万条记录下Microsoft OLEDB Provider for Oracle 平均在1G左右,而Oracle Provider for OLEDB乖乖得不得了,铁定在1.25G以上,一次还在1.3G。更离谱的是,原数据表中共有近100万条记录,Microsoft OLEDB Provider for Oracle在内存峰值1.5G左右可以顺利完成,而Oracle Provider for OLEDB在内存使用一旦突破1.3G往上一些,就开始不停提示内存不足,不在安心的迁移数据了,或者干脆显示为红色,报一些莫名的错误。
这就让人两难了,一个速度快了那么50%,可确是一个内存消耗大户,有没有止境,我这破机器也无从得知。
另外一个速度慢,可却节俭持家,穷人也照顾到了,哈。感觉好这有点像Oracle和MS的企业风格,一个走高端,为了需要的指标可以不计成本,穷人靠边;另一个呢,还不错,虽然也越来越来不鸟没钱的人,可还做得不太显眼。

最 后了,同样的数据源(Microsoft OLEDB Provider for Oracle驱动),将目的库换成SQL Server 2005,驱动为SQL Native Client,同样的数据数据转换,98.9万条记录中11.1万条入库,靠1分12完事,打开FastLoad,58秒搞定。而且都只是第一次运行,相 信如果多运行几次后,结果应该更好。别说,自家孩子真就不一样,别人的家的没法比。

由于数据库驱动接触并不多,希望那个大虾指点一下,能帮忙给找一个Windows下Oracle驱动可以媲美与SQL Native Client的,先谢了。
posted @ 2006-11-01 12:56 xhluo 阅读(983) | 评论 (2)编辑

2006年8月12日 #

我是一个懒人,更新Blog就可以看出来,再加上没有好的笔头,所以文章自然就少。
现在赋闲在家,正好整理一下这一年工作的心得。

虽然在公司带的是一个较小的应用项目,可是却像麻雀一样,样样俱全。数据访问、多层开发、B/S和C/S共存。
在项目完成后,还有产品化的需求。
虽然在职期间,设想并没有全部实现,可是这并不妨碍我继续按照需求思考下去。

通过这段时间的考虑以及实验,终于有一套我认为对类似项目的最佳方案。

在我的方案里,当然还是遵从前辈们提出的三层框架。

数据层还是使用我熟悉的开源软件iBatis.Net。
使用过的人可能知道,这是一套数据映射软件,走得是一条中间路线,符合一种中庸之道。但是在使用中有两个较大缺点:
1.需要一定的人力编写xml映射文件。
2.程序启动时需要较长的加载时间。
但是优点与缺点一样明显,可以在完全不用改动已有数据库系统的基础上立刻应用。这已在项目中得到了验证。
上述的两个缺点也不是不可克服。通过借鉴Java环境的例子,编写代码生成工具以大大减少工作量;对于C/S结构采取访问Web Services方式彻底将客户端与数据源之间的藕合松绑,同时也顺带解决了启动时间长的问题,并且可以通过重复加载配置文件,达到动态修改程序应用环境的目的。
在我的设想中,C/S和B/S程序访问访问的是同一套Web Services接口。

逻辑层则是一个与具体领域密切相关的问题,在这方面我没有太多的想法与经验。

我想说的反倒是表现层。在抛开版权不说(这一领域不了解),完全可以做到站在别人的肩膀上的开发。
对于与数据打交道的C/S架构下的程序说,一般软件界面都没有太多需要标新立异的要求,甚至还希望公司软件具有统一风格。
那么在这里,提出一下我的想法:利用SharpDevelop的框架作为程序的外壳。
简单列出一下几个优点:
1.可以做到几乎是全插件程度的软件开发。
2.状态保存功能已经实现,只需要作部分工作就可。
3. ...想到了很多,以后再说。
下面是我做试验是的一个程序界面截图:

可以注意一下左侧的属性窗口,这一类的功能可以灵活的放置到框架一级或是该程序功能一级。

通过作一些修改工作,可以在程序中动态控制可使用的插件。这是SharpDevelop自带的该功能,没有作任何工作就可以在程序使用,也是一个标准的插件。Manager和销售记录是实验代码加入的插件。
下面是插件的配置文件,是一种完全自解释的方式。有兴趣的可以看看:

<AddIn name        = "HshSale.App"
       author      
= "xhluo"
       copyright   
= ""
       description 
= "HshSale.App">
    
    
<Manifest>
        
<Identity name = "HshSale.App"/>
    
</Manifest>
    
    
<Runtime>
        
<Import assembly = "HshSale.App.dll">
        
</Import>
    
</Runtime>
    
  
<Path name = "/Workbench/MainMenu">
    
<MenuItem id = "Manager" label = "Manager" type="Menu"
              insertafter 
="View" insertbefore ="Tools">
      
<MenuItem id = "ProductManager"
              label 
= "产品管理"
              shortcut 
= "Control|P"
              class 
= "HshSale.App.ProductManagerCommand"/>
      
<MenuItem id = "DaySaleRecord"
               label 
= "日销售记录"
               icon 
= "Icons.16x16.NextWindowIcon"
               class 
= "HshSale.App.DaySaleRecordCommand"/>
    
</MenuItem>
 

    
<MenuItem id = "SaleRecord" label = "销售记录" type="Menu"
              insertafter 
="View" insertbefore ="Tools">
                    
<MenuItem id = "DaySaleRecord"
               label 
= "DaySaleRecord"
               icon 
= "Icons.16x16.NextWindowIcon"
               class 
= "HshSale.App.DaySaleRecordCommand"/>
       
</MenuItem>
  
</Path>

  
<Path name = "/Workbench/Pads">
    
<Pad id       = "ProjectBrowser"
             category 
= "Main"
             title    
= "${res:MainWindow.Windows.ProjectScoutLabel}"
             icon     
= "PadIcons.ProjectBrowser"
         shortcut 
= "Control|Alt|F"
         class    
= "HshSale.App.SDPad"/>
  
</Path>
  
</AddIn>

当然这不是一个立马可用的框架,权限和日志等必备功能还没有带全。但是作为一段实验性质的代码,我想已经达到了目的:即具备了在实际中使用的条件。而权限和日志当然也可以采用现有的各种思路放到程序中:AOP或是其他灵活性差一点但效率更高的方案。

在B/S结构,由于项目经验太少,就不多说。但从我了解的信息看,Dnn应该也可以接替SharpDevelop的作用。

抛砖引玉,一己之见。

posted @ 2006-08-12 17:52 xhluo 阅读(2387) | 评论 (13)编辑

2005年9月8日 #

有Excel的数据表结构,但是没有数据库实例,所有没有办法用PowerDesigner的反转功能。
300多张表,8000多个字段,而且数据表中的表名及字段名用中文代码缩写,想着都晕。
不过它内置的脚本功能确实不错,根据自带的脚本,写了一个实现从Excel读取表结构,包括Name、Code、DataType、Comments等。
Option Explicit

Dim mdl ' the current model
Set mdl = ActiveModel
If (mdl Is NothingThen
   
MsgBox "There is no Active Model"
End If

Dim HaveExcel
Dim RQ
RQ 
= vbYes 'MsgBox("Is Excel Installed on your machine ?", vbYesNo + vbInformation, "Confirmation")
If RQ = vbYes Then
   HaveExcel 
= True
   
' Open & Create Excel Document
   Dim x1  '
   Set x1 = CreateObject("Excel.Application")
   x1.Workbooks.Open 
"E:\数据库结构.xls"
   x1.Workbooks(1).Worksheets("Sheet1").Activate
Else
   HaveExcel 
= False
End If

a x1, mdl

sub a(x1, mdl)
dim rwIndex
dim tableName
dim colname
dim table
dim col
dim count

on error Resume Next
For rwIndex = 2016 To 2015
        
With x1.Workbooks(1).Worksheets("Sheet1")
            
If .Cells(rwIndex, 1).Value = "" Then
               
Exit For
            
End If
            
If .Cells(rwIndex, 3).Value = "" Then
               
set table = mdl.Tables.CreateNew
               table.Name 
= .Cells(rwIndex + 110).Value
               table.Code 
= .Cells(rwIndex + 19).Value
               count 
= count + 1
            
Else
               colName 
= .Cells(rwIndex, 1).Value
               
set col = table.Columns.CreateNew
               
'MsgBox .Cells(rwIndex, 1).Value, vbOK + vbInformation, "列"
               col.Name = .Cells(rwIndex, 1).Value
               
'MsgBox col.Name, vbOK + vbInformation, "列"
               col.Code = .Cells(rwIndex, 3).Value
               
               
if .Cells(rwIndex, 7).Value <> "" Then
                  col.Comment 
= "单位:" + .Cells(rwIndex, 7).Value + " 。  " + .Cells(rwIndex, 8).Value
               
else
                  col.Comment 
= .Cells(rwIndex, 8).Value
               
end if
               
               
if .Cells(rwIndex, 2).Value = "Y" Then
                  col.Primary 
= true
               
end if
               
If .Cells(rwIndex, 4).Value = "C" Then
                  col.DataType 
= "NVARCHAR2(" + .Cells(rwIndex, 5).Value + ")"
               elseif .Cells(rwIndex, 4).Value = "D" Then
                  col.DataType 
= "DATE"
               elseif .Cells(rwIndex, 4).Value = "N" Then
                  
if .Cells(rwIndex, 6).Value = "" Then
                     col.DataType 
= "NUMBER(" + .Cells(rwIndex, 5).Value + ")"
                  else
                     col.DataType 
= "NUMBER(" + .Cells(rwIndex, 5).Value + "" + .Cells(rwIndex, 6).Value + ")"
                  end if
               
end if
            
End If
        
End With
Next
MsgBox "生成数据表结构共计 " + CStr(count), vbOK + vbInformation, "表"

Exit Sub
End sub

posted @ 2005-09-08 11:21 xhluo 阅读(813) | 评论 (1)编辑

2005年8月5日 #

总算安顿下来了,再北京一家公司做C#。
刚集中培训完毕,下面是在岗培训阶段,工作日子算是真正的开始了。

blog的更新已经停了很长时间,不应该的事情发生的那么自然,好像我就根本就没有这个Blog似的。看来各位老大们的先进事迹在我的心灵并没有留下太多的痕迹。
这是我这年龄不该有的境界啊!心里哇凉哇凉的。

发了信没回的在这说声对不起。

“明天”我的Blog会重生的。

posted @ 2005-08-05 17:17 xhluo 阅读(388) | 评论 (1)编辑

2005年3月15日 #

老是不更新了,有事是一方面,我想可能也失去了刚开始的新鲜感了吧,
新的东西到啥也没学了,所以可以说得东西不多。
就来手边一些重复性的工作发个截图,算我三月的一篇文章了。

祝大家多进步。佩服Infragistics!!

习惯了放在首页原创.NET技术区,要是不妥,那就麻烦了。

posted @ 2005-03-15 21:52 xhluo 阅读(3010) | 评论 (2)编辑

2005年2月25日 #

     摘要: 一年又一年,最后一学期了,前面的路还是迷茫。这两天给朋友赶一个程序,用了用Infragistics的Grid控件,感觉考虑的实在周到。发几个贴图吧。设置编辑器为货币类型。 DefaultEditorOwnerSettings editorSettings = new DefaultEditorOwnerSettings(); editorSettings.MaskInput = "$ -nnn,...  阅读全文
posted @ 2005-02-25 11:56 xhluo 阅读(5080) | 评论 (14)编辑

2005年1月13日 #

     摘要: 想法最重要,要不就成了光是学习性质的了。这几天正在考虑怎么继续往后写,主要是现在的趋同性太强了,感觉没有什么拿的出手的东西。而且这个趋同性现在不单单表现在界面上了,一开始就是抄袭SharpReader的界面。而且在看过别人的代码后,感觉自家的代码简直就是小孩写的,全没有设计似的,有点备受打击,哈哈,所以动力小了。那么抄吧,那还自己做干吗?不抄吧,那是闭门造车,掩耳盗铃啊。 好的想法创意才是源动力。...  阅读全文
posted @ 2005-01-13 11:44 xhluo 阅读(1129) | 评论 (5)编辑

2005年1月11日 #

     摘要: 微软网站上的C++/CLI draft是1.5 的,从网上找到一份1.8版本,Oct, 2004的。 忘了在那找到的,现已上传,地址是:/Files/xhluo/C++-CLI draft 1.8.rar 和1.5相比,完善了不少,光页数就从199增加到228了。 有人用过Beta2CTP版的C++/CLI没有,可用性怎么样了??  阅读全文
posted @ 2005-01-11 13:25 xhluo 阅读(744) | 评论 (0)编辑

2005年1月10日 #

     摘要: 这两天学习了一下C++/CLI,将C#几个控件和例子翻写C++下,感觉确实还是属于Beta的语言,Bug是在不少,而且很多你就根本没有办法去调试。 列举如下,当然也有可能使我栽赃,水平不行,导致出现的错误。 1、首先是托管DirectX。 代码如下:         Texture^ CreateTextur...  阅读全文
posted @ 2005-01-10 12:41 xhluo 阅读(1177) | 评论 (1)编辑

2005年1月2日 #

     摘要: 本打算31号晚上写的,不想网不通,没办法,去年的总结就有今年来写了。 BlogReader也算到了0.4吧,太快了?没法,让我自我陶醉一下吧。 改动见上一篇文章,http://www.cnblogs.com/xhluo/archive/2004/12/29/83959.html Net2.0版本下的源程序和执行文件。(12.29修改) Net1.1版本下的源程序和执行文件。(12.29修改) 总体...  阅读全文
posted @ 2005-01-02 01:24 xhluo 阅读(1021) | 评论 (5)编辑