2010-08-20 30 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所建議的那樣填滿。