Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jdbc对数据库进行多查询_Java_Sql_Jdbc - Fatal编程技术网

Java 使用jdbc对数据库进行多查询

Java 使用jdbc对数据库进行多查询,java,sql,jdbc,Java,Sql,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 = l

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

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);
}
从文本文件读取的值被传递给getStatffInfo方法以查询数据库

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;
}
我从文本文件中读取了近14000个值,这些值被传递给getStatffInfo方法,所有数据库活动(如加载驱动程序、建立连接)都可以正常工作。但在印刷时

它抛出错误

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
ORA-01000: maximum open cursors exceeded
虽然我知道这个错误与数据库配置有关,但是否有一种有效的方法来进行一次db调用并对从文本文件读取的多个值执行查询。 任何投入都会大有裨益


非常感谢

关闭结果集
rs.Close()和语句
stmt.close()
getstaffinfo()
中执行while循环后,最好是在
最后{}
中,您需要通过
rs.close()关闭结果集和通过
stmt.close()的语句


问题是您没有关闭
结果集
语句
(尽管您正在处理一个
连接
),请尝试关闭资源,但不应发生错误

更大的问题是,如果您关闭,您将点击DB
n
的次数,其中
n
是过滤条件的数量。解决这个问题的一个方法是在
子句中设置
,而不是选择
=
。 e、 g:

假设总行数=N,将其分成x个块,从而生成N/x
select
语句


例如,N=20000,x=1000;您需要触发20个
选项,而不是20000个。

关闭结果集和语句 这样

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;
 }
publicstaticlist getstaffinfo(字符串var_1,连接)抛出SQLException,Exception
//创建一个语句
{
StringBuffer查询=新建StringBuffer();
结果集rs=null;
字符串记录=null;
列表=新的ArrayList();
语句stmt=connection.createStatement();
query.delete(0,query.length());
query.append(“从employeeid位于(“+var_1+”)中的用户中选择firstname、middlename、lastname”);
试一试{
rs=stmt.executeQuery(query.toString());
while(rs.next())
{
记录=rs.getString(1)+“”+rs.getString(2)+“”+rs.getString(3);
系统输出打印项次(记录);
列表。添加(记录);
}
}最后{
stmt.close();
rs.close();
}
退货清单;
}
注意:我们不能在“in子句”中输入超过1000个值。
相关链接。
1.

2.

什么是resultSet?您尚未定义resultSet应替换为rsI的任何位置。我怀疑您的数据库连接/语句中存在漏洞。确保完成后正确关闭。@navman如果我添加rs.close(),我无法理解hi Bimalesh;stmt.close();返回记录;这不是返回记录。每个值都会调用该方法,因此需要返回。按照您的建议,我没有得到任何异常,但查询后的值不会返回。如果您有任何想法,请在代码示例中添加close()来修改您的问题,这样我们就可以看到发生了什么。公共静态字符串getstaffid(String var_1,Connection Connection)抛出SQLException,Exception//创建一条语句{String record=null;ResultSet rs=null;Statement stmt=connection.createStatement();尝试{rs=stmt.executeQuery(“从globalusers中选择firstname、middlename、lastname,其中username=”“+var_1+””);而(rs.next()){record=rs.getString(1)++rs.getString(2)++rs.getString(3);System.out.println(record);}}最后{rs.close();stmt.close();}返回record;}//工作正常。Thankspublic静态字符串getstaffid(字符串var_1,连接连接)抛出SQLException,Exception//创建语句{String record=null;ResultSet rs=null;Statement stmt=connection.createStatement();尝试{rs=stmt.executeQuery(“从globalusers中选择firstname、middlename、lastname,其中username=”“+var_1+””);而(rs.next()){record=rs.getString(1)++rs.getString(2)++rs.getString(3);System.out.println(记录);}}最后{rs.close();stmt.close();}返回记录;}
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;
 }