2009年6月19日

[转]开始PFC之旅行

总结以前的失败教训,这次我根本就不看源代码,避免“见树不见林”的感觉。我从Online Help开始着,先阅读PFC的相关介绍,形成对PFC架构的雏形概念。

PFC其实分2大层,pfc层是源代码所在地,是Sybase发布的不允许用户修改的基础层;pfe是扩展层,所有对象都从pfc层继承过来,里面没有任何代码。基于这种情况,Sybase强烈要求用户不要修改pfc层的任何代码,因为Sybase升级PFC时,再次修改新版pfc就是一件高代价高风险的操作;PFC架构决定了程序员必须修改pfc代码,因此只能修改pfe层,pfc的升级对pfe的修改没有任何影响。

今天,我抓住要点,从Sybase提供的简单例子切入PFC的学习。效果出来了,我马上意识到n_cst_appmanager的重要性,于是我连夜看了这个object的帮助文档。成果如下:

应用程序不直接修改n_cst_appmanager,而是继承这个对象(以下讲的n_cst_appmanager函数、事件指的是它的后代,以n_cst_appmain为例子)。应用程序开始方法如下:(先不考虑完整性,目的是抓住重点)
      (1)在Application的open事件加入标准代码,不需要理会以下代码的作用。
             gnv_app = create n_cst_appmain
             gnv_app.Event pfc_open(commandline)
          只需要理会一点:应用程序需要n_cst_appmanager(这里是n_cst_appmain)管理本应用的外部属性(版权、INI文件路径、Logo等信息),这些属性会在splash窗口和About窗口等地方显示。
      (2)先撇开INI、Logo等次要信息,我们需要立即运行应用。n_cst_appmain被创建之后,PFC自动调用该object的pfc_open事件。这里就是所有程序开始的地方,类似没有PFC情况下在Application的open事件写代码。
      (3)是时候要为应用运行写代码了,首先要创建一个窗口,不用New,而是Inherit一个框架窗口w_frame。使用PFC框架编程基本上都是继承创建的。我们不需要写任何代码,直接保存命名为w_app_frame。然后在n_cst_appmain的pfc_open事件直接写入: open(w_app_frame) 
      (4)保存所有对象运行应用。。。。一切就这样开始了!!!!

应用是运行了,也正常关闭,但下一步就不会用了,所以只能依靠Online Help。首先我瞄准了n_cst_appmanager,对这个object的Attribute、Function、Event、Instance Variable进行通编浏览。心得如下:
    (1)n_cst_appmanager的祖先是pfc_n_base,原来它是PFC所有custom class user object的祖先类。细节先不管,知道就行。
    (2)阅读它的Instance Variable。在OO领域,核心就在Data,大部分Function是围绕这些Variable展开的。所以看Instance Variable就可以大概明白这个Object的用途。内容很多,什么n_cst_apppreference、n_cst_error、n_cst_security、w_frame等!!打住,不要陷入细节。粗略看了各变量描述,大致明白n_cst_appmanager只是一个容器,里面藏着N个服务对象的“指针”,包括本应用的环境属性。到此为止!!!
    (3)阅读它的Function。果然我猜对了,大部分是Get和Set函数,不需要理会。关注以下特别函数:
         of_About: 显示About窗口的。(这个窗口在哪里,逻辑怎样等细节,不需要理会)。里面提到应用主窗口(w_app_frame,幸好从w_frame继承过来)的菜单Help->About使用这个函数。操作一次果然如此,潜意识要我打开窗口w_about观摩庐山真面目。一打开其实也没有什么,只是有一种灵感突然闪了出来:里面的信息(版权、Logo、版本等)是否与n_cst_appmanagere的Instance Variable相关联。在n_cst_appmain的Constructor事件加入以下代码:
         of_SetCopyright("Hello copyright")
         of_SetVersion("Hello version")
      重新运行应用,打开Help->About,果然在About窗口出现了以上设定的信息。(到现在还不知道About窗口在哪!)
        
         of_Splash:Displays the w_splash window for the specified number of seconds. 根据例程,我在n_cst_appmain的pfc_open事件该为如下代码:
             of_Splash(1)
             open(w_app_frame)
      重新运行应用,在w_app_frame之前出现的一个Splash窗口,时长大概1秒,里面包含了之前设定的版权、版本信息。真是一脉相连。(到现在还不知道Splash窗口在哪!)   

--- 困了累了,不喝红牛,还是睡觉吧。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/damsonli/archive/2006/11/30/1421743.aspx

 

 

 

回忆了昨天的PFC学习过程,发现在最后的阶段关于of_about、of_splash的研究,感觉有点偏离方向了,这不重要的东西干嘛花时间看它呢?今天决定要纠正。

继续昨天的自学历程。

n_cst_appmanager最后一个Function是很重要的,决心深入研究。它就是
    of_logonDlg:Displays the w_logon dialog box and then calls the pfc_Logon event, allowing you to log the user on to the database.
    “登陆”是企业软件所必需的功能,涉及权限分配问题。在这里,我不想把Database关联起来,只想掌握处理机制。

通常of_logonDlg是在n_cst_appmanager的事件pfc_open被调用,代码如下:
 choose case this.of_LogonDlg()
  case SUCCESS  // 1
   // 登陆成功
  case NO_ACTION //0
   // 用户点击cancel按钮
  case else  // -1
   // 用户不存在或者密码错误
 end choose
 of_splash(1)
 open(w_app_frame)

弹出w_logon窗口(不知道什么东西,反正是让用户输入用户名和密码),用户点击OK或者Cancel按钮之后,PFC触发nst_appmanager的事件pfc_logon,真正的登陆逻辑就在这个事件里编写了。

