Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序在executingbatch时引发异常_Java_Jdbc - Fatal编程技术网

Java程序在executingbatch时引发异常

Java程序在executingbatch时引发异常,java,jdbc,Java,Jdbc,我正在实现一个JAVA应用程序,它从不同的URL获取数据,并将这些数据存储到数据库中。每个表都有自己的URL集合,从中接收数据。为此,我为每个表实现了一个preparedstatement,从URL获取数据,将数据绑定到preparestatement,并作为一个批处理添加数据,直到完成表的所有URL。然后对prepare语句执行executeBatch。我有6-8张桌子,每张桌子有200行。我对每个表都执行相同的过程,但在更新3-4个表后,我的executeBacth出现异常,该异常表示:

我正在实现一个JAVA应用程序,它从不同的URL获取数据,并将这些数据存储到数据库中。每个表都有自己的URL集合,从中接收数据。为此,我为每个表实现了一个preparedstatement,从URL获取数据,将数据绑定到preparestatement,并作为一个批处理添加数据,直到完成表的所有URL。然后对prepare语句执行executeBatch。我有6-8张桌子,每张桌子有200行。我对每个表都执行相同的过程,但在更新3-4个表后,我的executeBacth出现异常,该异常表示:

 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 grabage collector永远不会让这种情况发生。我对这个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 BindValueToStmt(PreparedStatement ps,int index,TableCol.ColType,String ColVal){
if((ps==null)| |(ColVal==“”){
返回false;
}
试一试{
开关(类型){
案例整合:{
ps.setInt(index,Integer.parseInt(ColVal));
返回true;
}
案例STRINGT:{
ps.setString(索引,ColVal);
返回true;
}
案例房地产:{
ps.setFloat(index,Float.parseFloat(ColVal));
返回true;
}
双箱:{
ps.setDouble(index,Double.parseDouble(ColVal));
返回true;
}
违约:
ps.setNull(索引,java.sql.Types.NULL);
}
返回true;
}捕获(SQLE异常){
System.out.println(“设置表中列的值时出错:“+Name+E”);
E.printStackTrace();
返回false;
}
}
私有字符串CreatePreparedInsertStatement(){
StringBuilder insertStmt=新的StringBuilder(“插入到“+Name+”(”);
String val=“值(”;
对于(int index=0;index
下面是实际插入数据的代码

  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;
}
private boolean InsertFromPartialSource(连接连接,SAXReader){
试一试{
if(conn==null | | reader==null){
返回false;
}
//某些代码与java.sql不相关
连接设置自动提交(错误);
字符串strPs=CreatePreparedInsertStatement();
准备好的报表ps=conn.prepareStatement(strPs);
//某些代码与java.sql不相关
对于(int index=0;index0){
int RecordsUpdated[]=ps.executeBatch();
}
conn.commit();
conn.setAutoCommit(正确);
ps.close();
返回true;
}
为了清晰起见,我只粘贴了函数InsertFromPartialSource中与数据库更新相关的部分。请someonw指出这里出现了什么问题

上述问题的解决方案是: 将MySql连接器或驱动程序更改为MySqlJDBC驱动程序 可在以下链接中找到:
考虑为您的数据库切换到真正的JDBC驱动程序(如果有)。JdbcOdbc桥相当糟糕,特定的JDBC驱动程序通常工作得更好。

您可以尝试执行,而不是executeBatch,以避免跛脚的批处理操作。

在“BindValueToStmt”的catch块中,您应该真正重新显示SQL异常,而不仅仅是捕获它并返回false…哪一行是CFaoTable.java:174?@auselen int RecordsUpdated[]=考虑执行数据库的实际JDBC驱动程序(如果有一个)。JdbcOdbc桥相当糟糕,特定的JDBC驱动程序通常可以工作better@Manish:在发生SQL异常的情况下,进一步处理相应的行没有任何意义。请仔细查看您的执行路径-在SQL异常发生后继续处理没有任何意义(这甚至可能是您在问题中描述的问题的根本原因。您好,但是当您插入大量记录时,对每个记录执行inesert查询将非常低效。