JDBC и обновляемый набор результатов

Я немного узнаю о JDBC и о том, как взаимодействовать с базами данных. Я понимаю основы, но теперь столкнулся с проблемой с обновляемыми наборами результатов. В этом упражнении я должен проверить запас каждого пива в базе данных и добавить к нему 50.

Итак, этот небольшой фрагмент кода работает, но не всегда. я запускал его несколько раз, и примерно в 50% случаев акции действительно росли. чтобы проверить это, я написал еще один небольшой цикл while, который печатает таблицу с необходимыми данными. есть идеи, почему это не работает в 100% случаев?

в базе данных 1071 запись, и я запускал этот код сразу после получения результатов. Должен ли я ждать, прежде чем запускать его снова?

package stockbier;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class bierenstock {

public static void main(String[] args) {

try (Connection con = DriverManager.getConnection(
            "jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
    PreparedStatement stmt = con.prepareStatement
        ("select * from Beers", 
        ResultSet.TYPE_SCROLL_INSENSITIVE,
        ResultSet.CONCUR_UPDATABLE);) {

    ResultSet rs = stmt.executeQuery();
    while (rs.next()) {
            // edited int stock
        int stock = rs.getInt("Stock") + 50;
        rs.updateInt("Stock", stock);
        rs.updateRow();

    }

    rs.close();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

person YoNuevo    schedule 13.02.2014    source источник


Ответы (2)


Попробуйте внести следующие изменения:

public static void main(String[] args) {

try (Connection con = DriverManager.getConnection(
        "jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
PreparedStatement stmt = con.prepareStatement
    ("select * from Beers", 
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);) {

ResultSet rs = stmt.executeQuery();
while (rs.next()) {
    int stock = rs.getInt("Stock") + 50;
    rs.updateInt("Stock", stock);
    rs.updateRow();
}

} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    if (stmt != null) { stmt.close(); }
}    
}    

Тип объекта ResultSet определяет уровень его функциональности в двух областях: способы управления курсором и как одновременные изменения, внесенные в базовый источник данных, отражаются объектом ResultSet.

TYPE_SCROLL_INSENSITIVE:

Результат можно прокручивать; его курсор может перемещаться как вперед, так и назад относительно текущей позиции, а также может перемещаться в абсолютную позицию. Набор результатов нечувствителен к изменениям, внесенным в базовый источник данных, когда он открыт. Он содержит строки, которые удовлетворяют запросу либо во время выполнения запроса, либо во время извлечения строк.

TYPE_SCROLL_SENSITIVE:

Результат можно прокручивать; его курсор может перемещаться как вперед, так и назад относительно текущей позиции, а также может перемещаться в абсолютную позицию. Набор результатов отражает изменения, внесенные в базовый источник данных, в то время как набор результатов остается открытым.

Дополнительные сведения см. в разделе Обновление набора результатов.

person Hars    schedule 18.02.2014

У вашей таблицы есть PRIMARY KEY?

Указание того, что результирующий набор может быть обновляемым, не гарантирует, что полученный вами результирующий набор действительно будет обновляемым. Драйверы, не поддерживающие обновляемые наборы результатов, будут возвращать наборы, доступные только для чтения. Кроме того, чтобы получить обновляемый результирующий набор, запрос обычно должен указывать первичный ключ как один из выбранных столбцов, и он должен выбирать столбцы только из одной таблицы.

person Developer Marius Žilėnas    schedule 02.06.2015
comment
спасибо за комментарий, Мариус, но я давно не писал этот код и, возможно, уже не помню. в основном я не прикасался к JDBC после завершения этого упражнения! Сейчас я работаю над проектом, в котором мы используем исключительно спящий режим. - person YoNuevo; 03.06.2015
comment
Нп. Супер, что вы сейчас работаете над проектом! Я читаю книгу Библия программирования баз данных Java на JDBC. Он имеет примеры и прост. :) - person Developer Marius Žilėnas; 03.06.2015