起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 336|回复: 11

【结贴】tomcat运行一段时间后报错ORA-03135: 连接失去联系**

[复制链接]
发表于 2009-2-23 11:39:05 | 显示全部楼层 |阅读模式
我修改后的server.xml

<Connector port="8081" maxHttpHeaderSize="8192" maxThreads="300" minSpareThreads="150" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"/>  

<Resource name="x3stat" url="jdbcraclecighstat" username="x3stat" password="x3" driverClassName="oracle.jdbc.driver.OracleDriver" maxActive="100" maxIdle="15" maxWait="5000" validationQuery="select count(*) from dual" auth="Container" type="javax.sql.DataSource"/>  

-------------------------------
怀疑有问题的代码
type
  TINFOAUTOCALC = class(TInfo)
    DataSetReadyCalc: TSQLDataSet;
    DataSetNewCalc: TSQLDataSet;
    FIELD_ReadyCalc_FApplyDate: TUserDataField;
    FIELD_ReadyCalc_FApplicant: TUserDataField;
    FIELD_ReadyCalc_FApplication: TUserDataField;
    FIELD_ReadyCalc_FState: TUserDataField;
    FIELD_ReadyCalc_FCalcDate: TUserDataField;
    FIELD_ReadyCalc_FCostTime: TUserDataField;
    FIELD_ReadyCalc_FRefDate1: TUserDataField;
    FIELD_ReadyCalc_FRefDate2: TUserDataField;
    FIELD_ReadyCalc_FRef1: TUserDataField;
    FIELD_ReadyCalc_FRef2: TUserDataField;
    DataSetQueryCalc: TSQLDataSet;
    FIELD_QueryCalc_FApplyDate: TUserDataField;
    FIELD_QueryCalc_FApplicant: TUserDataField;
    FIELD_QueryCalc_FApplication: TUserDataField;
    FIELD_QueryCalc_FState: TUserDataField;
    FIELD_QueryCalc_FCalcDate: TUserDataField;
    FIELD_QueryCalc_FCostTime: TUserDataField;
    FIELD_QueryCalc_FRefDate1: TUserDataField;
    FIELD_QueryCalc_FRefDate2: TUserDataField;
    FIELD_QueryCalc_FRef1: TUserDataField;
    FIELD_QueryCalc_FRef2: TUserDataField;
    procedure InfoCreate(Sender: TObject);
  private
    FInfoCore: TInfoCore2;
    procedure CreateNewCalc;
    procedure DoCalculate(No, Total: Integer; TargetName, TargetCode: string;
      CalcTime: TDateTime);
  public
    procedure CalcReady;
    function CalcOne(ADataSetCalc: TDataSet): Boolean;
    procedure ViewCalcInfo(ADataSetBroker: TDataSetBroker);
  end;

implementation

procedure TINFOAUTOCALC.ViewCalcInfo(ADataSetBroker: TDataSetBroker);
begin
  with TFormCalcInfo.Create(Context) do
  try
    DataSetBroker.InfoBroker := ADataSetBroker.InfoBroker;
    DataSetBroker.DataSetID := ADataSetBroker.DataSetID;
    ShowModal;
  finally
    Free;
  end;
end;


procedure TINFOAUTOCALC.DoCalculate(No, Total: Integer;
  TargetName, TargetCode: string; CalcTime: TDateTime);
begin
  Business.Forms.Forms.Application.ProcessMessages;
end;

procedure TINFOAUTOCALC.CalcReady;
begin
  DataSetNewCalc.Close;
  DataSetNewCalc.Open;
  with DataSetReadyCalc do
  begin
    Close;
    Open;
    while not Eof do
    begin
      if not CalcOne(DataSetReadyCalc) then
        CreateNewCalc;
      Next;
    end;
  end;
end;

function TINFOAUTOCALC.CalcOne(ADataSetCalc: TDataSet): Boolean;
var
  lBeginDate, lEndDate, lTime: TDateTime;
  lInternal, lFilter, lLog: string;
  lInfoCore: TInfoCore2;
  lLogLists: TStrings;
