-1

我有一个文本文件,我从中读取值

FileInputStream file = new FileInputStream("C:/workspace/table_export.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(file));
String line = null;
while( (line = br.readLine())!= null )
{
        String [] tokens = line.split("\\s+");
        String var_1 = tokens[0];
        System.out.println(var_1);
        getstaffinfo(var_1,connection);
}

从文本文件中读取的值被传递给getstaffinfo 方法来查询数据库

public static String getstaffinfo(String var_1, Connection connection) throws SQLException, Exception
  // Create a statement
   {
   StringBuffer query = new StringBuffer();
   ResultSet rs = null;
   String record = null;
   Statement stmt = connection.createStatement();
   query.delete(0, query.length());
   query.append("select firstname, middlename, lastname from users where employeeid = '"+var_1+"'");
   rs = stmt.executeQuery(query.toString());
       while(rs.next())
       {
   record = rs.getString(1) + " " +
                  rs.getString(2) + " " +
                  rs.getString(3);
  System.out.println(record);
 }
 return record;
}

我从传递给getstaffinfo方法的文本文件中读取了近14000个值,所有数据库活动都具有加载驱动程序,建立连接都可以正常工作。但是在打印的时候

它抛出错误

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
ORA-01000: maximum open cursors exceeded

尽管我知道此错误与数据库配置有关,但是否有一种有效的方法可以进行一次数据库调用并执行从文本文件中读取的多个值的查询。任何输入都会很有用。

提前谢谢了!!

4

5 回答 5

3

在 while 循环之后关闭 ResultSetrs.close();和 Statement ,最好在一个stmt.close();getstaffinfo()finally{}

于 2013-09-17T11:07:55.603 回答
0

您需要关闭 resultSet viars.close();和 Statement viastmt.close();

while(rs.next()){
   record = rs.getString(1) + " " +
            rs.getString(2) + " " +
            rs.getString(3);
   System.out.println(record);
}
rs.close();
stmt.close();
于 2013-09-17T11:09:11.853 回答
0

问题是你没有closeingResultSet并且Statement(虽然你正在处理一个很好Connection),尝试关闭资源,错误不应该发生。

更大的问题是,如果您关闭,您将达到数据库n的次数,其中n过滤条件的数量是多少。对此的一种解决方案可能是 makein子句而不是=选择。例如:

假设总行数 = N,分成 x 个块,因此制作 N/x 个select语句

例如是N=20000,x=1000;你需要发射 20selects而不是 20000。

于 2013-09-17T11:10:01.317 回答
0

像这样关闭结果集和语句

rs.close(); stmt.close();
于 2013-09-17T11:10:26.363 回答
0

最好的方法是在查询中使用IN子句并且只调用一次方法。

 FileInputStream file = new FileInputStream("C:/workspace/table_export.txt");
 BufferedReader br = new BufferedReader(new InputStreamReader(file));
 String line = null;
 String var_1 = "";
 while( (line = br.readLine())!= null )
 {
    String [] tokens = line.split("\\s+");
    var_1 = var_1+tokens[0]+",";
    System.out.println(var_1);
}
var_1 = var_1.subString(0,var_1.lastIndexOf(","));
getstaffinfo(var_1,connection);

getstaffinfo()像这样 改变

public static List<String> getstaffinfo(String var_1, Connection connection) throws SQLException, Exception
// Create a statement
{
 StringBuffer query = new StringBuffer();
 ResultSet rs = null;
 String record = null;
 List<String> list = new ArrayList<String>();
 Statement stmt = connection.createStatement();
 query.delete(0, query.length());
 query.append("select firstname, middlename, lastname from users where employeeid IN ("+var_1+")");
 try{
  rs = stmt.executeQuery(query.toString());
   while(rs.next())
   {
     record = rs.getString(1) + " " +rs.getString(2) + " " +rs.getString(3);
     System.out.println(record);
     list.add(record);
    }
    }finally{
        stmt.close();
        rs.close();
    }
    return list;
 }

注意:我们不能在“in 子句”中放置超过 1000 个值。
相关链接。
1. https://forums.oracle.com/thread/235143?start=0&tstart=0
2. java.sql.SQLException: - ORA-01000: 超过最大打开游标

于 2013-09-17T11:26:45.943 回答