Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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:插入查询异常_Java_Jdbc - Fatal编程技术网

Java:插入查询异常

Java:插入查询异常,java,jdbc,Java,Jdbc,我对数据库操作有疑问。我有一个insert查询应该运行10次。循环启动并在插入第6个时插入4或5个val,db连接失败一段时间后再次连接。那么会发生什么,, 它是否跳过该特定val或抛出异常或回滚整个操作 编辑:示例代码 try { String sql_ji_inser="insert into job_input values (?,?)"; PreparedStatement pst_ji_inser=OPConnect.prepareStatement(sql_ji_in

我对数据库操作有疑问。我有一个insert查询应该运行10次。循环启动并在插入第6个时插入4或5个val,db连接失败一段时间后再次连接。那么会发生什么,, 它是否跳过该特定val或抛出异常或回滚整个操作

编辑:示例代码

try
{
    String sql_ji_inser="insert into job_input values (?,?)";
    PreparedStatement pst_ji_inser=OPConnect.prepareStatement(sql_ji_inser);

    for(int i=0;i<v_new_data.size();i++)
            {
      Vector row=new Vector();
              row=(Vector)v_new_data.get(i);

              job_id=Integer.parseInt(row.get(0).toString());
              item_no=Integer.parseInt(row.get(1).toString());
              pst_ji_inser.setInt(1,job_id);
              pst_ji_inser.setInt(2,item_no);
              pst_ji_inser.addBatch();
            }
            System.out.println("No of rows inserted"+pst_ji_inser.executeBatch().length);
    }
    catch(Exception ex)
    {
           System.out.println("********Insert Exception*********************");
           ex.printStackTrace();
           return false;
    }
试试看
{
字符串sql_ji_inser=“插入作业输入值(?,)”;
PreparedStatement pst_ji_inser=OPConnect.prepareStatement(sql_ji_inser);

对于(int i=0;i,这取决于插入行的方式。如果在连接上的单个事务中插入行,该连接已被
connection.setAutoCommit(false)
关闭,并且在使用
connection.commit()完成插入查询后提交连接
并且在catch块内显式调用
connection.rollback()
,则整个事务将回滚。否则,您将依赖于无法控制的环境因素

另见:

更新:这里是对代码的重写。请注意,连接和语句应该在
try
之前声明,在
try
中获取,并在
finally
中关闭。这是为了防止异常情况下的资源泄漏

String sql = "insert into job_input values (?, ?)";
Connection connection = null;
PreparedStatement statement = null;

try {
    connection = database.getConnection();
    connection.setAutoCommit(false);
    statement = connection.prepareStatement(sql);

    for (List row : data) {
        statement.setInt(1, Integer.parseInt(row.get(0).toString()));
        statement.setInt(2, Integer.parseInt(row.get(1).toString()));
        statement.addBatch();
    }

    statement.executeBatch();
    connection.commit();
    return true;
} catch (SQLException e) {
    if (connection != null) try { connection.rollback(); } catch (SQLException logOrIgnore) {}
    e.printStackTrace();
    return false;
} finally {
    if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}

顺便说一句,我不喜欢在这里返回一个
布尔值。我只是让方法
无效
,让
catch
抛出e
,然后将调用代码放入一个
try catch

@BalusC:谢谢,我没有使用任何自动提交()和回滚()。在try块中,我使用了insert查询和addbatch()对于所有值,最后使用executeBatch()执行,然后相应地修复它。顺便问一下,
Vector
确实是一个遗留类。这是一个您必须维护的15年的代码库吗?自从Java 1.2引入以来,
ArrayList
作为
Vector
@BalusC的高级替代品:请注意编辑的帖子
String sql = "insert into job_input values (?, ?)";
Connection connection = null;
PreparedStatement statement = null;

try {
    connection = database.getConnection();
    connection.setAutoCommit(false);
    statement = connection.prepareStatement(sql);

    for (List row : data) {
        statement.setInt(1, Integer.parseInt(row.get(0).toString()));
        statement.setInt(2, Integer.parseInt(row.get(1).toString()));
        statement.addBatch();
    }

    statement.executeBatch();
    connection.commit();
    return true;
} catch (SQLException e) {
    if (connection != null) try { connection.rollback(); } catch (SQLException logOrIgnore) {}
    e.printStackTrace();
    return false;
} finally {
    if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}