B
billy_yuan
Unregistered / Unconfirmed
GUEST, unregistred user!
在MIS系统中,尽量减少应用程序与数据库的通讯能够提高应用程序的效率。取一个类的
ID值是比较常见的需求。本例采用缓存机制来减少与数据库的通讯。有很多的方法生成ID
数据库不同方法也不同,SQL SERVER 可以用IDENTITY,ORACLE 可以用SEQUENCE,还可以用触发器之类的,这里用的是最土的一种用一个表来保存ID号!
unit Unit2;
interface
uses Classes ;
type
KeyGenerator =class
CurrentKeynumber:integer ;
TypeName:String ;
keyList:TStringList ;
Size:integer ;
procedure setkeysize(n:integer) ;
function getNextKey():integer ;
procedure setkey ;
public
constructor Create(ATypeName:String;n:integer);
end ;
KeyList = Class
Klist:TStringlist ;
Size:integer ;
public
function getNextKey(ATypeName:String):integer ;
constructor Create(n:integer) ;
end ;
var
Keys:KeyList ;
function getNextKey(typeName:String):integer ;
//最后是通过这各函数来取ID的
implementation
constructor KeyGenerator.Create(ATypeName:String;n:integer);
begin
inherited Create();
setkeysize ;
Keylist := TStringList.Create ;
TypeName := ATypeName ;
CurrentKeynumber := 1 ;
setKey ;
end;
function KeyGenerator.getNextKey:integer;
begin
if CurrentKeyNumber > size then
setkey
else
keylist.Strings[CurrentKeyNumber] ;
end;
procedure KeyGenerator.setKey;
var
sql:String ;
begin
sql := 'select max(number) from table where type='''+ TypeName +'''' ;
//SQL根据实际而定。
//执行SQL填满SIZE个序列号。
//连续执行80条INSERT 用事务提交如果SIZE是80条的话
KeyList.Add('100') ;
KeyList.Add('101') ;
KeyList.Add('102') ;
CurrentKeynumber := 1 ;
end;
procedure KeyGenerator.setKeySize(n:integer);
begin
Size := n ;
end;
constructor KeyList.Create(n:integer);
begin
inherited Create() ;
Klist:=TStringlist.Create ;
Size := n ;
end;
function KeyList.getNextKey(ATypeName: String): integer;
var
kg:KeyGenerator ;
begin
if Klist.IndexOf(ATypeName) <> -1 then
result := KeyGenerator(Klist.Objects[Klist.IndexOf(ATypeName)]).getNextKey
else
begin
kg := KeyGenerator.Create(ATypeName,size);
Klist.AddObject(ATypeName,kg) ;
result := kg.getNextKey ;
end ;
end;
function getNextKey(typeName:String):integer ;
begin
if Keys <> nil then
//单例模式的运用
Keys := keyList.Create(20);
//可以根据配置文件更改缓存的大小
result := keys.getNextKey(typeName) ;
end ;
end.
ID值是比较常见的需求。本例采用缓存机制来减少与数据库的通讯。有很多的方法生成ID
数据库不同方法也不同,SQL SERVER 可以用IDENTITY,ORACLE 可以用SEQUENCE,还可以用触发器之类的,这里用的是最土的一种用一个表来保存ID号!
unit Unit2;
interface
uses Classes ;
type
KeyGenerator =class
CurrentKeynumber:integer ;
TypeName:String ;
keyList:TStringList ;
Size:integer ;
procedure setkeysize(n:integer) ;
function getNextKey():integer ;
procedure setkey ;
public
constructor Create(ATypeName:String;n:integer);
end ;
KeyList = Class
Klist:TStringlist ;
Size:integer ;
public
function getNextKey(ATypeName:String):integer ;
constructor Create(n:integer) ;
end ;
var
Keys:KeyList ;
function getNextKey(typeName:String):integer ;
//最后是通过这各函数来取ID的
implementation
constructor KeyGenerator.Create(ATypeName:String;n:integer);
begin
inherited Create();
setkeysize ;
Keylist := TStringList.Create ;
TypeName := ATypeName ;
CurrentKeynumber := 1 ;
setKey ;
end;
function KeyGenerator.getNextKey:integer;
begin
if CurrentKeyNumber > size then
setkey
else
keylist.Strings[CurrentKeyNumber] ;
end;
procedure KeyGenerator.setKey;
var
sql:String ;
begin
sql := 'select max(number) from table where type='''+ TypeName +'''' ;
//SQL根据实际而定。
//执行SQL填满SIZE个序列号。
//连续执行80条INSERT 用事务提交如果SIZE是80条的话
KeyList.Add('100') ;
KeyList.Add('101') ;
KeyList.Add('102') ;
CurrentKeynumber := 1 ;
end;
procedure KeyGenerator.setKeySize(n:integer);
begin
Size := n ;
end;
constructor KeyList.Create(n:integer);
begin
inherited Create() ;
Klist:=TStringlist.Create ;
Size := n ;
end;
function KeyList.getNextKey(ATypeName: String): integer;
var
kg:KeyGenerator ;
begin
if Klist.IndexOf(ATypeName) <> -1 then
result := KeyGenerator(Klist.Objects[Klist.IndexOf(ATypeName)]).getNextKey
else
begin
kg := KeyGenerator.Create(ATypeName,size);
Klist.AddObject(ATypeName,kg) ;
result := kg.getNextKey ;
end ;
end;
function getNextKey(typeName:String):integer ;
begin
if Keys <> nil then
//单例模式的运用
Keys := keyList.Create(20);
//可以根据配置文件更改缓存的大小
result := keys.getNextKey(typeName) ;
end ;
end.