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@]
相关文章
|
10天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
5天前
|
SQL 分布式计算 前端开发
MaxCompute操作报错合集之SQL脚本设置参数set odps.mapred.reduce.tasks=18;没有生效,是为什么
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
4天前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
【6月更文挑战第24天】Java JDBC的三大法宝简化数据库操作:①统一API接口,跨平台与各类数据库交互;②参数化查询,提升效率,防止SQL注入;③事务管理,确保数据一致性。通过这三个核心特性,开发者能更安全高效地处理数据库任务。示例代码展示了如何使用这些功能。
|
10天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
1天前
|
Java 关系型数据库 MySQL
连接MySQL数据库的最优JDBC代码
连接MySQL数据库的最优JDBC代码
|
4天前
|
关系型数据库 MySQL Java
连接 MySQL 数据库使用 JDBC
连接 MySQL 数据库使用 JDBC
8 0
|
7天前
|
SQL 存储 关系型数据库
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)
|
12天前
|
Java 数据库连接 数据处理
实时计算 Flink版产品使用问题之JDBC连接器实时同步的时候如何删除数据吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
18天前
|
存储 分布式计算 大数据
MaxCompute产品使用合集之在sql里调用自定义的udf时,设置一次同时处理的数据行数,是并行执行还是串行执行的
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
图解各种SQL连接
图解各种SQL连接 连接的分类 内连接 等值连接(INNER JOIN) 自然连接(NATURAL JOIN) 交叉连接(CROSS JOIN) 不等连接 外连接 左外连接(LEFT OUTER) 右外连接(RIGHT OUTER) 全外连接(FULL OUTER) 连接类型 说明 图例 SQL示例
1800 0