ВОвебовец

Группа: 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); } } |
на строчке
Что я делаю не так?
|
--------------------
Дональд Кнут (известный тем, что его книги никто не читает) пишет, что хотя первый двоичный поиск был опубликован в 1946 году, первый двоичный поиск без багов был опубликован в 1962 © Хабрахабр
|
|