Java: вставить запрос-исключение - PullRequest
1 голос
/ 18 сентября 2010

У меня есть сомнения относительно работы с базой данных. У меня есть один запрос на вставку, который должен выполняться 10 раз.цикл запускается и вставляется 4 или 5 val, а вставляется 6-й, соединение с БД на некоторое время оборвалось и снова подключилось.тогда что произойдет, пропустит ли это конкретное значение 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;
    }

Isэто правильный путь

try 
{
int count=0;// for checking no of inserting values
OPConnect.setAutoCommit(false);
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++)
    {
    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();
    count++;
    }
int norowinserted=pst_ji_inser.executeBatch().length;
if(count==norowinserted)
    {   
    OPConnect.commit();
    }
}
catch(Exception ex)
{
System.out.println("********Insert Exception*********************");
OPConnect.rollback();
ex.printStackTrace();
return false;
}

1 Ответ

3 голосов
/ 18 сентября 2010

Это зависит от того, как вы вставляете строки.Если вы вставляете их в одну транзакцию в соединении, для которого автоматическая фиксация отключена connection.setAutoCommit(false), и вы фиксируете соединение после завершения запросов вставки, используя connection.commit(), и вы явно вызываете connection.rollback() внутриблок catch, тогда вся транзакция будет откатана.В противном случае вы зависите от факторов окружающей среды, которые вы не можете контролировать.

См. Также:


Обновление: вот переписывание вашего кода.Обратите внимание, что соединение и оператор должны быть объявлены до 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) {}
}

Я, кстати, не фанат возврата boolean здесь.Я бы просто сделал метод void, разрешил catch throw e и поместил бы вызывающий код в try-catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...