Java:插入查询异常
我对数据库操作有疑问。我有一个insert查询应该运行10次。循环启动并在插入第6个时插入4或5个val,db连接失败一段时间后再次连接。那么会发生什么,, 它是否跳过该特定val或抛出异常或回滚整个操作 编辑:示例代码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
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) {}
}