2011-07-21 47 views
3

DBXPool用於DelegateConnectionTSQLConnection時,如果在調用TSQLConnection.Open方法時SQLServer不可用,它將在第一次超時。但是,如果您隨後再次撥打Open,則會導致行爲不當。在我的生產服務中,它沒有任何警告地殺死這個過程 - 沒有例外,沒有任何例外。這個過程就消失了......在我創建的一個簡單的應用程序中測試DBXPool,它認爲TSQLConnection已連接,即使它不是。DBXPool在連接失敗時損壞內存

有沒有人有DBXPool作爲DelegateConnection可以提供任何建議的麻煩嗎?

謝謝!

< < < 7/23編輯#2 >>>

我使用的代碼在編輯#1下面通過DBX框架追查。當DBXPool使用了下面的方法僅稱爲:

(單元DBXDelegate)

procedure TDBXDelegateConnection.Open; 
begin 
    if not FConnection.IsOpen then 
    begin 
    TDBXAccessorConnection(FConnection).Open; 
    end; 
end; 

...其中調用下面的方法,這就是所謂是否被使用DBXPool:

(單位DBXCommon)

procedure TDBXConnection.Open; 
begin 
    // mark the state open so memory can be deallocated 
    // even if derived open or meta query fail 
    FOpen := true; 

    DerivedOpen; 
    DatabaseMetaData; 
end; 

注意評論。當發生異常(例如,錯誤的用戶名或超時等)時,僅在未使用DBXPool時調用以下代碼。

(單元DBXCommon)

procedure TDBXConnection.Close; 
begin 
    CloseAllCommands; 
    RollbackAllTransactions; 
    DerivedClose; 
    SetTraceInfoEvent(nil); 
    FreeAndNil(FDatabaseMetaData); 
    FOpen := false; 
end; 

由於FOpen不被設置回False使用DBXPool時,它會導致代碼以執行不應該在下一次DerivedOpen被調用,這導致AccessViolation和內存損壞。有時RTL捕獲它,有時它不會(例如,我的生產服務被Windows殺死)。我還沒有能夠深入追蹤DBXDelegate,以確定它爲什麼不捕獲異常並致電TDBXConnection.Close

< < < 7/23編輯#1 >>>

每肯的建議,我附上簡單的示例應用程序。我的服務應用程序剛剛死亡。此應用程序在dbxmss.dll(今天)中顯示訪問衝突。昨天它沒有在第二次點擊時引發異常,它只是將「Connected」返回爲True。看起來像內存腐敗對我來說...

建立並運行應用程序的計算機上或無SQLServer。點擊每個按鈕幾次。第一次點擊都會返回錯誤。 'With DBXPool'會認爲它在第二次點擊後開始連接。如果你幸運,你可能會看到AV。 'W/O DBXPool'按鈕每次都會失敗,這是正確的。

Project1.dpr

program Project1; 

uses 
    Forms, 
    Unit1 in 'Unit1.pas' {Form1}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

1單元。DFM

