JDBC的连接参数的设置导致rowid自动添加到sql

简介: 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)'

[@more@]
相关文章
|
4月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
383 3
|
2月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
4月前
|
SQL 数据库 索引
SQL语句实现投影连接:方法与技巧详解
在SQL数据库查询中,投影和连接是两个核心概念
|
4月前
|
SQL 数据库 索引
SQL语句实现投影连接:技巧与方法详解
在SQL数据库操作中,投影连接(Projection Join)是一种常见的数据查询技术,它结合了投影(Projection)和连接(Join)两种操作
|
4月前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析
|
4月前
|
SQL 数据库 索引
内连接(INNER JOIN)在SQL中的简单应用与技巧
在SQL查询中,内连接(INNER JOIN)是一种基本且常用的连接类型,用于从两个或多个表中检索匹配的记录
|
SQL
处理动态SQL语句的参数
原文:处理动态SQL语句的参数 经常对SQL进行开发,写动态的SQL语句,是少之不了的,但是在使用动态语句中,常是因为有动态的参数的出现。参考下面代码示例:   正因为有了标记1的动态条件代码,而让SQL语句需要变成动态的SQL语句。
1387 0
|
5月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
7月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
182 13
|
7月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
109 9