Запрос и запись в файл: код ошибки 28

Я получаю эту ошибку, когда пытаюсь выполнить запрос к базе данных и записать результаты в файл. Это никогда не происходило раньше.

java.sql.SQLException: Ошибка записи файл '/ tmp / MYwADPLw' (код ошибки: 28)

в com.mysql.jdbc.SQLError.createSQLException (SQLError.java:946) в com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:2870) в com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1573) в com.mysql.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:1665) в 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)
// здесь я вызываю executequery в automateExport.main (automateExport.java:11) Исключение в теме "главная" java.lang.NullPointerException в automateExport.main (automateExport.java:13) // основной класс с подключением к БД

Ожидаемый набор результатов очень большой. У меня никогда не было этой проблемы, когда я запрашивал меньший набор результатов. Это могут быть космические проблемы? У меня на диске 117 гб. Но я ожидаю максимум 1 ГБ текстовых данных. Любые решения ???

Мой код:

 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;
    }

Пожалуйста, помогите. Спасибо.

1
задан Romain Hippeau 20 August 2010 в 21:05
поделиться

2 ответа

Возможно, в базе данных закончилось место для временного файла. Я бы проверил, если указанный путь, учетная запись, на которой работает база данных, имеет право и пространство для записи некоторых данных.

2
ответ дан 2 September 2019 в 21:57
поделиться

MySQL будет записывать большие наборы результатов на диск для потоковой передачи. Папка /tmp сервера базы данных, вероятно, заполняется, как предполагает @Frank.

0
ответ дан 2 September 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: