java中的突然结果集行为
在过去的2-3天里,我遇到了一个问题。这似乎是个小问题,但我一直没能抓住 问题在于代码中的resultset rs方法mergeTable中的while(rs.next())语句行为异常。在某些情况下,它第一次进入while循环,有时不进入,在少数情况下,当它进入while循环时,它会突然抛出resultset depened exception。我在谷歌上搜索,发现结果集可能已经被其他访问代码的线程关闭了。但这是一个简单的独立java应用程序,不是多线程的 我还要注意另外两个结果集,check和checktarget不会干扰结果集rs。我还要关闭语句和结果集。 请你看一下代码,看看我是否遗漏了什么 正在使用的两个数据库实例是10.180.22.93:1521:V3demo(称为源数据库)和10.180.22.93:1521:fusiondb(称为目标数据库)。rs resultset来自源数据库。resultset check和checktarget来自目标数据库。因此,结果集rs将来自源数据库的表A,而结果集check和checktarget将来自目标数据库的表Ajava中的突然结果集行为,java,jdbc,resultset,Java,Jdbc,Resultset,在过去的2-3天里,我遇到了一个问题。这似乎是个小问题,但我一直没能抓住 问题在于代码中的resultset rs方法mergeTable中的while(rs.next())语句行为异常。在某些情况下,它第一次进入while循环,有时不进入,在少数情况下,当它进入while循环时,它会突然抛出resultset depened exception。我在谷歌上搜索,发现结果集可能已经被其他访问代码的线程关闭了。但这是一个简单的独立java应用程序,不是多线程的 我还要注意另外两个结果集,check
static String mergeTable() throws Exception {
String result = "ERROR";
int error = 0;
String tableString = "<table " + tablename + ">";
PreparedStatement preparedSelect = null;
PreparedStatement preparedSelectTarget = null;
Statement selectSourceStmt = null;
ResultSet checkTarget = null;
ResultSet rs = null;
try {
logger.println("====================================================================================");
logger.println("Processing table:" + tablename);
System.out.println("====================================================================================");
System.out.println("Processing table:" + tablename);
// Create query to fetch records from the source
String sourceQuery = "SELECT * FROM " + tablename;
if (owner.trim().equals("F1") || owner.trim().equals("C1") || owner.trim().equals("CM"))
sourceQuery = sourceQuery + " WHERE OWNER_FLG='" + owner + "'";
// Get the result set
selectSourceStmt = source.createStatement();
rs = selectSourceStmt.executeQuery(sourceQuery);
System.out.println(sourceQuery);
String selectSQL = "SELECT COUNT(*) FROM " + tablename + " WHERE ";
String selectSQLTarget = "SELECT * FROM " + tablename + " WHERE "; // ankush
ResultSetMetaData metaData = rs.getMetaData();
List list = new ArrayList();
List typesList = new ArrayList();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
String columnName = metaData.getColumnName(i);
list.add(columnName); // list contains the entire list of columns of the source
typesList.add(metaData.getColumnType(i));
}
for (int i = 1; i < keys.length; i++) {
if (i == 1) {
selectSQL = selectSQL + " " + keys[i] + "= ?";
selectSQLTarget = selectSQLTarget + " " + keys[i] + "= ?"; //ankush
}
else {
selectSQL = selectSQL + " AND " + keys[i] + "= ?";
selectSQLTarget = selectSQLTarget + " AND " + keys[i] + "= ?"; //ankush
}
}
logger.println("Select SQL:" + selectSQL);
logger.println("selectSQLTarget:" + selectSQLTarget); //ankush
preparedSelect = target.prepareStatement(selectSQL);
preparedSelectTarget = target.prepareStatement(selectSQLTarget); //ankush
int updateCount = 0, insertCount = 0, errorCount = 0;
// rs contains the entire table snapshot of source based on the owner flag
if (rs != null) {
while (rs.next()) {
try {
int i, count;
// check if record exists or not; keys contain the values of primary columns specified in the.lst file
for (int j = 1; j < keys.length; j++) {
preparedSelect.setObject(j, rs.getObject(keys[j])); // for every single row in source, corresponding rows are fetched from target.Here, where clause is being prepared
}
ResultSet check = preparedSelect.executeQuery(); // check is the target resultset for the primary key values in current row of source resultset
check.next();
count = check.getInt(1); // count gives the row/s fetched from target based on the values in source.
check.close();
// check if record exists or not; keys contain the values of primary columns specified in the.lst file
for (int j = 1; j < keys.length; j++) {
// for every single row in source, corresponding rows are fetched from target.Here, where clause is being prepared
preparedSelectTarget.setObject(j, rs.getObject(keys[j]));
}
// check is the target resultset for the primary key values in current row of source resultset
checkTarget = preparedSelectTarget.executeQuery();
checkTarget.next();
// if record exists UPDATE CONDITION
if (true) { // if there is a record in target for a row in source, update target
String rowString = "<row>";
String rowDiffFlag = "N";
// if merge flag is Y
if (mergeFlag.equals("Y")) {
String colDiffFlag = "";
String sourceColVal = "";
String targetColVal = "";
// list contains the column names
for (i = 0; i < list.size(); i++) {
System.out.println("value of i " + i);
}
i++; // ?????
} else {
logger.print("Did not update Record:");
}
rowString = rowString + "</row>";
if (rowDiffFlag.equals("Y")) {
tableString = tableString + rowString;
}
} else { // if there is no record in target for a row in source, insert into target
String sourceColVal = "";
String rowString = "<row>";
for (i = 0; i < list.size(); i++) { //looping through columns in a row
System.out.println("column " + i);
}
rowString = rowString + "</row>";
tableString = tableString + rowString;
}
} catch (Exception e1) {
e1.printStackTrace(logger);
}
}
}
} catch (Exception e) {
e.printStackTrace(logger);
} finally {
preparedSelect.close();
preparedSelectTarget.close();
selectSourceStmt.close();
checkTarget.close();
rs.close();
}
tableString = tableString + "</table>";
formXmlString(tableString);
if (error == 0) result = "SUCCESS";
return result;
}
静态字符串mergeTable()引发异常{
字符串result=“ERROR”;
整数误差=0;
字符串tableString=“”;
PreparedStatement preparedSelect=null;
PreparedStatement preparedSelectTarget=null;
语句selectSourceStmt=null;
ResultSet checkTarget=null;
结果集rs=null;
试一试{
logger.println(“===========================================================================================================================================”);
logger.println(“处理表:“+tablename”);
System.out.println(“========================================================================================================================================================================================================================================”;
System.out.println(“处理表:“+tablename”);
//创建查询以从源获取记录
String sourceQuery=“SELECT*FROM”+表名;
如果(owner.trim().equals(“F1”)| | owner.trim().equals(“C1”)| | owner.trim().equals(“CM”))
sourceQuery=sourceQuery+“其中OWNER_FLG=”“+OWNER+””;
//获取结果集
选择sourcestmt=source.createStatement();
rs=selectSourceStmt.executeQuery(sourceQuery);
System.out.println(sourceQuery);
String selectSQL=“从“+tablename+”WHERE”中选择计数(*);
String selectSQLTarget=“SELECT*FROM”+tablename+“WHERE”;//ankush
ResultSetMetaData元数据=rs.getMetaData();
列表=新的ArrayList();
列表类型列表=新的ArrayList();
对于(inti=1;i噢,天哪,这里的内容太多了。我看到HTML和JDBC代码混合在一起。这是个坏主意
数据库连接不是线程安全的。您说您正在注意确保您的结果集不受干扰,但此错误表明情况并非如此。我将重构此代码以隔离持久性并使每件事情变得更简单。这在我看来是错误的,但我不愿意仔细研究它以找出原因。您确定吗e resultset耗尽异常在rs resultset上,而不是在其他两个可能的resultset上:check和checkTarget?你能缩小你的问题吗?不太可能有人通读所有代码。缩小..而rs.next循环在mergetable方法中..我正在写入一个包含节点的文本文件,节点由c决定正在对数据库实例上的表(具有相同名称)的各个列进行比较。只是想一想:由于这些语句位于同一个表上,准备好的语句是否会产生干扰。preparedSelect=target.prepareStatement(selectSQL);preparedSelectTarget=target.prepareStatement(selectSQLTarget);