Почему соединение Java MySQL не может обнаружить изменения, сделанные триггером? - PullRequest
1 голос
/ 01 марта 2012

У меня есть проблема, и мне нужно кое-что прояснить.

Я использую триггер для обнаружения изменений, внесенных в мою базу данных, это означает, что я установил всю свою таблицу с триггером для вставки, обновления и удаления (MySQL)

Затем я записываю это изменение в специально созданную мной таблицу, чтобы она содержала всю информацию об изменениях.Давайте назовем это xtable.(Эта таблица не оснащена триггером)

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

Что ж, проблема в том, что когда я читаю xtable вцикл, я могу только прочитать начальное значение xtable, когда я установил соединение с базой данных.(соединение установлено вне цикла)

Если в базу данных было внесено изменение, которое приведет к появлению новой строки в xtable, эта новая строка, созданная триггером, не будет обнаружена, независимо от того, сколько раз япрочитайте его, выполнив запрос "select * from xtable" ..

Код выглядит следующим образом:

public static void main(String[] args) {
    Connection conn = null;

    try {
        conn = database.getConnection();
        Statement state = conn.createStatement();
        String query = "select * from `xtable`;";

        while (true) {
            ResultSet rs = state.executeQuery(query);

            while(rs.next){
                // Some code for letting the other application know of the change
            }
        }
    } catch (SQLException ex) {
    } finally {
        if (conn != null) {
            conn.close();
        }
    }
}

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

На самом деле эту проблему можно решить, установив соединение внутри цикла, но тогда это приведет к другой проблеме, поскольку она будет потреблять все больше и больше ресурсов, так какпетля обойти.(Я уже попробовал это, и он в конечном итоге будет использовать все ресурсы на моем компьютере после того, как иногда, даже когда я уже правильно его закрыл)

Так может кто-нибудь дать мне несколько советов, что делать?

Я впервые пишу здесь вопрос, извините, если есть какое-то правило, которому я не следую, и, пожалуйста, дайте мне правильное направление.

Ответы [ 3 ]

1 голос
/ 01 марта 2012

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

PS: организация очереди сообщений - лучшая альтернатива

0 голосов
/ 12 ноября 2016
  Connection connection=getConnection();
  statement="query";
  try {
            stmt = connection.prepareStatement(statement);
              ResultSet rs = stmt.executeQuery();
            while (rs.next()) {

        }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (connection != null && stmt != null) {
                stmt.close();
            }
        }
0 голосов
/ 30 апреля 2013

Я думаю, вам лучше рассмотреть триггер, а не выполнять запросы к СУБД с помощью цикла.

Если вы используете триггер, вам не нужно использовать этот цикл while со стороны Java, чтобы проверить изменениеDB.
Вместо этого, механизм триггера, который встроен в СУБД, уведомит сторону Java, когда произойдет изменение.

Для Oracle вы можете вызвать метод Java из PL / SQL.
Для PostgreSQL:Вы можете вызвать метод Java из PL / Java.
Для CUBRID вы можете вызвать метод Java из хранимой процедуры Java.

Для MySQL вы можете вызвать метод Java, но я не думаю, что это так простокак указано выше.
Я хотел бы, чтобы эта ссылка помогла вам.http://code.rocksol.it/call-java-from-mysql-trigger
Или Google это ключевое слово, "mysql пользовательские функции Java"

...