begin
  with ADataSetCalc do
  begin
    lBeginDate := FieldByName('FRefDate1').AsDateTime;
    lEndDate := FieldByName('FRefDate2').AsDateTime;
    lInternal := FieldByName('FRef1').AsString;
    lFilter := FieldByName('FRefFilter').AsString;
    Edit;
    FieldByName('FCalcDate').AsDateTime := Business.Data.SysSrv.SysService.Time;
    FieldByName('FState').AsString := 'running';
    Post;
    ApplyUpdates;
  end;
  FInfoCore.TargetFilter := lFilter;
  FInfoCore.Logs.Logs := TStringList.Create;
  try
    Result := FInfoCore.Calculate(lBeginDate, lEndDate, lInternal);
    lLog := FInfoCore.Logs.Logs.Text;
  finally
    FInfoCore.Logs.Logs.Free;
  end;

  with ADataSetCalc do
  begin
    Edit;
    FieldByName('FCostTime').AsDateTime :=
      Business.Data.SysSrv.SysService.Time - FieldByName('FCalcDate').AsDateTime;
    FieldByName('FLog').AsString := lLog;
    if Result then
      FieldByName('FState').AsString := 'complete'
    else
      FieldByName('FState').AsString := 'failed';
    Post;
    ApplyUpdates;
  end;
end;

procedure TINFOAUTOCALC.CreateNewCalc;
begin
  DataSetNewCalc.Open;
  DataSetNewCalc.Append;
  DataSetNewCalc.FieldByName('FApplyDate').AsDateTime := DataSetReadyCalc.FieldByName('FApplyDate').AsDateTime;
  DataSetNewCalc.FieldByName('FApplicant').AsString   := DataSetReadyCalc.FieldByName('FApplicant').AsString;
  DataSetNewCalc.FieldByName('FApplication').AsString := DataSetReadyCalc.FieldByName('FApplication').AsString;
  DataSetNewCalc.FieldByName('FState').AsString       := 'ready';
  DataSetNewCalc.FieldByName('FRefDate1').AsDateTime  := DataSetReadyCalc.FieldByName('FRefDate1').AsDateTime;
  DataSetNewCalc.FieldByName('FRefDate2').AsDateTime  := DataSetReadyCalc.FieldByName('FRefDate2').AsDateTime;
  DataSetNewCalc.FieldByName('FRef1').AsString        := DataSetReadyCalc.FieldByName('FRef1').AsString;
  DataSetNewCalc.FieldByName('FRefFilter').AsString   := DataSetReadyCalc.FieldByName('FRefFilter').AsString;
  DataSetNewCalc.Post;
  DataSetNewCalc.ApplyUpdates;
end;

procedure TINFOAUTOCALC.InfoCreate(Sender: TObject);
begin
  //此处创建了计算的业务信息(这个里面有近10个数据集),没有发现释放,此类创建是否需要手工释放,是不是因为它没有释放造成的连接数越来越多引起的服务中断,但是调用此业务信息的窗体是需要一直开启的
  FInfoCore := TInfoCore2.Create(Context);
  FInfoCore.OnCalculate := DoCalculate;
end;
回复

使用道具 举报

发表于 2009-2-23 14:53:34 | 显示全部楼层
你可以别开这个功能看看服务端报不报错,再打开这个功能是否出现错误。

//此处创建了计算的业务信息(这个里面有近10个数据集)  我看上面的代码,只有3个数据集。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-23 15:58:44 | 显示全部楼层
这个功能必须开,开发服务器上因为正在进行开发,经常重启,未发现过此问题。请帮忙看看我上面的代码是否会有问题,会引起什么问题
回复 支持 反对

使用道具 举报

发表于 2009-2-23 16:12:44 | 显示全部楼层
我是让您确认错误是否由于这个功能引起。
代码我看不出什么问题。
回复 支持 反对

使用道具 举报

发表于 2009-2-23 16:24:16 | 显示全部楼层
http://203.208.39.99/search?q=cache:ZpBFjvZa9IYJ:www.itpub.net/viewthread.php%3Ft ... idOOR1_fbAlrnTS4iNw
参考一下,有没有可能是啥软件或者应用服务器与数据库服务起之间安装了什么其他网络设备搞的呢?
现在报告这个错误客户端有什么错误?会影响使用么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-26 09:16:26 | 显示全部楼层
谢谢各位
这两天公司网络问题,没回复,不好意思

to  shangxy
你提供的连接打不开
回复 支持 反对

使用道具 举报

发表于 2009-2-26 09:19:52 | 显示全部楼层
msdnchina
初级会员



精华贴数 0
个人空间 63
技术积分 113 (15872)
社区积分 0 (195025)
注册日期 2004-10-29
论坛徽章:0
            
            

#1使用道具  发表于 2008-7-30 12:14   
报ora-03135,ora-03114错误的另类原因


oracle服务器与客户端的通信联系,会受卡巴斯基kis互联网网络安全套装6.0的影响:
卡巴斯基kis服务器将a客户端的反黑客设置
设置是未将“192.168.0.XXX”加入信任区域
(1.此操作是在卡巴斯基kis服务器端进行的;
  2.192.168.0.XXX是oracle数据库服务器所在的ip的区域),


