検索

一:zwj;zwj;在电信行业这种数据量巨大的环境中,ora-01555错是一个很常见的错误。这个错误使得应用失败。例如,这一错误可能停

一:‍
‍在电信行业这种数据量巨大的环境中,ora-01555错是一个很常见的错误。这个错误使得应用失败。例如,这一错误可能停止一个在深夜运行的批处理任务,随后也使依赖于该任务的其他任务失败。这使用户不能及时得到所需的信息(如报表没打印出来、数据未被导出等等)。尽管这一错误通常发生在大任务上,但在小任务上也会发生。
  ORA-1555通常是一个偶然出现的错误。有时在发生了该错误以后,重新运行该任务就有可能不再碰到类似的错误。这个错误最麻烦的是它并不会立刻发生,运行时间长的任务在错误失败以前可能已经运行了一段时间了(可能几个小时)。只是简单地重新运行该任务并不能保证它能成功,可能在运行了一段时间以后仍然失败。
  1 原因分析
  ORA-1555错的根本原因是因为Oracle要保证读一致性。读一致性是指当有多个用户对一个数据块内的行进行修改时,这些块变“脏”或处于变化之中直到被确认。在被确认以前,它们对事务中的所有语句都是可见的,但是对别的事务或语句而言是不可见的。一旦确认以后,对所有后继的事务或语句就都是可见的了。但在事务被确认前的语句不能看到修改,因为这些修改还未发生。
  例如,事务T 1(如对某大表的exp操作)在2 2 :0 0开始而事务T 2(如对同一大表的update操作)在2 2 :0 1时开始,因为T 1需遍历一个很大的表,其读取要花很长的时间,而T 2可能对同一个表中的数据进行基于索引的更新操作。这样, T2可能在几秒钟之内完成,而T 1可能要运行很长时间,假定4 0分钟。当T 1到达T 2做过修改的地方时(根据当前的S C N时间戳可以识别出新作的改变),尽管T 2所进行的写已经被确认,但为了保证读一致性,它不会读到修改后的数据,它只访问在2 2 :0 0时的数据,在2 2 :0 1时所做的改变不能被读取 。T 1从回滚段中读取改变前的数据以保证读一致性。但因为事务T2已经提交,T2事务使用的回滚段oracle认为已经可以重新利用,当回滚段太少或事务较密集时,oracle有可能会用新事务覆盖掉原来T2事务的回滚段,这时T1事务读到被T2修改过的数据时,再从回滚段中就无法找到修改前的数据,这时就会报ORA-1555,snapshot too old错。
  下面我们可以结合实例来将此过程回溯一遍:
  (1)事务T1在22点开始执行了对某一个大表Test1的exp操作(Test1表数据量可能有几千万甚至更多),那么按照经验,此操作可能需要执行40分钟左右或更长;
  (2)事务T2在22点01分开始执行对Test1表某行的update操作,并且操作条件上有索引(将col1为00的行,col2值由90修改为100),故此操作很快完成,比如5秒钟完成操作并commit;
  (3)此时事务T2已经执行完毕,而事务T1还在执行中;
  (4)当事务T1需要将col1为00的行导出为dmp文件时,Oracle为了保证读一致性,即T1导出的必须是22点时数据库表的值,故col1为00的行对于T1任务来说值仍然为90,而非100;
  (5)由于T2事务在22点02分前就已经做完(提交),并且T2认为回滚段是可以重新利用的;
  (6)如果此时由于回滚段太少或业务量较密集,oracle就可能会重新利用刚才T2事务所使用的回滚段。这时T1事务读到此处时,就会造成无法找到回滚段中修改前的数据,产生错误。
  2 9i中对回滚段管理
  在9i中,可以有两种解决方法来维护事务的读一致性,即或者使用自Oracle 6以来就一直使用的回滚段,,或者是使用Undo Tablespace来进行的自动重做管理,但是这两种方法不能同时使用。
  考试大建议在9i 中使用回滚表空间而不是8i 的回滚段模式来管理数据库。
  (1)建立undotablespace
  建立undotablespace的语法如下:
  create undotablespace tablespace_name
  datafile ’fullpath+datafilename’ size XXM
  [autoextend on|off next XX maxsize XX]; 来
‍二:

写了段java操作数据库的代码

Java代码  String getIPList="select t.dns_ip from t_dnscachetotal t where t.locid=0";         
 String getLocid="select  t3.locid from (select max(t2.ipstart) ipstart,max(t2.ipend) ipend from t_GGMAP_IP t2 where t2.ipstart=query_ip(?) and t1.ipstart=t3.ipstart";         
String updateDnsCacheTotal="update t_dnscachetotal t set t.locid=? where t.dns_ip=?";             
stmt=con.prepareStatement(getIPList);         
 rs=pstmt.executeQuery();         
String ip;                   
 ResultSet rs2;         
 int countupdate=0;         