接下来应该是对数据库连接进行学习了,以MSSQL为例子。幸好以前有累积,我马上把注意力集中到n_tr这个object。

n_tr: Transaction object for use with all PFC applications. You can use this object as is, or create DBMS- or application-specific descendants that include customized or extended functionality.
N_tr includes integration with the SQL Spy debugging service.

从理解上,n_tr是对诸如commit;rollback;connect等statement进行了封装,并加强了事务管理。因为它的祖先类是Transaction,与SQLCA一样。本质上,n_tr的实例变量用于替换默认全局事务变量SQLCA.(如果对Transaction不熟悉,请参考Online Help)。

注意一点,使用n_tr不用担心disconnect问题,n_tr的destructor事件会自动释放资源,类似JAVA的垃圾回收,具体描述如下:If the instance is still connected to a database, this event commits or rolls back the transaction, depending on the ib_autorollback instance variable. It then disconnects the transaction. This event's functionality is meant to ensure efficient use of system resources. However, it's best to commit, rollback, and disconnect explicitly using this object's of_Commit, of_Rollback, and of_Disconnect functions.

接下来阅读本object的函数,比较多,看起来有点晕!所以我决定找一个例子看。最好的方法是使用Debug。

以下是增加一个MSS数据库连接的做法(前提是MSS数据库已经配置正确)
第一步:n_tr被实例化为一个Global变量,替换SQLCA。代码加入Global Variable 列表:
 /*  Application Manager  */
 n_cst_appmanager gnv_app

 // The main window  
 w_app_frame gw_frame

 // Application Transaction
 n_tr gn_sqlca
  
第二步:在n_cst_appmanager实例的constructor事件加入ini文件注册,代码如下(粗体是新增内容)
 this.of_SetVersion("Hello version")
 this.of_SetCopyright("Hello copyright")
 this.of_SetFrame(w_app_frame)
 this.of_SetAppIniFile("d:\damson\programs\pfc_test\genapp.ini")

第三步:genapp.ini文件如下(注意,数据项名称必须与Transaction的属性名相同,不区分大小写)
 [Database]
 BMS=MSS
 ServerName=(local)
 Database=tsecure
 LogID=tsecure
 LogPassword=tsecure
 AutoCommit=False
 DBParm =

第四步:在n_cst_appmanager实例的pfc_open事件进行数据库连接,代码修改如下:
 Long  ll_return  // Return value of a function or others
 gn_sqlca = create n_tr  // Do no warry about Destory

 ll_return = gn_sqlca.of_init ( gnv_app.of_getAppIniFile(), "Database" )
 if ll_return <> SUCCESS then
  Messagebox("error","Error to initial sqlca!")
  this.Event pfc_exit()
 end if

 ll_return = gn_sqlca.of_connect()
 if ll_return <> 0 then
  Messagebox("error","Error to connect db!")
  this.Event pfc_exit()
 end if

 choose case this.of_LogonDlg()
  case SUCCESS  // 1
   // 登陆成功
  case NO_ACTION //0
   // 用户点击cancel按钮
  case else  // -1
   // 用户不存在或者密码错误
 end choose
 of_splash(1)
 open(w_app_frame)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/damsonli/archive/2006/12/04/1429209.aspx

 

posted @ 2009-06-19 09:39 天下 阅读(119) 评论(0) 编辑

2009年6月18日

查询同一表内多字段同时重复记录的SQL语句

  1. 查询同一表内多字段同时重复记录的SQL语句    
  2. 来自:7th string    
  3.   
  4.   
  5. 比如现在有一人员表  (表名:peosons)    
  6. 若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来 select   p1.*   from   persons   p1,persons   p2   where   p1.id<>p2.id   and   p1.cardid   =   p2.cardid   and   p1.pname   =   p2.pname   and   p1.address   =   p2.address    
  7. 可以实现上述效果.    
  8. 几个删除重复记录的SQL语句    
  9.       
  10. 1.用rowid方法    
  11. 2.用group by方法    
  12. 3.用distinct方法    
  13.       
  14. 1。用rowid方法    
  15. 据据Oracle带的rowid属性,进行判断,是否存在重复,语句如下:    
  16. 查数据:    
  17.      select * from table1 a where rowid !=(select   max(rowid)      
  18.      from table1 b where a.name1=b.name1 and a.name2=b.name2......)    
  19. 删数据:    
  20.     delete   from table1 a where rowid !=(select   max(rowid)      
  21.      from table1 b where a.name1=b.name1 and a.name2=b.name2......)    
  22. 2.group by方法    
  23. 查数据:    
  24.   select count(num), max(name) from student --列出重复的记录数,并列出他的name属性    
  25.   group by num    
  26.   having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次    
  27. 删数据:    
  28.   delete from student    
  29.   group by num    
  30.   having count(num) >1    
  31.   这样的话就把所有重复的都删除了。    
  32. 3.用distinct方法 -对于小的表比较有用    
  33. create table table_new as   select distinct *   from table1 minux    
  34. truncate table table1;    
  35. insert into table1 select * from table_new;    
  36.   
  37.   
  38. 查询及删除重复记录的方法大全    
  39.   
  40. 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断    
  41. select * from people    
  42. where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)    
  43.   
  44.   
  45. 2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录    
  46. delete from people    
  47. where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)    
  48. and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)    
  49.   
  50.   
  51. 3、查找表中多余的重复记录(多个字段)    
  52. select * from vitae a    
  53. where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)    
  54.   
  55.   
  56. 4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录    
  57. delete from vitae a    
  58. where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)    
  59. and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)    
  60.   
  61.   
  62. 5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录    
  63. select * from vitae a    
  64. where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)    
  65. and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)    
  66.   
  67.   
  68. (二)    
  69. 比方说    
  70. 在A表中存在一个字段“name”,    
  71. 而且不同记录之间的“name”值有可能会相同,    
  72. 现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;    
  73. Select Name,Count(*) From A Group By Name Having Count(*) > 1    
  74. 如果还查性别也相同大则如下:    
  75. Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1    
  76.   
  77.   
  78. (三)    
  79. 方法一    
  80. declare @max integer,@id integer    
  81. declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1    
  82. open cur_rows    
  83. fetch cur_rows into @id,@max    
  84. while @@fetch_status=0    
  85. begin    
  86. select @max = @max -1    
  87. set rowcount @max    
  88. delete from 表名 where 主字段 = @id    
  89. fetch cur_rows into @id,@max    
  90. end    
  91. close cur_rows    
  92. set rowcount 0    
  93.   
  94.   
  95. 方法二    
  96. "重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。    
  97.   
  98.   
  99.   1、对于第一种重复,比较容易解决,使用    
  100. select distinct * from tableName    
  101.   就可以得到无重复记录的结果集。    
  102.   如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除    
  103. select distinct * into #Tmp from tableName    
  104. drop table tableName    
  105. select * into tableName from #Tmp    
  106. drop table #Tmp    
  107.   发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。    
  108.   
  109.   
  110.   2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下    
  111.   假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集    
  112. select identity(int,1,1) as autoID, * into #Tmp from tableName    
  113. select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID    
  114. select * from #Tmp where autoID in(select autoID from #tmp2)    
  115.   最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)    
  116.   
  117.   
  118. (四)    
  119. 查询重复    
  120. select * from tablename where id in (    
  121. select id from tablename    
  122. group by id    
  123. having count(id) > 1    
  124. )   