object Form1: TForm1 
    Left = 0 
    Top = 0 
    Caption = 'Form1' 
    ClientHeight = 301 
    ClientWidth = 562 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    OnCreate = FormCreate 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Button1: TButton 
    Left = 40 
    Top = 8 
    Width = 75 
    Height = 25 
    Caption = 'With DBXPool' 
    TabOrder = 0 
    OnClick = Button1Click 
    end 
    object Button2: TButton 
    Left = 40 
    Top = 39 
    Width = 75 
    Height = 25 
    Caption = 'W/O DBXPool' 
    TabOrder = 1 
    OnClick = Button2Click 
    end 
    object SQLConnection1: TSQLConnection 
    DriverName = 'MSSQL' 
    GetDriverFunc = 'getSQLDriverMSSQL' 
    LibraryName = 'dbxmss.dll' 
    LoginPrompt = False 
    Params.Strings = (
     'DriverUnit=DBXMSSQL' 

     'DriverPackageLoader=TDBXDynalinkDriverLoader,DBXCommonDriver150.' + 
     'bpl' 

     'DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borla' + 
     'nd.Data.DbxCommonDriver,Version=15.0.0.0,Culture=neutral,PublicK' + 
     'eyToken=91d62ebb5b0d1b1b' 

     'MetaDataPackageLoader=TDBXMsSqlMetaDataCommandFactory,DbxMSSQLDr' + 
     'iver150.bpl' 

     'MetaDataAssemblyLoader=Borland.Data.TDBXMsSqlMetaDataCommandFact' + 
     'ory,Borland.Data.DbxMSSQLDriver,Version=15.0.0.0,Culture=neutral' + 
     ',PublicKeyToken=91d62ebb5b0d1b1b' 
     'GetDriverFunc=getSQLDriverMSSQL' 
     'LibraryName=dbxmss.dll' 
     'VendorLib=sqlncli10.dll' 
     'MaxBlobSize=-1' 
     'OSAuthentication=False' 
     'PrepareSQL=True' 
     'ErrorResourceFile=' 
     'drivername=MSSQL' 
     'schemaoverride=%.dbo' 
     'HostName=127.0.0.1' 
     'Database=database' 
     'User_Name=username' 
     'Password=password' 
     'blobsize=-1' 
     'localecode=0000' 
     'isolationlevel=ReadCommitted' 
     'os authentication=False' 
     'prepare sql=False' 
     'DelegateConnection=DBXPool' 
     'DBXPool.MaxConnections=20' 
     'DBXPool.MinConnections=1' 
     'DBXPool.ConnectTimeout=1000' 
     'DBXPool.DriverUnit=DBXPool' 
     'DBXPool.DelegateDriver=True' 
     'DBXPool.DBXPool.MaxConnections=20' 
     'DBXPool.DBXPool.MinConnections=1' 
     'DBXPool.DBXPool.ConnectTimeout=1000' 
     'DBXPool.DBXPool.DriverUnit=DBXPool' 
     'DBXPool.DBXPool.DelegateDriver=True' 
     'DBXPool.DBXPool.DriverName=DBXPool' 
     'DBXPool.DriverName=DBXPool') 
    VendorLib = 'sqlncli10.dll' 
    Left = 8 
    Top = 8 
    end 
    object SQLConnection2: TSQLConnection 
    DriverName = 'MSSQL' 
    GetDriverFunc = 'getSQLDriverMSSQL' 
    LibraryName = 'dbxmss.dll' 
    LoginPrompt = False 
    Params.Strings = (
     'DriverUnit=DBXMSSQL' 

     'DriverPackageLoader=TDBXDynalinkDriverLoader,DBXCommonDriver150.' + 
     'bpl' 

     'DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borla' + 
     'nd.Data.DbxCommonDriver,Version=15.0.0.0,Culture=neutral,PublicK' + 
     'eyToken=91d62ebb5b0d1b1b' 

     'MetaDataPackageLoader=TDBXMsSqlMetaDataCommandFactory,DbxMSSQLDr' + 
     'iver150.bpl' 

     'MetaDataAssemblyLoader=Borland.Data.TDBXMsSqlMetaDataCommandFact' + 
     'ory,Borland.Data.DbxMSSQLDriver,Version=15.0.0.0,Culture=neutral' + 
     ',PublicKeyToken=91d62ebb5b0d1b1b' 
     'GetDriverFunc=getSQLDriverMSSQL' 
     'LibraryName=dbxmss.dll' 
     'VendorLib=sqlncli10.dll' 
     'MaxBlobSize=-1' 
     'OSAuthentication=False' 
     'PrepareSQL=True' 
     'ErrorResourceFile=' 
     'drivername=MSSQL' 
     'schemaoverride=%.dbo' 
     'HostName=127.0.0.1' 
     'Database=database' 
     'User_Name=username' 
     'Password=password' 
     'blobsize=-1' 
     'localecode=0000' 
     'isolationlevel=ReadCommitted' 
     'os authentication=False' 
     'prepare sql=False') 
    VendorLib = 'sqlncli10.dll' 
    Left = 8 
    Top = 39 
    end 
end 

Unit1.pas

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, DBXMSSQL, StdCtrls, DB, SqlExpr, DBXPool; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    SQLConnection1: TSQLConnection; 
    SQLConnection2: TSQLConnection; 
    Button2: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

uses 
    DBXCommon; 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    SQLConnection1.Close; 
    SQLConnection1.Open; 
    if SQLConnection1.Connected then 
    MessageDlg('connected connection 1', mtInformation, [mbOK], 0); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    SQLConnection2.Close; 
    SQLConnection2.Open; 
    if SQLConnection2.Connected then 
    MessageDlg('connected connection 2', mtInformation, [mbOK], 0); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    // for testing purposes, shorten the timeout so that the timeout occurs quickly 
    SQLConnection1.Params.Values[TDBXPropertyNames.ConnectTimeout] := '1'; 
    SQLConnection2.Params.Values[TDBXPropertyNames.ConnectTimeout] := '1'; 
end; 

end. 
+0

這裏沒有任何信息可以回答你的問題。你沒有發佈任何代碼。如果這個過程「沒有任何警告就死掉了」,這意味着一個異常被觸發了,Delphi的RTL無法處理這個異常,並且Windows終止了這個過程。但是,沒有任何資源需要審覈,任何人都無法做任何事情來幫助您解決問題。如果您需要幫助解決問題,請修改您的帖子以包含您正在使用的代碼。 –

+0

在Embarcadero,#96506&#90347現在有兩個質量控制項目。我爲Embarcadero打開了一張支持票據,以調查並修復錯誤或提供解決方法。希望在接下來的一段時間內我們會有答案。他們最初的反應是DBXPool是一個可擴展的框架。他們的支持團隊應該很快讓我知道...... –

回答

0

Embarcadero公司支持今天通知我,這個問題已得到修復,並會在下次常規發佈(例如,XE2)可用。