我有一个文本文件,我从中读取值
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方法以查询db
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个值,并将其传递给getstaffinfo方法,所有数据库活动都有加载驱动程序,建立连接一切正常。但是在打印时
它抛出错误
java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
ORA-01000: maximum open cursors exceeded
虽然我知道这个错误与数据库配置有关,是否有一种有效的方式来进行一次数据库调用,并且从文本文件中读取多个值的查询。 任何输入都会很有用。
非常感谢提前!!
答案 0 :(得分:3)
在rs.close();
中的while循环后关闭ResultSet stmt.close();
和语句getstaffinfo()
,最好在finally{}
答案 1 :(得分:0)
您需要通过rs.close();
关闭resultSet,并通过stmt.close();
while(rs.next()){
record = rs.getString(1) + " " +
rs.getString(2) + " " +
rs.getString(3);
System.out.println(record);
}
rs.close();
stmt.close();
答案 2 :(得分:0)
问题是您不是close
ResultSet
和Statement
(虽然您正在处理一个Connection
是好的),请尝试关闭资源,错误不应该发生。
更大的问题是,如果您关闭,那么n
数量为过滤条件数n
的数量in
。对此的一个解决方案可以是=
子句而不是select
选择。
e.g:
假设总行数= N,分成x个块,因此生成N / x selects
个语句
例如,N = 20000,x = 1000;你需要点燃20 {{1}}而不是20000。
答案 3 :(得分:0)
关闭结果集和语句 像这样
rs.close(); stmt.close();
答案 4 :(得分: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: maximum open cursors exceeded