while(rs.next()){               
 ip=rs.getString(1);                   
pstmt2 = con.prepareStatement(getLocid);                 
pstmt2.setString(1, ip);                 
pstmt2.setString(2, ip);                 
rs2=pstmt2.executeQuery();               
 int locid=-1;                 
while(rs2.next()){                   
 locid=rs2.getInt(1);                  }
  pstmt2.close();                 
  rs2.close();                 
  countupdate++;                 
  pstmt2=con.prepareStatement(updateDnsCacheTotal);                 
  pstmt2.setInt(1, locid);                 
  pstmt2.setString(2, ip);                 
  pstmt2.executeUpdate();                 
    pstmt2.close();                               
    }         
  pstmt.close();         
  rs.close(); 
String getIPList="select t.dns_ip from t_dnscachetotal t where t.locid=0"; String getLocid="select t3.locid from (select max(t2.ipstart) ipstart,max(t2.ipend) ipend from t_GGMAP_IP t2 where t2.ipstart=query_ip(?) and t1.ipstart=t3.ipstart"; String updateDnsCacheTotal="update t_dnscachetotal t set t.locid=? where t.dns_ip=?"; pstmt=con.prepareStatement(getIPList); rs=pstmt.executeQuery(); String ip; ResultSet rs2; int countupdate=0; while(rs.next()){ ip=rs.getString(1); pstmt2 = con.prepareStatement(getLocid); pstmt2.setString(1, ip); pstmt2.setString(2, ip); rs2=pstmt2.executeQuery(); int locid=-1; while(rs2.next()){ locid=rs2.getInt(1); } pstmt2.close(); rs2.close(); countupdate++; pstmt2=con.prepareStatement(updateDnsCacheTotal); pstmt2.setInt(1, locid); pstmt2.setString(2, ip); pstmt2.executeUpdate(); pstmt2.close(); } pstmt.close(); rs.close();

 

大体就这样。。我删了一部分代码。

核心的问题就在于

while(rs.next()){
     
    }

因为rs.next实际上是对oracle某表持续的查询,而在循环中又在不断地update这个表,从而导致了这个1555错误,

ora 1555别人的例子 写道首先了解Oracle在什么情况下会产生ORA-01555错误:

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQLで既存のビューをドロップまたは変更するにはどうすればよいですか?MySQLで既存のビューをドロップまたは変更するにはどうすればよいですか?May 16, 2025 am 12:11 AM

todropaviewinmysql、 "dropviewifexistsview_name;" andtomodifyaviewを使用して、 "createorreplaceviewview_nameasselect ..."を使用します

MySQLビュー:どのデザインパターンを使用できますか?MySQLビュー:どのデザインパターンを使用できますか?May 16, 2025 am 12:10 AM

mysqlviewscanefectiveativeativeizedesignpatternslikeadapter、decorator、factory、andobserver.1)adapterpatternadaptsdatafromdifferenttablesintoaunifiedview.2)decoratorpatternenhancesdatawithedfieldsfieldsiffieldsiffieldsiffiedを

MySQLでビューを使用することの利点は何ですか?MySQLでビューを使用することの利点は何ですか?May 16, 2025 am 12:09 AM

viewsinmysqlarebenefentialforsimprifiningcomplexqueries、拡張セキュリティ、ダタコンシーニング、および最適化されたパフォーマンスを保証する1)itsmplifyififycomplexqueriesbyencapsulsingthemintoreusableviews.2)viewsencurationecuritybycontrollingcescesces.3)

MySQLで簡単なビューを作成するにはどうすればよいですか?MySQLで簡単なビューを作成するにはどうすればよいですか?May 16, 2025 am 12:08 AM

to CreateAsimpleviewinmysql、usethecreateviewstatement.1)DefinetheTheTheThecreateview_nameas.2)SpecifyTheSelectStatementtatementtatementtatementtatementtatementtatementedeSireddata.3)

MySQLはユーザーステートメントの作成:例と一般的なエラーを作成しますMySQLはユーザーステートメントの作成:例と一般的なエラーを作成しますMay 16, 2025 am 12:04 AM

tocleateusersinmysql、usethecreateuserstatement.1)foralocaluser:createUser'localuser '@' localhost'identifidedifiedifiedified 'securepassword';

MySQLでビューを使用することの限界は何ですか?MySQLでビューを使用することの限界は何ですか?May 14, 2025 am 12:10 AM

mysqlviewshavelimitations:1)supportallsqloperations、制限、dataManipulationswithjoinsorubqueries.2)それらは、特にパフォーマンス、特にパルフェクソルラージャターセット

MySQLデータベースのセキュリティ:ユーザーの追加と特権の付与MySQLデータベースのセキュリティ:ユーザーの追加と特権の付与May 14, 2025 am 12:09 AM

reperusermanmanagementInmysqliscialforenhancingsecurationsinginuring databaseaperation.1)usecreateusertoaddusers、指定connectionsourcewith@'localhost'or@'% '。

MySQLで使用できるトリガーの数にどのような要因がありますか?MySQLで使用できるトリガーの数にどのような要因がありますか?May 14, 2025 am 12:08 AM

mysqldoes notimposeahardlimitontriggers、しかしpracticalfactorsdeTerminetheireffectiveuse:1)serverconufigurationStriggermanagement; 2)complentiggersincreaseSystemload;

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。