虽然ping 命令在此段时间内始终是能ping通的,但是客户端软件(为pb开发的c/s软件),时常会报ora-03135,ora-03114错误。经过分析,应该
是卡巴斯基kis服务器强行将此a机器的oracle连接结束掉(此强行结束掉的检测逻辑 可能是多少秒进行一次,具体要看卡巴斯基kis互联网网络安全套装6.0的检测规则了。),然后oracle的后台PMON进程检测到连接已经断开时,PMON会释放此次会话的资源。

注意:在整个过程中,物理上是连通的。(ping命令结果是通的)

在 sqlnet.log 中错误如下:

Fatal NI connect error 12170.

  VERSION INFORMATION:
TNS for  Windows: Version 10.2.0.1.0 - Production
Oracle Bequeath NT Protocol Adapter for  Windows: Version 10.2.0.1.0 - Production
Windows NT TCP/IP NT Protocol Adapter for Windows: Version 10.2.0.1.0 - Production
  Time: 23-7月 -2008 13:39:56
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12535
    TNS-12535: TNS: 操作超时
    ns secondary err code: 12606
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0
  Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.74)(PORT=1865))



__________________
msdnchina@hotmail.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-2 09:35:57 | 显示全部楼层
谢谢各位,前些天公司网络故障,无法回复
服务器没用卡巴是瑞星
我们正在查是否为瑞星或系统原因
但是那个自动计算功能占用内存是肯定的,在开发服务器做了测试,如果不打开自动计算,business内存占用量是稳定的,如果打开,business进程占用的内存不断增加,这个功能中是用timer控件每隔5秒检测某数据表中的数据,如果检测到未处理状态的数据就进行处理,我观察过进程内存占用情况,每次刷新数据集时占用内存就会增大一些。平台中不停的开关数据集是否会引起内存不断增大?原Delphi中Query也有过类似问题,但Query有PrePare 和 UnPrePare,在频繁开关数据集的时候用这两个过程可以避免占用内存不断增大,我们的平台里是否有类似的方法避免?
自动计算功能代码
implementation

uses
  InfoAutoCalc;

procedure TMainForm.TimerTimer(Sender: TObject);
begin
  Timer.Enabled := False;
  try
    TInfoAutoCalc(InfoBroker.Info).CalcReady;
  finally
    Timer.Enabled := True;
  end;
end;

procedure TMainForm.ActionRunExecute(Sender: TObject);
begin
  Timer.Enabled := True;
end;

procedure TMainForm.ActionStopExecute(Sender: TObject);
begin
  Timer.Enabled := False;
end;

procedure TMainForm.ActionListUpdate(Action: TBasicAction; var Handled: Boolean);
begin
  ActionRun.Enabled := not Timer.Enabled;
  ActionStop.Enabled := Timer.Enabled;
end;

procedure TMainForm.TabControlQueryChange(Sender: TObject);
begin
  with TSQLDataSet(DataSetBrokerQuery.DataSet) do
    case TabControlQuery.TabIndex of
      0: UserFilter := 'FState=''complete''';
      1: UserFilter := 'FState=''failed''';
      2: UserFilter := 'FState=''ready''';
      3: UserFilter := 'FState=''running''';
    end;
end;

procedure TMainForm.BizFormShow(Sender: TObject);
begin
  PageControl.ActivePageIndex := 0;
  TabControlRun.TabIndex := 0;
  TabControlQuery.TabIndex := 0;
end;

procedure TMainForm.TabSheetQueryShow(Sender: TObject);
begin
  TabControlQueryChange(TabControlQuery);
  DataSetBrokerQuery.DataSet.Open;
end;

procedure TMainForm.DataGridQueryDblClick(Sender: TObject);
begin
  TInfoAutoCalc(InfoBroker.Info).ViewCalcInfo(DataSetBrokerQuery);
end;

procedure TMainForm.DataGridQueueDblClick(Sender: TObject);
begin
  TInfoAutoCalc(InfoBroker.Info).ViewCalcInfo(DataSetBrokerReady);//此处即为调用上面业务信息中方法
end;
回复 支持 反对

使用道具 举报

发表于 2009-3-2 09:50:09 | 显示全部楼层
应用服务器和数据库服务器之间不能有防火墙。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-2 15:46:57 | 显示全部楼层
平台中不停的开关数据集是否会引起内存不断增大?原Delphi中Query也有过类似问题,但Query有PrePare 和 UnPrePare,在频繁开关数据集的时候用这两个过程可以避免占用内存不断增大,我们的平台里是否有类似的方法避免?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-26 09:19 , Processed in 0.041451 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表