Почему этот MySQL не работает правильно?

Я пытаюсь обновить таблицы, когда на сервере Minecraft Spigot (Bukkit) происходит событие. По какой-то причине я просто не могу понять, почему это не сработает. Несмотря ни на что, поля просто не изменятся вообще.

Вот код, выполняющий работу:

public void processKill(final String killerName, final int killerKS, final String victimName) {
        try {
            Thread thread = new Thread() {
                @Override
                public void run() {
                    try (Connection c = du.makeNewConnection()) {
                       if (du.testWorkingConnection(c)) {
                           int best_killstreak = 0;
                           /* Process killstreak */
                           PreparedStatement killerKSSQL = c.prepareCall("SELECT best_killstreak FROM `player_data` WHERE name=?");
                           killerKSSQL.setString(1, killerName);
                           ResultSet killerKSRS = killerKSSQL.executeQuery();
                           best_killstreak = (killerKSRS.next()) ? killerKSRS.getInt(1) : 0;
                           /* Killer stuff */
                           PreparedStatement killerSQL = c.prepareStatement("UPDATE `player_data` SET kills=kills+1,deaths=deaths,points=points+?,best_killstreak=? WHERE name=?;");
                           killerSQL.setInt(1, config.getInt("points-per-kill"));
                           killerSQL.setInt(2, (best_killstreak < killerKS) ? killerKS : best_killstreak);
                           killerSQL.setString(3, killerName);
                           killerSQL.execute();
                           /* Victim stuff */
                           PreparedStatement victimSQL = c.prepareStatement("UPDATE `player_data` SET kills=kills,deaths=deaths+1,points=points-?,best_killstreak=best_killstreak WHERE name=?;");
                           victimSQL.setInt(1, config.getInt("minus-points-per-death"));
                           victimSQL.setString(2, victimName);
                           victimSQL.execute();
                       }
                    } catch (SQLException e) {
                        e.printStackTrace(System.err);
                        return;
                    }
                }
            };
            thread.start();
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace(System.err);
        }
    }

Очевидно, я делаю что-то ужасно неправильное, но я просто не знаю, что. Обычно я могу понять, как делать подобные вещи в веб-разработке, но это заставляет меня рвать на себе волосы.

Если вам нужна дополнительная информация, я буду рад помочь, просто спросите. На данный момент кто-нибудь может увидеть какие-либо серьезные ошибки относительно того, почему это не сработает?

Спасибо.


person Community    schedule 21.03.2014    source источник
comment
Вы уверены, что ваш запрос вообще выполняется? Например, du.testWorkingConnection(c) возвращает true?   -  person Adrian Pang    schedule 21.03.2014
comment
как насчет автокоммита?   -  person Tony Zhu    schedule 21.03.2014
comment
@AdrianPang Да, это возвращает нормально, потому что первоначальный запрос на создание строки также использует это (другой метод), и он проходит нормально. ТониЖу Извините, что?   -  person    schedule 21.03.2014


Ответы (1)


Используйте executeUpdate вместо execute для выполнения запросов на обновление. Хотя в документации API выполнения указано, что оно должно работать для обновлений, в большинстве случаев это не так.

Вот что вам нужно изменить

из

killerSQL.execute();

to

killerSQL.executeUpdate();

аналогично другой.

Также совершите добавление, закройте свой набор результатов, заявления и соединение.

person Juned Ahsan    schedule 21.03.2014
comment
Спасибо за ответ. Я поменял их, но у меня нет изменений в базе данных. - person ; 21.03.2014
comment
@jdersen Также зафиксируйте добавление закрытия вашего набора результатов, утверждений и соединения. - person Juned Ahsan; 21.03.2014
comment
Хорошо. Я воспользовался вашими предложениями. Я добавил ручную фиксацию и обнаружил ошибку, которая отменяла вызов запроса. Благодарю вас! Я даже не уверен, были ли необходимы другие вещи, но это звучит как хорошая практика, поэтому я буду продолжать их использовать. +1d и принято. Благодарю вас! - person ; 21.03.2014
comment
@jdersen рад, что это помогло :-) - person Juned Ahsan; 21.03.2014