Координатор: Savage
 
Ответить · Новая тема · Новый опрос

 :: Товарищи джаверы, помогите, SQL-запрос во время разбора другого
Majesty
Дата Пятница, 06 Ноября 2009, 8:35  | 


ВОвебовец
Group Icon
Группа: Super Moderator
Сообщений: 8775



Статус: Offline

Не особо часто приходится писать на Java и уже тем более редко приходится работать с MySQL'ем (и вообще SQL'ем в принципе) из Java. Видимо, поэтому я и столкнулся с этой проблемой :)

Дано: счётчик посещений, регистрирующий в базе данных (в таблице очереди) факт загрузки счётчика (время, ip, урл, реферер, размер экрана, юзер-агент и всякое подобное). Кроме счётчика есть обработчик очереди, который эту очередь разбирает. Написан на похапе и запускается кроном раз в 10 минут.

Задача: переписать обработчик на Java и сделать так, чтобы он запускался один раз и постоянно мониторил таблицу очереди.

В общем-то всё было хорошо на двух тестовых записях в таблице. Когда я для теста залил 40 стало плохо - вылетает исключение: "java.sql.SQLException: Operation not allowed after ResultSet closed"... Перевести текст исключения я могу, а вот понять причину его возникновения - нет. Вылетает оно на этом методе:
CODE
   private static void _dispatch_goals(CounterQueueItem item) throws Exception {
       Hashtable<String, Integer> goals = new Hashtable<String, Integer>();
       Statement stmt = con.createStatement();
       String sql;

       ResultSet gs = stmt.executeQuery("SELECT COUNT( * ) AS amount, goals.id, goals.site_id FROM visits_q LEFT JOIN goals ON (goals.site_id = visits_q.site_id) WHERE visits_q.url REGEXP goals.rexp GROUP BY goals.id");
       while(gs.next()) {
           String goal_amount = gs.getString(1);
           String goal_id = gs.getString(2);
           String goal_site_id = gs.getString(3);

           if(goals.get(goal_id) == null) {
               ResultSet ts = stmt.executeQuery("SELECT id FROM goals_log WHERE goal_id="+goal_id+" AND stat_date=FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d')");
               try {
                   ts.next();
                   goals.put(goal_id, 1);
               } catch(Exception e) {
                   goals.put(goal_id, 0);
               }
           }

           if(goals.get(goal_id) == 1) {
               sql = "UPDATE goals_log SET amount=amount+"+goal_amount+" WHERE goal_id="+goal_id+" AND stat_date=FROM_UNIXTIME('"+item.tstamp+"', '%Y-%m-%d')";
           } else {
               sql = "INSERT INTO goals_log (amount, goal_id, stat_date) VALUES ('"+goal_amount+"', '"+goal_id+"', FROM_UNIXTIME('"+item.tstamp+"', '%Y-%m-%d'))";
               goals.remove(goal_id); goals.put(goal_id, 1);
           }
           stmt.executeUpdate(sql);
       }
   }
на строчке
CODE
while(gs.next()) {


Что я делаю не так?


--------------------
Дональд Кнут (известный тем, что его книги никто не читает) пишет, что хотя первый двоичный поиск был опубликован в 1946 году, первый двоичный поиск без багов был опубликован в 1962 © Хабрахабр
^
Endeveit
Дата Пятница, 06 Ноября 2009, 10:45  | 


Бывалый
Group Icon
Группа: Admin
Сообщений: 7367



Статус: Online

Меняй
CODE
ResultSet ts = stmt.executeQuery("SELECT id FROM goals_log WHERE goal_id="+goal_id+" AND stat_date=FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%
try {
   ts.next();
   goals.put(goal_id, 1);
} catch (Exception e) {
   goals.put(goal_id, 0);
}
на
CODE
Statement stmt0 = con.createStatement();
ResultSet ts = stmt0.executeQuery("SELECT id FROM goals_log WHERE goal_id="+goal_id+" AND stat_date=FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d')");
try {
   ts.next();
   goals.put(goal_id, 1);
} catch (Exception e) {
   goals.put(goal_id, 0);
}
stmt0.close()

CODE
stmt.executeUpdate(sql);
на
CODE
Statement stmt1 = con.createStatement();
stmt1.executeUpdate(sql);


--------------------
[ Общие правила форума ] | [ Правила пхп-форума ]
PHP 4 end of life - PHP4 мертв. Используйте 5 версию.
^
Majesty
Дата Пятница, 06 Ноября 2009, 11:08  | 


ВОвебовец
Group Icon
Группа: Super Moderator
Сообщений: 8775



Статус: Offline

Спасибо :)


--------------------
Дональд Кнут (известный тем, что его книги никто не читает) пишет, что хотя первый двоичный поиск был опубликован в 1946 году, первый двоичный поиск без багов был опубликован в 1962 © Хабрахабр
^
 Быстрый Ответ
Введите ваше имя
Расширенный режим
Нормальный режим
Открытых тэгов:     Закрыть все тэги
Смайлики
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie         
Показать всё

Помощь по кодам форума ] [ Проверить длину сообщения ] [ Транслит из Латиницы в Кириллицу ]
 Включить подпись?
 Включить смайлики?
 Включить уведомление на e-mail при ответах?
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы программирования | Следующая тема »

Опции темы Ответить · Новая тема · Новый опрос

 



Rating@Mail.ru LiveInternet