- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试运行多个相互构建的 MySQL 查询:即每行中一个元素的字段值用作另一个查询的输入。
我最终得到以下错误:
java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@174cc1f is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:914)
at com.mysql.jdbc.MysqlIO.checkForOutstandingStreamingData(MysqlIO.java:2074)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1484)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3099)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1169)
at Stats.readInterfaces(Stats.java:105)
at Stats.connect(Stats.java:63)
at automateExport.main(automateExport.java:15)
我在查询的每个 ResultSet
和 Statement
之后调用了 .close()
。我想我们不能同时打开多个结果集。有什么办法可以解决这个问题吗?
相关代码如下:
public class Stats {
public static int UTC = 0;
public String interfaceId = "no value";
public String rId = "no value";
public String NL = System.getProperty("line.separator");
public String CSV = ",";
public static String startTime,endTime,performanceTable =null;
public static int outputType = 1;
public String pTable = "('2010-7-13 00:00')";
public String start = "('2010-7-13 09:00')";
public String end = "('2010-7-13 17:00')";
Connection conn;
Statement stmtRouter, stmtInterface, stmtTime, stmtD;
String query;
ResultSet rsRouter, rsInterface, rsD, rsTime;
public Connection connect(String db_connect_str,String db_userid, String db_password) {
String routerName,routerId = null, routerNetwork = null;
// inputfile - csv
try {
// to bifurcate heap memory error
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(db_connect_str,db_userid, db_password);
stmtRouter = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmtRouter.setFetchSize(Integer.MIN_VALUE);
query = "Select r.name,r.rid,r.network FROM router AS r Where r.network = 'ITPN'";
String append = null;
// writing to file
performanceTable = readTime(pTable);
startTime = readTime(start);
endTime = readTime(end);
rsRouter = stmtRouter.executeQuery(query);
while (rsRouter.next()) {
routerName = rsRouter.getString(1);
System.out.println(routerName);
// routerId = rsRouter.getString("rid");
// routerNetwork = rsRouter.getString("network");
append = routerName+CSV+routerId+CSV+routerNetwork;
readInterfaces(routerId,startTime,endTime,performanceTable, append);
}
stmtRouter.close() ;
rsRouter.close();
// output(2,input);
// output(outputType , input);
} catch(Exception e) {
e.printStackTrace();
conn = null;
}
return conn;
}
private String readTime(String time) throws SQLException {
stmtTime = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmtTime.setFetchSize(Integer.MIN_VALUE);
query = "Select unix_timestamp"+time;
rsTime = stmtTime.executeQuery(query);
String unixTime = null;
while(rsTime.next()){
unixTime = rsTime.getString(1);
System.out.println(unixTime);
}
rsTime.close();
stmtTime.close();
return unixTime;
}
private void readInterfaces(String routerId, String startTime, String endTime, String performanceTable, String append) throws SQLException, IOException {
String interfaceId, iDescp, iStatus = null;
String dtime, ingress, egress = null;
stmtInterface = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmtInterface.setFetchSize(Integer.MIN_VALUE);
stmtD = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmtD.setFetchSize(Integer.MIN_VALUE);
query = " Select i.id,i.description, i.status from interface as i Where i.rid = " + routerId +" And i.status = 'active'";
rsInterface = stmtInterface.executeQuery(query);
String input = "inputData.txt";
BufferedWriter fw = new BufferedWriter(new FileWriter(input));
stmtInterface.close();
while(rsInterface.next()){
interfaceId = rsInterface.getString("id");
iDescp = rsInterface.getString("description");
iStatus = rsInterface.getString("status");
if(!iStatus.equals("active")){
/* performance table query*/
query = " Select d.dtime,d.ifInOctets, d.ifOutOctets from "+performanceTable+"_1_60" +" AS d Where d.id = " +
interfaceId + "AND dtime BETWEEN " +startTime+ " AND "+ endTime + " Order By d.id";
rsD = stmtD.executeQuery(query);
while(rsD.next()){
dtime = rsD.getString("dtime");
ingress = rsD.getString("ifInOctets");
egress = rsD.getString("ifOutOctets");
fw.write(append + CSV + interfaceId+CSV+iDescp+CSV+dtime+CSV+ingress+CSV+egress+NL);
}// end of while
rsD.close();
stmtD.close();
}
}
fw.close();
// rsInterface.close() ;
// stmtInterface.close();
}
}
最佳答案
确切地说,正如错误所说,当您打开了一个流 结果集时,您不能通过同一连接发出其他查询。相关文档为here .
因此,显而易见的解决方案是不为驾驶查询使用流式结果集。这样做的缺点是它会使用更多的内存。代码顶部相当晦涩的注释暗示可能有人已经尝试过此操作并且存在内存问题。
总之,有更好的解决办法。这是过度程序化的典型例子。您正在使用可以由数据库引擎更好地处理的代码进行工作。您可以使用联接将这些查询组合成一个查询,而不是执行相互驱动的单表查询:
Select r.name,r.rid,r.network,i.id,i.description, i.status
FROM router AS r JOIN interface as i ON i.rid = r.rid
Where r.network = 'ITPN'
AND i.status='active'
然后,您有第三个“嵌套”查询,您可以将其与附加连接合并。我认为会是:
Select r.name,r.rid,r.network,i.id,i.description, i.status,d.dtime,d.ifInOctets, d.ifOutOctets
FROM router AS r JOIN interface as i ON i.rid = r.rid
JOIN <performanceTable>_1_60 as d ON d.id = i.id
Where r.network = 'ITPN'
AND i.status='active'
AND dtime BETWEEN <startTime> AND <endTime>
Order By d.id
您可能不需要最终选择列表中的所有这些列,但我还没有仔细阅读您的代码以查看真正使用的是什么。
关于java - 流式处理结果集错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3550263/
我刚刚更新了 Ruby,现在我在尝试启动 compass 时遇到以下错误: Encoding::CompatibilityError on line ["28"] of /usr/local/Cell
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在我的 iOS 应用程序中开发可折叠/ Accordion 式的功能。这将是您可以在网站上找到的典型 FAQ 类型功能。我想点击标题,然后显示详细信息。 因为这是帮助部分,只有几个项目,我认
我正在尝试设计一个基于 REST 的 Web 服务来与我正在开发的农场动物管理系统进行交互。 为了详细说明问题,我收藏了动物 属于一个农场。每只动物都有自己的信息——例如姓名、身份证号、品种年龄等。因
我有 3 种不同的表单,其中复选框数量不同,每个部分基本上代表一个表单,因此当用户选择该部分中的复选框时,它会显示他们在该部分的总金额中 checkout 了多少 HTML
我有一份 32 页的 PDF 版家谱。与其将家谱全部放在一个非常大的 PDF 页面上(这是我想要的),不如将其格式化为一组 8 个单独的美国信纸大小的页面应该在整个宽度上缝合; 4 行这样就完成了树。
指SASS implementation for Java? : 在 Maven 目标编译包中自动编译 compass-style.org 样式表的最佳方法是什么? 我不想发送太多的自编译库,也不想通
鉴于以下 XAML... 我正在寻找一种绑定(bind) ComboBox、Button 和 Command 的方法,以便当 ComboBox 的值更改时,在 Command 上调用 CanExe
在玩具应用程序中,我有一个显示所有帖子标题的“帖子”模板。当您单击每个标题时,我不想直接进入“显示” View ,而是直接内联展开该帖子的其余内容。 我考虑过让 postRoute 重用 postsR
我需要一些使用 Twitter Bootstrap 或其他响应式框架的自定义 Swagger-UI 实现。需要在我的移动设备上使用这样的 UI 测试我的 API,但 swagger-ui 不能很好地扩
我正在做一个项目,我真的在尝试编写面向对象的 JavaScript 代码。我刚刚开始阅读Douglas Crockford's JavaScript: The Good Parts我很快开始意识到用
在 C# 中,我通过执行以下操作来加密文本数据(请注意我正在以 block ( block )的形式加密数据): public string EncryptData(string pu
我正在构建一个社交网站,该网站将向全世界公开 REST API (WCF WebAPI),以便任何开发人员都能够为该网站创建客户端应用程序、将其与其他服务集成等。 我想为 API 实现 Faceboo
我是一名优秀的程序员,十分优秀!