2012-11-09 44 views
0

我正在實現一個JAVA應用程序,它從不同的URL獲取數據並將這些數據存儲到數據庫。每個表都有自己的URL集合,從中可以接收數據。我通過爲每個表執行預備陳述,從URL獲取數據,將數據綁定到預處理並以批處理形式添加數據,直到完成表的所有URL完成爲止。然後在prepare語句上執行executeBatch。我有6-8張桌子,每桌有200排。我做同樣的步驟,對每個表,但更新3-4表後,我的executeBacth是thrwoing一個異常,說:Java程序在執行批處理時拋出異常

java.sql.SQLException: SQL Exception : [Microsoft][ODBC Driver 
Manager] Invalid string or buffer length at 
sun.jdbc.odbc.JdbcOdbcPreparedStatement.setObject(JdbcOdbcPreparedStatement.java:1438) 
    at 
sun.jdbc.odbc.JdbcOdbcPreparedStatement.setObject(JdbcOdbcPreparedStatement.java:1073) 
    at 
sun.jdbc.odbc.JdbcOdbcPreparedStatement.emulateExecuteBatch(JdbcOdbcPreparedStatement.jjva:2104) 
    at 
sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeBatchUpdate(JdbcOdbcPreparedStatement.java:1782) 
    at 
sun.jdbc.odbc.JdbcOdbcStatement.executeBatch(JdbcOdbcStatement.java:911) 
    at FaoClient.CFaoTable.InsertFromPartialSource(CFaoTable.java:174) 

我已經改變抓取,表中的數據的測試順序相同的程序,但它插入數據4-5表後總是拋出異常。我覺得它就像一些內存泄漏的情況,但正如我所知,JAVA的收集器永遠不會讓這種情況發生。我對這個JAVA世界很陌生,所以我可能是錯的。我正在粘貼我的代碼的一部分,它使用java.sql。*來插入記錄。

private boolean BindValueToStmt(PreparedStatement ps, int index, TableCol.ColType type, String ColVal) { 
     if ((ps == null) || (ColVal == "")) { 
      return false; 
     } 
     try { 
      switch (type) { 
       case INTEGERT: { 
        ps.setInt(index, Integer.parseInt(ColVal)); 
        return true; 
       } 
       case STRINGT: { 
        ps.setString(index, ColVal); 
        return true; 
       } 
       case REALT: { 
        ps.setFloat(index, Float.parseFloat(ColVal)); 
        return true; 
       } 
       case DOUBLET: { 
        ps.setDouble(index, Double.parseDouble(ColVal)); 
        return true; 
       } 
       default: 
        ps.setNull(index, java.sql.Types.NULL); 
      } 
      return true; 
     } catch (SQLException E) { 
      System.out.println("Error in Setting the value of the col in table: " + Name + E); 
      E.printStackTrace(); 
      return false; 
     } 
    } 



    private String CreatePreparedInsertStatement() { 
     StringBuilder insertStmt = new StringBuilder("insert into " + Name + "("); 
     String val = " values ("; 
     for (int index = 0; index < Columns.size(); index++) { 
      TableCol col = Columns.get(index); 
      if (index != Columns.size() - 1) { 
       String Stmt = col.GetColName() + ", "; 
       insertStmt.append(Stmt); 
       val += "?, "; 
      } else { 
       String Stmt = col.GetColName() + ")"; 
       insertStmt.append(Stmt); 
       val += "?)"; 
      } 
     } 
     insertStmt.append(val); 
     return insertStmt.toString(); 
    } 

下面是實際插入數據的代碼。

private boolean InsertFromPartialSource(Connection conn, SAXReader reader) { 
     try { 
      if (conn == null || reader == null) { 
       return false; 
      } 
      //Some Code not realted to java.sql 

      conn.setAutoCommit(false); 
      String strPs= CreatePreparedInsertStatement(); 
      PreparedStatement ps = conn.prepareStatement(strPs); 

      //Some Code not realted to java.sql 

      for (int index = 0; index < Columns.size(); index++) { 
        TableCol col = Columns.get(index); 
        //Some Code not realted to java.sql 
        if (!BindValueToStmt(ps, index + 1, col.GetColType(), colVal)) { 
         ps.setNull(index + 1, TableCol.GetSqlColTypeFrmType(col.GetColType())); 
        } 
       } 
       rowCount++; 
       System.out.println(rowCount + "rows has been extracted for table \" " + Name); 
       ps.addBatch(); 

      } 
      if (rowCount > 0) { 
       int RecordsUpdated[] = ps.executeBatch(); 
      } 
      conn.commit(); 
      conn.setAutoCommit(true); 
      ps.close(); 
      return true; 
} 

我只粘貼功能InsertFromPartialSource這是有關爲清楚起見數據庫更新的一部分。請稍後指出哪裏出了問題?

解決上述問題的方法是: 將您的MySql連接器或驅動程序更改爲MySqlJDBC驅動程序。它可以是 找到下面的鏈接: http://dev.mysql.com/downloads/connector/j/5.1.html

+0

在'BindValueToStmt'的catch塊中,你應該重新拋出SQL異常,而不僅僅是捕獲它並返回false ... – home

+0

哪一行是CFaoTable.java:174? – auselen

+0

@auselen int RecordsUpdated [] = ps.executeBatch(); – Manish

回答

1

考慮切換到您的數據庫真正的JDBC驅動程序(如果有的話)。 JdbcOdbc橋很糟糕,特定的JDBC驅動程序通常效果更好。

0

您可以嘗試執行,而不是executeBatch,以避免批處理操作失敗。

+0

嗨,但是當您插入大量記錄時,對每條記錄執行inesert查詢將會非常低效。 – Manish

相關問題