簡體   English   中英

使用jdbc對數據庫進行多次查詢

[英]Multiple queries on database using jdbc

我有一個從中讀取值的文本文件

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

盡管我知道此錯誤與數據庫配置有關,但是是否存在一種有效的方法來進行一次數據庫調用並執行從文本文件讀取的多個值的查詢。 任何輸入將很有用。

提前謝謝了!!

關閉ResultSet rs.close(); 和語句stmt.close(); getstaffinfo() while循環之后,最好在finally{}內部

您需要通過rs.close();關閉resultSet rs.close(); 和聲明通過stmt.close();

while(rs.next()){
   record = rs.getString(1) + " " +
            rs.getString(2) + " " +
            rs.getString(3);
   System.out.println(record);
}
rs.close();
stmt.close();

問題是您沒有close ResultSetStatement (盡管您正在使用一個Connection很好),請嘗試關閉資源,但不會發生該錯誤。

更大的問題是,如果您確實關閉,則您擊中數據庫的次數為n ,其中n為過濾條件的數量。 一種解決方案是使用in子句代替= selection。 例如:

說總行數= N,分成x個塊,因此制作N / x個select語句

例如N = 20000,x = 1000; 您需要觸發20個selects而不是20000個selects

以這種方式關閉結果集和語句

rs.close(); stmt.close();

最好的方法是在查詢中使用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:超出最大打開游標

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM