2010-08-20 96 views
1

当我尝试查询数据库并将结果写入文件时,出现此错误。 它从来没有发生过。查询和写入文件:errorcode 28

java.sql.SQLException中:错误写入 文件 '/ TMP/MYwADPLw'(ERRCODE:28)

在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)(MysqlIO.java:2870) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect( MysqlIO.java:1665) at com.mysql.jdbc.Connection.execSQL(Connection.java:3170) 在 com.mysql.jdbc.Connection.execSQL(Connection.java:3099) 在 com.mysql.jdbc.Statement.executeQuery(Statement.java:1169) 在DBase.connect(DBase.java:58)
//这是其中i调用的executeQuery 在 automateExport.main(automateExport.java:11)​​在螺纹 异常 “主” 显示java.lang.NullPointerException在 automateExport.main(automateExport.java:13) //与db连接的主类

结果集我期待ng非常大。 当我查询较小的结果集时,我从来没有遇到这个问题。 它可能是空间问题?我的光盘上有117 GB。但我期待最多1GB的文本数据。 任何解决方案???

我的代码:

public Connection connect(String db_connect_str,String db_userid, String db_password) { 
     Connection conn; 
     Statement stmt; 
     String query; 
    // inputfile - csv 
     String input = "inputfile.txt"; 
     try { 
     // to bifurcate heap memory error 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      conn = DriverManager.getConnection(db_connect_str,db_userid, db_password); 
      stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, 
        java.sql.ResultSet.CONCUR_READ_ONLY); 
      stmt.setFetchSize(Integer.MIN_VALUE); 

      query = "SELECT r.name, r.network , r.namestring, i.name, i.description "+ 
      " , r.rid , i.id, d.dtime ,d.ifInOctets , d.ifOutOctets , FROM_UNIXTIME(d.dtime)"+ 
      " FROM router AS r INNER JOIN interface AS i ON r.rid = i.rid " + 
      "INNER JOIN 1278993600_1_60 AS d ON i.id = d.id " + 
      "AND dtime BETWEEN " +startTime+ " AND "+ endTime +" WHERE r.network = 'ITPN'" + 
        "AND i.status = 'active' ORDER BY i.id, d.dtime"; 

      BufferedWriter fw = new BufferedWriter(new FileWriter(input));    
      ResultSet rs = stmt.executeQuery(query); 
      String idescp = null; 
      // writing to file 
      while (rs.next()) { 
       if(rs.getString("description").equals(null)){ 
        System.out.println("description" +rs.getString("description")); 
        idescp = "NA"; 
        System.out.println("idescp :" +idescp + ":"); 
       }else{ 
        idescp = rs.getString("description"); 
       } 
       fw.write(rs.getString(1)+","+ rs.getString("rid")+","+ rs.getString("id") + "," +idescp+"," 
         +rs.getString("dtime")+ "," +rs.getString("ifInOctets")+ "," + 
         rs.getString("ifOutOctets") + ","+ rs.getString(11)+NL); 
      } 

      fw.close(); 
      rs.close() ; 
      stmt.close() ; 
     } catch(Exception e) { 
      e.printStackTrace(); 
      conn = null; 
     } 
     return conn; 
    } 

请帮助。 谢谢。

+0

你能告诉我们你的automateExport主方法是什么样子吗? – 2010-08-20 17:11:12

+0

public class automateExport {public static void main(String [] args)throws SQLException { DBase db = new DBase(); Connection conn = db.connect(“jdbc:mysql://comm.comng..com/perf”,“bread”,“nm36”); conn.close(); } } – JJunior 2010-08-20 17:12:57

+0

适用于较小的数据结果集。为更大的结果集提供上述错误。 – JJunior 2010-08-20 17:14:51

回答

2

也许数据库用尽了文件上的临时空间。我会检查给定的路径,数据库运行的帐户是否有权写入一些数据。

+0

但我运行它并将其写入我的机器上。文件被创建在我的工作区 – JJunior 2010-08-20 17:22:32

+0

并且MySQL引擎是以您的帐户启动的?错误信息中提到的驱动器上是否有足够的可用空间? – Frank 2010-08-20 17:25:18

+0

我不知道这可能是哪个驱动器:'/ tmp/MYwADPLw' 我只写在我的机器上。只需查询数据库的数据。 – JJunior 2010-08-20 17:32:37

0

MySQL会将大型结果集写入磁盘进行流式处理。数据库服务器的/ tmp文件夹可能会像@Frank所建议的那样填满。