JDBC的連線引數的設定導致rowid自動新增到sql
1,問題描述:
在資料庫後臺經常捕獲到如下的sql:
select rowid, * From PrpDcompany Where ComCode =:1
而實際上我們系統只觸發瞭如下的sql:
select * From PrpDcompany Where ComCode =:1
從weblogic到oracle的整個過程中,有一個步驟自動新增了rowid到sql中;
2,問題原因解釋:
經多方瞭解,JDBC的連線屬性的設定可能導致rowid的自動新增;
我們現有程式中存在如下的JDBC屬性設定:
preparedStatement = con.prepareStatement(strSql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
屬性ResultSet.TYPE_SCROLL_INSENSITIVE表示資料從資料庫讀取出來後放到client端的resultset後,不再關心資料庫中的資料是否變化了,即使變化了
他也不會去同步;
ResultSet.CONCUR_UPDATABLE--該屬性表示取出來的資料可能需要被更新回資料庫;由於可能需要被更新回去,
所以執行select的時候會把rowid自動新增進來,這個rowid用來唯一標識一條記錄;
屬性ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE共同使用本來就是矛盾的,一個不再關心資料庫裡的資料了,
一個還是需要往回更新資料;
3,問題重現
根據以上的理論,設計一個java,並在後臺跟蹤,結果是:
屬性ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE共同使用的場合,會出現:
PARSE ERROR #7:len=51 dep=0 uid=90 oct=3 lid=90 tim=8485473208992 err=936
select rowid, * From PrpDcompany Where ComCode =:1
java 檔案如下:
package com.sinosoft.accfee.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
public class Test1 {
public static void main(String[] args) throws Exception {
//定義驅動器地址
String url="jdbc:oracle:thin:@10.0.13.40:1521:perfdb";
//下載驅動器
Class.forName("oracle.jdbc.driver.OracleDriver");
//與驅動器建立連線
Connection connection=DriverManager.getConnection(url,"ccic","ccic$1211");
Thread.sleep(120*1000);
try {
for(int i=0;i<1000000;i++){
Statement stmt=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet resultset = (ResultSet)stmt.executeQuery("Select comtype From prpdcompany Where comcode = '11010001'");
while(resultset.next()){
System.out.println(resultset.getString(1));
//..........
}
//關閉開啟的連線、包容器、記錄集、
resultset.close();
ResultSet resultset1 = (ResultSet)stmt.executeQuery("Select * From prpdcompany Where comcode = '11010001'");
while(resultset1.next()){
System.out.println(resultset1.getString(1));
//..........
}
//關閉開啟的連線、包容器、記錄集、
resultset1.close();
stmt.close();
Thread.sleep(1000);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
connection.close();
}
}
}
trace 如下:
*** 2009-12-22 16:20:23.013
*** SERVICE NAME:(SYS$USERS) 2009-12-22 16:20:23.007
*** SESSION ID:(2153.8127) 2009-12-22 16:20:23.007
=====================
PARSING IN CURSOR #1 len=65 dep=0 uid=90 oct=3 lid=90 tim=8563923159082 hv=1060576053 ad='f41bc160'
select rowid, comtype From prpdcompany Where comcode = :"SYS_B_0"
END OF STMT
PARSE #1:c=0,e=644,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=8563923159078
EXEC #1:c=0,e=1897,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=8563923166667
FETCH #1:c=0,e=80,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=1,tim=8563923166842
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=50329 op='TABLE ACCESS BY INDEX ROWID PRPDCOMPANY (cr=3 pr=0 pw=0 time=67 us)'
STAT #1 id=2 cnt=1 pid=1 pos=1 obj=50330 op='INDEX UNIQUE SCAN PK_PRPDCOMPANY (cr=2 pr=0 pw=0 time=33 us)'
=====================
PARSE ERROR #1:len=60 dep=0 uid=90 oct=3 lid=90 tim=8563923230414 err=936
select rowid, * From prpdcompany Where comcode = :"SYS_B_0"
=====================
PARSING IN CURSOR #1 len=52 dep=0 uid=90 oct=3 lid=90 tim=8563923244727 hv=1150625011 ad='af22b5c0'
Select * From prpdcompany Where comcode = :"SYS_B_0"
END OF STMT
PARSE #1:c=0,e=85,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=8563923244725
EXEC #1:c=0,e=35,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=8563923244811
FETCH #1:c=0,e=56,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=1,tim=8563923245068
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=50329 op='TABLE ACCESS BY INDEX ROWID PRPDCOMPANY (cr=3 pr=0 pw=0 time=30 us)'
STAT #1 id=2 cnt=1 pid=1 pos=1 obj=50330 op='INDEX UNIQUE SCAN PK_PRPDCOMPANY (cr=2 pr=0 pw=0 time=13 us)'
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29494175/viewspace-2107107/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- jdbc autoReconnect=true 引數設定導致 slow log 爆表。JDBC
- JDBC連線引數JDBC
- 一個簡單的MySQL引數導致的連線問題解惑MySql
- JDBC連線資料庫時,Oracle9i的連線引數配置JDBC資料庫Oracle
- 建立 MQTT 連線時如何設定引數?MQQT
- 騰訊會議自動連線音訊怎麼設定?騰訊會議自動連線音訊的設定教程音訊
- 環境變數設定錯誤導致sqlplus 連線不上oracle變數SQLOracle
- Oracle sqlplus引數autocommit(自動提交)的設定OracleSQLMIT
- STANDBY_FILE_MANAGEMENT引數未設定auto導致的ADG備庫異常
- 記錄連線數導致警報失效,連線池少問題
- pytorch dataloader num_workers引數設定導致訓練阻塞PyTorch
- linux server設定開機自動連線WIFILinuxServerWiFi
- CentOS 7設定網路開機自動連線CentOS
- 【SQL 效能優化】引數設定SQL優化
- 如何解決WAS的JAVA虛擬機器引數設定錯誤,導致控制檯無法啟動的問題Java虛擬機
- java連線資料庫時jdbc設定編碼Java資料庫JDBC
- SQL SERVER 自連線、外連線SQLServer
- 【中亦安圖】導致Oracle效能抖動的引數提醒(4)Oracle
- 不能用jdbc-odbc橋驅動來設定資料庫連線嗎?JDBC資料庫
- win10寬頻自動連線怎麼設定?Win10
- 電腦該怎麼設定寬頻自動連線
- chrome啟動引數設定Chrome
- 在Eclipse中用JDBC連線Sql ServerEclipseJDBCSQLServer
- 核心引數導致的備庫當機分析
- SQL Server資料庫映象的FailOver自動連線SQLServer資料庫AI
- 轉:VNX儲存下,連線各平臺主機的Failover Mode 設定的引數AI
- 解決Oracle 11gR2 空閒連線過多,導致連線數滿的問題Oracle
- 在JDBC連線池中啟動Oracle RAC的TAFJDBCOracle
- java中的OutOfMemory設定jvm啟動引數JavaJVM
- [zt] JDBC連線Oracle RAC的連線串配置JDBCOracle
- PLSQL不規範的引數命名導致的問題SQL
- 動態設定連線<a>元素新視窗頁面開啟
- Tomcat 的 JDBC 連線池TomcatJDBC
- derby 的配置及jdbc連線JDBC
- SQL Server 因設定最大記憶體過小導致無法啟動SQLServer記憶體
- 自動記憶體調整中真正決定自動調整的引數記憶體
- 子div設定float後會導致父div無法自動撐開
- jdbc根據例項名 連線 sql serverJDBCSQLServer