posted @ 2009-06-18 03:58 天下 阅读(719) 评论(0) 编辑

2009年2月15日

数据库设计中的14个关键技巧收藏[转]

1. 原始单据与实体之间的关系

 可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

  〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。

 2. 主键与外键

 一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。

  主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

 3. 基本表的性质

  基本表与中间表、临时表不同,因为它具有如下四个特性:

   (1) 原子性。基本表中的字段是不可再分解的。

   (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。

   (3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。

   (4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

  理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

 4. 范式标准

  基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

  〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

  在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

  5. 通俗地理解三个范式

  通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

  •第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
    •第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
       •第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

  没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

6. 要善于识别与正确处理多对多的关系

  若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

  〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

   7. 主键PK的取值方法

   PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

   8. 正确认识数据冗余

  主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

  〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

posted @ 2009-02-15 18:50 天下 阅读(135) 评论(0) 编辑

走出海量数据及访问量压力困境收藏[转]

随着中国大型IT企业信息化速度的加快,大部分应用的数据量和访问量都急剧增加,大型企业网站正面临性能和高数据访问量的压力,而且对存储、安全以及信息检索等等方面都提出了更高的要求…… 

    本文中,我想通过几个国外大型IT企业及网站的成功案例,从Web技术人员角度探讨如何积极地应对国内大型网站即将面临的扩展(主要是技术方面,而较少涉及管理及营销等方面)矛盾。

一、 国外大型IT网站的成功之道
(一) MySpace
    今天,MySpace已经成为全球众口皆碑的社区网站之王。尽管一流和营销和管理经验自然是每个IT企业取得成功的首要因素,但是本节中我们却抛弃这一点,而主要着眼于探讨在数次面临系统扩张的紧急关头MySpace是如何从技术方面采取应对策略的。
第一代架构—添置更多的Web服务器
    MySpace最初的系统很小,只有两台Web服务器(分担处理用户请求的工作量)和一个数据库服务器(所有数据都存储在这一个地方)。那时使用的是Dell双CPU、4G内存的系统。在早期阶段,MySpace基本是通过添置更多Web服务器来对付用户暴增问题的。但到在2004年早期,在MySpace用户数增长到五十万后,其数据库服务器已经开始疲于奔命了。

第二代架构—增加数据库服务器
    与增加Web服务器不同,增加数据库并没那么简单。如果一个站点由多个数据库支持,设计者必须考虑的是,如何在保证数据一致性的前提下让多个数据库分担压力。

    MySpace运行在三个SQL Server数据库服务器上—一个为主,所有的新数据都向它提交,然后由它复制到其它两个;另两个数据库服务器全力向用户供给数据,用以在博客和个人资料栏显示。这种方式在一段时间内效果很好——只要增加数据库服务器,加大硬盘,就可以应对用户数和访问量的增加。

    这一次的数据库架构按照垂直分割模式设计,不同的数据库服务于站点的不同功能,如登录、用户资料和博客。垂直分割策略利于多个数据库分担访问压力,当用户要求增加新功能时,MySpace只需要投入新的数据库加以支持。在账户到达二百万后,MySpace还从存储设备与数据库服务器直接交互的方式切换到SAN(存储区域网络)—用高带宽、专门设计的网络将大量磁盘存储设备连接在一起,而数据库连接到SAN。这项措施极大提升了系统性能、正常运行时间和可靠性。然而,当用户继续增加到三百万后,垂直分割策略也变得难以维持下去。

第三代架构—转到分布式计算架构
    几经折腾,最终,MySpace将目光移到分布式计算架构——它在物理上分布的众多服务器,整体必须逻辑上等同于单台机器。拿数据库来说,就不能再像过去那样将应用拆分,再以不同数据库分别支持,而必须将整个站点看作一个应用。现在,数据库模型里只有一个用户表,支持博客、个人资料和其他核心功能的数据都存储在相同数据库。

    既然所有的核心数据逻辑上都组织到一个数据库,那么MySpace必须找到新的办法以分担负荷——显然,运行在普通硬件上的单个数据库服务器是无能为力的。这次,不再按站点功能和应用分割数据库,MySpace开始将它的用户按每百万一组分割,然后将各组的全部数据分别存入独立的SQL Server实例。目前,MySpace的每台数据库服务器实际运行两个SQL Server实例,也就是说每台服务器服务大约二百万用户。据MySpace的技术人员说,以后还可以按照这种模式以更小粒度划分架构,从而优化负荷分担。

第四代架构—求助于微软方案
    2005年早期,账户达到九百万,MySpace开始用微软的C#编写ASP.NET程序。在收到一定成效后,MySpace开始大规模迁移到ASP.NET。
    账户达到一千万时,MySpace再次遭遇存储瓶颈问题。SAN的引入解决了早期一些性能问题,但站点目前的要求已经开始周期性超越SAN的I/O容量——即它从磁盘存储系统读写数据的极限速度。

第五代架构—增加数据缓存层并转到支持64位处理器的SQL Server 2005
    2005年春天,MySpace账户达到一千七百万,MySpace又启用了新的策略以减轻存储系统压力,即增加数据缓存层——位于Web服务器和数据库服务器之间,其唯一职能是在内存中建立被频繁请求数据对象的副本,如此一来,不访问数据库也可以向Web应用供给数据。

    2005年中期,服务账户数达到两千六百万时,MySpace因为我们对内存的渴求而切换到了还处于beta测试的支持64位处理器的SQL Server 2005。升级到SQL Server 2005和64位Windows Server 2003后,MySpace每台服务器配备了32G内存,后于2006年再次将配置标准提升到64G。

    事实上,MySpace的Web服务器和数据库仍然经常发生超负荷,其用户频繁遭遇“意外错误”和“站点离线维护”等告示,他们不得不在论坛抱怨不停…… 

    MySpace正是在这样不断重构站点软件、数据库和存储系统中,才一步步走到今天。事实上,MySpace已经成功解决了很多系统扩展性问题,其中存在相当的经验值得我们借鉴。MySpace系统架构到目前为止保持了相对稳定,但其技术人员仍然在为SQL Server支持的同时连接数等方面继续攻坚,尽可能把事情做到最好。

(二) Amazon
    亚马逊书店无疑是电子商务发展的里程碑。2000年到现在,世界网络业腥风血雨。Amazon曾经成为网络泡沫的头号代表。如今,当这个“最大的泡沫”用几经易改的数字把自己变成了坚实的IT巨人。

    历览Amazon发展过程,其成功经验在于,它创造性地进行了电子商务中每一环节的探索,包括系统平台的建设,程序编写、网站设立、配送系统等等方面。用Amazon当家人贝索斯的话说就是,“在现实世界的商店最有力的武器就是地段,地段,地段,而对于我们来说最重要的三件事就是技术,技术,技术。”

(三) eBay
    eBay是世界闻名的拍卖网站,eBay公司通信部主管凯文•帕斯格拉夫认为,“eBay成功的最重要原因在于公司管理和服务。”
    其成功的奥秘可以列举为以下几点:
    ①敢为天下先—在网络尚不普及的时代,eBay率先进入网络拍卖领域;
    ②依托虚拟商场所产生的特有的“零库存”是eBay公司取得成功的另一个重要原因。该公司的核心业务没有任何库存风险,所有的商品都是由客户提供,它只需要负责提供虚拟的拍卖平台—网络和软件。所以,eBay公司的财务报表上不会出现“库存费用”和“保管费用”等。
③自eBay公司成立开始,它就一直遵循两条“黄金原则”:建设虚拟社区,给网民以家的感觉;保证网站稳定安全地运行。

二、 国内大型网站开发时的几点建议
    从本节开始,我们将结合国内外大型IT网站在技术扩展方面的沉痛教训和成功经验,探讨在如今刚刚开始的Web 2.0时代如何应对国内网站即将面临的数据访问量增加(甚至是急剧膨胀)的问题,并提出一些供参考的策略和建议。

(四) 搭建科学的系统架构
    构建大型的商业网站绝对不可能像构建普通的小型网站一样一蹴而就,需要从严格的软件工程管理的角度进行认真规划,有步骤有逻辑地进行开发。对于大型网站来说,所采用的技术涉及面极其广泛,从硬件到软件、编程语言、数据库、Web服务器、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。以著名的Yahoo!为例,他们的每一个大型网站工程都需要大量相应专业人员的参与。

(五) 页面静态化
    可不要小看纯静态化的HTML页面!其实在很多情况下,HTML往往意味着“效率最高、消耗最小”,所以我们尽可能使我们的网站上的页面采用静态页面来实现。但是,对于大量内容并且频繁更新的网站,我们无法全部手动实现,因此可以开发相应的自动化更新工具,例如我们常见的信息发布系统CMS。像我们经常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的。信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

(六) 存储问题
    存储也是一个大问题,一种是小文件的存储,比如图片这类;另一种是大文件的存储,比如搜索引擎的索引。
大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃,在应用服务器和图片服务器上,可以进行不同的配置优化以保证更高的系统消耗和执行效率。

(七) 数据库技术—集群和库表散列
    对于大型网站而言,使用大型的数据库服务器是必须的事情。但是,在面对大量访问的时候,数据库的瓶颈仍然会显现出来,这时一台数据库将很快无法满足应用,于是我们需要借助于数据库集群或者库表散列技术。

    在数据库集群方面,很多数据库厂商都有自己的解决方案,Oracle、Sybase、SQL Server等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案。因此,你使用了什么样的数据库,就参考相应的解决方案来实施即可。

    上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用数据库类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,其中,库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。在这一方面一个现成的例子就是搜狐。它的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。

(八) 缓存策略
    这绝对不单指低级的缓存技术相关的编程,应从整个架构角度着眼,深入研究Web服务器、数据库服务器的各层级的缓冲策略,最后才是低级的缓冲技术的编程。不同的Web服务器、数据库服务器及Web编程语言都有自己不同的缓冲策略。例如数据库存储方面,SQL Serve 2005中的主动式缓存机制,Oracle数据的cache group技术,Hibernate的缓存包括Session的缓存和SessionFactory的缓存;Web服务器方面,Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力,IIS缓冲器技术;至于web开发语言,所用缓存技术更存在很大不同,例如ASP.NET 2.0中提出了两种缓存应用程序数据和缓存服务页输出的策略,这两种缓存技术相互独立但不相互排斥,PHP有Pear的Cache模块,等等。

(九) 镜像
    镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。

(十) 负载均衡
    负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,基于LAMP解决方案的Lighttped+Squid是相当不错的解决负载均衡和加速系统的有效方式。

(十一) 硬件四层交换
    第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。

    在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。

(十二) 软件四层交换
    大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的。

    一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。

(十三) 软件投资问题
    据报导,目前国内除了一些上市企业和特别大知名大公司以外,很少有企业在成本中考虑正版软件的购置费用。这种思维极有可能给中国互联网带来噩梦。如果一些公司真正面临软件资金方面的困难,完全可以考虑使用开源世界的LAMP解决方案(Linux+Apache+MySQL+Perl、PHP或者Python Web编程语言);否则,随着我国加入WTO范围的不断扩大,盗版打击必然越来越严。因此,“苟且偷生”必将自食其果。

    另外,随着网络带宽日渐提升,WEB 2.0技术必将影响到网络世界的几乎每一个角落。因此,如何积聚技术人员进行技术攻关并进一步加强安全防范也成为一个日益严峻的问题,宜尽早纳入到公司的议事日程。 
  
四、 总结
    中国电子商务真正理性发展的一个标志,是大量的传统企业实实在在地开始用互联网来处理商务、做生意,而现在这样的浪潮已经开始。北京发行集团,联合SINA、6688.com等单位共同推出的网上虚拟书店—新新书店就是这样的一个标志。

    随着网络带宽日渐提升,随着网络理念和WEB 2.0技术的断深入人心,各种B2B、B2C、C2C等电子商务模式很可能以立体交叉方式整合到各种大型商务网站中来。因此,作为公司的技术人员,作为临危救驾的“白衣骑士”,如何应对海量存储、海量访问问题,海量信息检索的问题,日益严峻的安全问题,等等,已经刻不容缓。

posted @ 2009-02-15 18:47 天下 阅读(139) 评论(0) 编辑

大型网站架构设计[转]

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。

大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。

上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。

1、HTML静态化
其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。

同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

2、图片服务器分离
大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃,在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率。

3、数据库集群和库表散列
大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。

在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。

上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。

4、缓存
缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。
架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。
网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,.net不是很熟悉,相信也肯定有。

5、镜像
镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。

6、负载均衡
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。
硬件四层交换
第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。

软件四层交换
大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。
软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。

一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。

对于大型网站来说,前面提到的每个方法可能都会被同时使用到,我这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会,有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大,希望大家一起讨论,达到抛砖引玉之效。

posted @ 2009-02-15 18:43 天下 阅读(290) 评论(0) 编辑

2009年1月12日

(转)各主要数据库的连接串

各主要数据库的连接串

将连接方式分为两大类,一类是OLEDB方式,一类是ODBC方式。收集了一段时间,整理出来,欢迎补充和修正。谢谢。
ADO.NET方式的连接与ADO类似,这里不加整理。

数据库连接串:
****A.OLEDB方式:
1.Oracle
标准连接(Standard Security):
"Provider=msdaora;Data Source=MyOracleDB;User Id=UserName;Password=asdasd; "
这是Microsoft的格式, 下面是Oracle的格式(提供者不同)
"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;UserId=Username;Password=asdasd; "
注意: "Data Source= " 必须根据相应的命名方法设置为Net8名称。例如对于局部命名,它是tnsnames.ora中的别名,对于Oracle命 名,它是Net8网络服务名。
信任连接(Trusted Connection):
"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1; "
或者设置user ID为 "/ "
"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=/;Password=; "
2.SQL Server
标准连接(Standard Security):
"Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;User Id=sa;Password=asdasd; "
信任连接(Trusted connection):
"Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI; "
(如果连接一个具体的已命名SQLServer实例,使用Data Source=Servere Name\Instance Name;但仅适用于 SQLServer2000)例 如: "Provider=sqloledb;Data Source=MyServerName\MyInstanceName;Initial Catalog=MyDatabaseName;User Id=MyUsername;Password=MyPassword; "
连接时弹出输入用户名和口令对话框:
Conn.Provider = "sqloledb "
Conn.Properties( "Prompt ") = adPromptAlways
Conn.Open "Data Source=Aron1;Initial Catalog=pubs; "
通过IP地址连接:
"Provider=sqloledb;Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=pubs;UserID=sa;Password=asdasd; "
(DBMSSOCN=TCP/IP代替Named Pipes, Data Source的末尾是需要使用的端口号(缺省为1433))
3.Access
标准连接(Standard Security):
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;User Id=admin;Password=; "
组连接 (系统数据库)
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet OLEDB:System Database=system.mdw; ", "admin ", " "
带口令的连接:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet OLEDB:Database Password=MyDbPassword; ", "admin ", " "
4.MySQL
标准连接:
"Provider=MySQLProv;Data Source=mydb;User Id=UserName;Password=asdasd; "
Data Source是MySQL数据库的名字,也可以使用server=localhost;DB=test

5.DB2
OLE DB, OleDbConnection (.NET) from ms
TCP/IP:
"Provider=DB2OLEDB;Network Transport Library=TCPIP;Network Address=XXX.XXX.XXX.XXX;Initial Catalog=MyCtlg;Package Collection=MyPkgCol;Default Schema=Schema;User ID=MyUser;Password=MyPW "
APPC:
"Provider=DB2OLEDB;APPC Local LU Alias=MyAlias;APPC Remote LU Alias=MyRemote;Initial Catalog=MyCtlg;Package Collection=MyPkgCol;Default Schema=Schema;User ID=MyUser;Password=MyPW "
AS400
"Provider=IBMDA400;Data source=myAS400;User Id=myUsername;Password=myPassword; "
6.Excel
标准连接(Standard Security):
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\DatabasePath\DBSpreadSheet.xls;Extended Properties=\ "\ "Excel 8.0;HDR=Yes;\ "\ "; "
注意:如果 "HDR=Yes ",那么提供者不会在记录集中包括选择的第一行,如果,那么提供者将在记录集中包括单元范围(或已经命名范 围)的第一行
7.txt(.csv, .txt, .tab)
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\DatabasePath\;Extended Properties=\ "\ "text; "HDR=Yes;FMT=Delimited; \ "\ "; "
注意在书写sql语句时必须指定文件名(如 "Select Name, Address From Clients.txt ").
8.VFP(.dbc, .dbf)
标准连接:
"Provider=vfpoledb;Data Source=C:\DatabasePath\MyDatabase.dbc; "

"Provider=VFPOLEDB.1;Data Source=d:\temp;Password= " ";Collating Sequence=MACHINE "
9.Interbase
标准连接:
"provider=sibprovider;location=localhost:;data source=c:\databases\gdbs\mygdb.gdb;user id=SYSDBA;password=masterkey "
指定字符集:
"provider=sibprovider;location=localhost:;data source=c:\databases\gdbs\mygdb.gdb;user id=SYSDBA;password=masterkey;character set=ISO8859_1 "
指定角色:
"provider=sibprovider;location=localhost:;data source=c:\databases\gdbs\mygdb.gdb;user id=SYSDBA;password=masterkey;role=DIGITADORES "
" 需要了解更多请链接到Interbase的如下Borland开发者网络文章 http://community.borland.com/article/0,1410,27152,00.html
10.Sybase
Adaptive Server Anywhere (ASA):
"Provider=ASAProv;Data source=myASA "
Adaptive Server Enterprise (ASE)(带数据源为.IDS文件):
"Provider=Sybase ASE OLE DB Provider; Data source=myASE "
注意你必须使用数据管理器来创建一个数据源.IDS文件.这些.IDS 文件类似于ODBC DSNs.
补充:
Outlook 2000 personal mail box
"Provider=Microsoft.Jet.OLEDB.4.0;Outlook 9.0;MAPILEVEL=;DATABASE=C:\Temp\; "
使用任何临时文件夹代替c:\temp。这将在那个文件夹创建一个模式文件,当你打开它时,它会显示可以得到的所有字段。空的 mapilevel表明最高层的文件夹。
Exchange mail box
"Provider=Microsoft.Jet.OLEDB.4.0;Exchange 4.0;MAPILEVEL=Mailbox - Pat Smith ¦DATABASE=C:\Temp\; "
使用任何临时文件夹代替c:\temp.
注意:你能象数据库一样对mail store输入查询
举例: "SQL "SELECT Contacts.* FROM Contacts; "
****B.ODBC方式:
1.Oracle
新版本:
"Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd; "
旧版本:
"Driver={Microsoft ODBC Driver for Oracle};ConnectString=OracleServer.world;Uid=myUsername;Pwd=myPassword; "

2.SQL Server
标准连接(Standard Security):
DRIVER=Sql Server;SERVER=计算机名或IP地址;UID=用户名;PWD=密码;APP=Microsoft Visual FoxPro;WSID=计算机名或IP地址;DATABASE=数据库名 &&完整连接串:命名管道方式
DRIVER=Sql Server;SERVER=计算机名或IP地址;UID=用户名;PWD=密码;DATABASE=数据库名 &&连接串:命名管道方式

DRIVER=Sql Server;SERVER=计算机名或IP地址;UID=用户名;PWD=密码;APP=Microsoft Visual FoxPro;WSID=计算机名或IP地址;DATABASE=数据库名;Network=DBMSSOCN;Address=计算机名或IP地址, 1433 &&完整连接串:&TCP/IP方式
DRIVER=Sql Server;SERVER=计算机名或IP地址;UID=用户名;PWD=密码;DATABASE=数据库名;Network=DBMSSOCN; Address=计算机名或IP地址,1433 &&连接串:&TCP/IP方式

"Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd; "
1)当服务器为本地时Server可以使用(local);
"Driver={SQL Server};Server=(local);Database=pubs;Uid=sa;Pwd=asdasd; "
2)当连接远程服务器时,需指定地址、端口号和网络库
"Driver={SQL Server};Server=130.120.110.001;Address=130.120.110.001,1052;Network=dbmssocn;Database=pubs;Uid=sa;Pwd=asdasd; "
注:Address参数必须为IP地址,而且必须包括端口号
信任连接(Trusted connection): (Microsoft Windows NT 集成了安全性)
"Driver={SQL Server};Server=Aron1;Database=pubs;Trusted_Connection=yes; "
或者
"Driver={SQL Server};Server=Aron1;Database=pubs; Uid=;Pwd=; "
连接时弹出输入用户名和口令对话框:
Conn.Properties( "Prompt ") = adPromptAlways
Conn.Open "Driver={SQL Server};Server=Aron1;DataBase=pubs; "

3.Access
标准连接(Standard Security):
"Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydatabase.mdb;Uid=Admin;Pwd=; "
组(系统数据库)连接 (Workgroup):
两种方法分别为:在连接串或在打开数据集中指定用户名和口令
"Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydatabase.mdb;SystemDB=C:\mydatabase.mdw; ", "admin ", " " 或
if(pDB.Open( "Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydatabase.mdb;SystemDB=C:\mydatabase.mdw; ", " ", "DatabaseUser ", "DatabasePass "))
{DoSomething();pDB.Close();}
独占方式(Exclusive):
"Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydatabase.mdb;Exclusive=1;Uid=admin;Pwd= "
4.MySQL
本地数据库:
"Driver={mySQL};Server=mySrvName;Option=16834;Database=mydatabase; "
Sever参数也可以使用localhost作为其值
远程数据库:
"Driver={mySQL};Server=data.domain.com;Port=3306;Option=131072;Stmt=;Database=my- database;Uid=username;Pwd=password; "
Option值 取值的含义
1 客户端不能处理MyODBC返回一列真实宽度的情况
2 客户端不能处理MySQL返回影响的行的真实值的情况
如果设置此标志,MySQL返回 'found rows '。 MySQL 3.21.14或更新版才能生效
4 在c:\myodbc.log中生成一个调试日志。这与在`AUTOEXEC.BAT '中的设置MYSQL_DEBUG=d:t:O,c::\myodbc.log相同
8 对于结果和参数不设置任何包限制
16 不使驱动器弹出问题
32 使用或去除动态游标支持。这在MyODBC 2.50中是不允许的
64 在 'database.table.column '中忽略数据库名字的使用
128 强制使用ODBC管理器游标
256 去除扩展取值(fetch)的使用
512 充满char字段满长度
1024 SQLDescribeCol()函数返回完全满足条件的列名
2048 使用压缩的服务器/客户端协议
4096 告诉服务器在函数后和 '( '前忽略空格 (PowerBuilder需要)。这将产生所有函数名关键词
8192 使用命名管道连接运行在NT上的Mysqld服务器
16384 将LONGLONG列改为INTl列(有些应用不能处理LONGLONG列)
32768 从SQLTables中返回 'user '作为Table_qualifier和Table_owner
66536 从客户端读参数,从`my.cnf '读ODBC群
131072 增加一些额外的安全性检查

5.DB2
AS400
" Driver={Client Access ODBC Driver (32-bit)};System=myAS400;Uid=myUsername;Pwd=myPassword "
6.Excel
标准连接(Standard Security):
" Driver={Microsoft Excel Driver (*.xls)};DriverId=790; Dbq =C:\DatabasePath\DBSpreadSheet.xls;DefaultDir=c: \databasepath; "
7.txt(.csv, .txt, .tab)
" Driver={Microsoft Text Driver (*.txt; *.csv)}; Dbq=C:\DatabasePath\;Extensions=asc,csv,tab,txt; "
如果文本文件使用tab作为分隔符,你必须创建schema.ini文件,你必须在连接串中使用Format=TabDelimited选项。
注意:你必须在sql语句中指定文件名(例如 "Select Name, Address From Clients.csv ")
8.VFP(.dbc, .dbf)
dBASE:
" Driver={Microsoft dBASE Driver (*.dbf)}; DriverID=277;Dbq=c:\DatabasePath "
注意在书写sql语句时必须指定文件名(如 "Select Name, Address From Clients.dbf ").
Visual Foxpro(有数据库容器):
" Driver={Microsoft Visual Foxpro Driver};UID=; SourceType=DBC;SourceDB=C:\DatabasePath\MyDatabase.dbc;Exclusive=No "
Visual Foxpro(无数据库容器):
" Driver={Microsoft Visual Foxpro Driver};UID=; SourceType=DBF;SourceDB=C:\DbfPath\MyDdbf.dbf;Exclusive=No "

Driver={Microsoft Visual FoxproDriver};
SourceType=DBF;SourceDB=\\192.168.0.1\temp;
Exclusive=No;Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO "

9.Interbase
ODBC, Easysoft
本地计算机:
"Driver={Easysoft IB6 ODBC};Server=localhost;Database=localhost:C:\mydatabase.gdb;Uid=username;Pwd=password "
远程计算机:
"Driver={Easysoft IB6 ODBC};Server=ComputerName;Database=ComputerName:C:\mydatabase.gdb;Uid=username;Pwd=password "
" ODBC, Intersolv
本地计算机:
"Driver={INTERSOLV InterBase ODBC Driver (*.gdb)};Server=localhost;Database=localhost:C:\mydatabase.gdb;Uid=username;Pwd=password "
远程计算机:
"Driver={INTERSOLV InterBase ODBC Driver (*.gdb)};Server=ComputerName;Database=ComputerName:C:\mydatabase.gdb;Uid=username;Pwd=password "
这个驱动器现在由 DataDirect Technologies来提供 (以前由Intersolv提供)
10.Sybase
Sybase System 12 (或 12.5) Enterprise Open Client标准连接:
"Driver={SYBASE ASE ODBC Driver};Srvr=Aron1;Uid=username;Pwd=password "
Sybase System 11标准连接:
"Driver={SYBASE SYSTEM 11};Srvr=Aron1;Uid=username;Pwd=password; "
Intersolv 3.10:
"Driver={INTERSOLV 3.10 32-BIT Sybase};Srvr=Aron1;Uid=username;Pwd=password; "
Sybase SQL Anywhere (以前为Watcom SQL ODBC driver):
"ODBC; Driver=Sybase SQL Anywhere 5.0; DefaultDir=c:\dbfolder\;Dbf=c:\mydatabase.db;Uid=username;Pwd=password;Dsn= " " " " "
注意: 对于在末尾紧跟着DSN 参数被引用的双引号(VB语法), 你必须改变符合你所使用的语言所指定的引用符号语法。DSN参数为空 实际上非常重要,如果不包括的话将导致7778错误。

posted @ 2009-01-12 02:53 天下 阅读(1762) 评论(0) 编辑

2009年1月3日

SQL Anywhere 10 关于 COMMIT 掉数据的问题

最近使用SQL Anywhere 10 意外的发现掉数据的问题.

情况:

就是如果直接把数据库服务意外关闭了! 结束之前的数据操作就会丢失!

每次有一个检查点! 如果你进程结束没有新增执行检查点的话! 这样就会丢失数据

说明:

 

  • 执行 COMMIT 语句使对数据库进行的更改成为永久更改。

  • 执行 ROLLBACK 语句撤消由事务执行的所有更改。

  • 执行具有自动提交副作用的语句:数据定义命令(如 ALTER、CREATE、COMMENT 和 DROP)都具有自动提交副作用。

  • 与数据库断开连接将执行隐式回退。

  • 总结:也就是说在SQL Anywhere 10 没有提交事务的话,出现意外的中断,就会导致日志回滚,导致数据丢失.

    作用在使用过程中一定要注意事务的提交

    在SQL Anywhere 10 的COMMIT执行中要注意的问题

    1就是Interactive SQL执行,10 默认是退出 才提交 COMMIT,如果执行过程没有退出,就回很容易掉掉数据

     

    auto_commit 选项 [Interactive SQL]

     

    功能

     

    控制是否在各条语句后执行 COMMIT。

    允许值

     

    On、Off

    缺省值

     

    Off

    说明

     

    如果 auto_commit 为 ON,则会在每条语句成功完成后执行数据库 COMMIT。

    缺省情况下,只有在用户发出 COMMIT 或 ROLLBACK 语句或导致自动提交的 SQL 语句(例如 CREATE TABLE 语句)时才执行 COMMIT 或 ROLLBACK 语句。

    处理方式:

    在Interactive SQL要执行提交
    要在
    工具-选项-提交
    各命令之后 打勾

    在Interactive SQL酒会各个命令后就提交

    2就是ODBC执行不一样

     

    根据您使用的接口以及控制自动提交行为的方式,自动提交模式的行为会稍有不同。

    实现自动提交模式可以采用以下两种方式之一:

    • 客户端自动提交    当应用程序使用自动提交时,客户端库在每一个 SQL 语句执行之后发送 COMMIT 语句。

      ADO.NET、ADO/OLE DB、ODBC 和 PHP 应用程序从客户端控制提交行为。

    • 服务器端自动提交    应用程序关闭链接模式时,数据库服务器提交每个 SQL 语句的结果。此行为在使用 JDBC 的情况下由 chained 数据库选项隐式控制。

      嵌入式 SQL、JDBC 和 Open Client 应用程序操纵服务器端提交行为(例如,这些应用程序设置 chained 选项)。

    对于复合语句(如存储过程或触发器),在客户端和服务器端自动提交之间有一些区别。从客户端看,存储过程是单一语句,因此自动提交将在整个过程执行之后发送单一提交语句。从数据库服务器的角度来看,存储过程可以由许多 SQL 语句构成,因此服务器端自动提交将提交该过程内的每个 SQL 语句的结果。

     

     

    posted @ 2009-01-03 14:16 天下 阅读(163) 评论(0) 编辑

    2008年12月27日

    vs2005水晶报表页面打开数据库登录框提示取消方法[转]

    摘要: 水晶报表直接读取表,常发现登陆框这些问题[代码]一般的写法只这样的,但是不行找到了一个完整的介绍[代码]加上传参就OK 了!经过最后修改完善!加上水晶报表的SDK 说的最好不要多多种类型的调用!也就是说using CrystalDecisions.Shared ;//负责解释TableLogOnInfo类using CrystalDecisions.CrystalReports .Engine ;...阅读全文

    posted @ 2008-12-27 21:21 天下 阅读(939) 评论(3) 编辑

    .net2.0 +asa 10 连接程序

    摘要: .net2.0 +asa 10用的实在是少!网上找了一大圈都没有!只有自己看帮助[代码]阅读全文

    posted @ 2008-12-27 19:01 天下 阅读(108) 评论(0) 编辑

    2008年12月9日

    PD12.5 生成 PB 中table的扩展属性

    摘要: 首先 第一步model-->modele extended definition 定义扩展属性窗口里倒数第二个钮,import an EXtended Model Definition勾选 PowerBuilder然后第二步tools->powerbulider->generate extended attributes就OK 了如果提示"model does not...阅读全文

    posted @ 2008-12-09 12:53 天下 阅读(183) 评论(0) 编辑

    导航

    <2012年2月>
    2930311234
    567891011
    12131415161718
    19202122232425
    26272829123
    45678910

    公告

    昵称:天下
    园龄:7年4个月
    粉丝:0
    关注:0

    搜索

     
     

    常用链接

    随笔档案

    WEB

    最新评论

    阅读排行榜

    评论排行榜

    推荐排行榜