CalypsoToolz 451 Опубликовано 20 июля, 2013 Всем привет, решил прикрутить систему выдачи бонусов за голос на л2топе к сборке L2J, взял менеджера здесь. Всё вроде-бы сделал правильно, но после загрузки сервера и последующего обновления списка проголосовавших сыпаются ошибки: java.sql.SQLException: You can't operate on a closed Connection!!! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65) at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyC onnection.java:222) at com.l2jserver.gameserver.instancemanager.vote.L2TopManager.checkAndSav eFromDb(L2TopManager.java:201) at com.l2jserver.gameserver.instancemanager.vote.L2TopManager.parse(L2Top Manager.java:143) at com.l2jserver.gameserver.instancemanager.vote.L2TopManager.access$600( L2TopManager.java:25) at com.l2jserver.gameserver.instancemanager.vote.L2TopManager$ConnectAndU pdate.run(L2TopManager.java:308) at com.l2jserver.gameserver.ThreadPoolManager$RunnableWrapper.run(ThreadP oolManager.java:86) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471 ) at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java: 351) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.a ccess$301(ScheduledThreadPoolExecutor.java:178) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.r un(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.j ava:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor. java:615) at java.lang.Thread.run(Thread.java:722) Caused by: java.lang.NullPointerException В чем может быть проблема? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
inFA 19 Опубликовано 20 июля, 2013 (изменено) checkAndSaveFromDb не может сохранить в бд или неверно парсит с топа Изменено 20 июля, 2013 пользователем inFA 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CalypsoToolz 451 Опубликовано 20 июля, 2013 (изменено) checkAndSaveFromDb не может сохранить в бд или неверно парсит с топа Файлы со списком голосов появляются. Я так понял что коннект к бд закрывается и не открывается. Вот на всякий случай код l2topmanager, может кто-нибудь что-нибудь подскажет: package com.l2jserver.gameserver.instancemanager.vote; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Calendar; import java.util.Collection; import java.util.NoSuchElementException; import java.util.StringTokenizer; import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; public class L2TopManager { private static Logger _log = Logger.getLogger(L2TopManager.class.getName()); private static final String voteWeb = Config.DATAPACK_ROOT + "/data/vote-web.txt"; private static final String voteSms = Config.DATAPACK_ROOT + "/data/vote-sms.txt"; private static L2TopManager _instance; public static L2TopManager getInstance() { if (_instance == null) { _instance = new L2TopManager(); } return _instance; } public L2TopManager() { if (Config.L2TOP_SERVICE_ENABLED) { ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ConnectAndUpdate(), Config.L2TOP_INTERVAL, Config.L2TOP_INTERVAL); ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Clean(), Config.L2TOP_INTERVAL, Config.L2TOP_INTERVAL); ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new GiveReward(), Config.L2TOP_INTERVAL, Config.L2TOP_INTERVAL); _log.info("L2TopManager: Started."); } else { _log.info("L2TopManager: Disabled."); } } private void update() { String out_sms = getPage(Config.L2TOP_SMS_ADRESS); String out_web = getPage(Config.L2TOP_WEB_ADRESS); File sms = new File(voteSms); File web = new File(voteWeb); FileWriter save = null; try { save = new FileWriter(sms); save.write(out_sms); save = new FileWriter(web); save.write(out_web); } catch (IOException e) { e.printStackTrace(); } finally { try { if (save != null) save.close(); } catch (Exception e1) { e1.printStackTrace(); } } } private static String getPage(String address) { StringBuffer buf = new StringBuffer(); try { Socket s = new Socket("l2top.ru", 80); s.setSoTimeout(30000); String request = "GET " + address + " HTTP/1.1\r\n" + "User-Agent: http:\\" + Config.L2_TOP_SERVER_ADRES + " server\r\n" + "Host: http:\\" + Config.L2_TOP_SERVER_ADRES + " \r\n" + "Accept: */*\r\n" + "Connection: close\r\n" + "\r\n"; s.getOutputStream().write(request.getBytes()); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(), "Cp1251")); for (String line = in.readLine(); line != null; line = in.readLine()) { buf.append(line); buf.append("\r\n"); } s.close(); } catch (Exception e) { buf.append("Connection error"); } return buf.toString(); } private void parse(boolean sms) { try { BufferedReader in = new BufferedReader(new FileReader(sms ? voteSms : voteWeb)); String line = in.readLine(); while (line != null) { Calendar cal = Calendar.getInstance(); int year = cal.get(1); if (line.startsWith("" + year)) { try { StringTokenizer st = new StringTokenizer(line, "\t -:"); cal.set(1, Integer.parseInt(st.nextToken())); cal.set(2, Integer.parseInt(st.nextToken())); cal.set(5, Integer.parseInt(st.nextToken())); cal.set(11, Integer.parseInt(st.nextToken())); cal.set(12, Integer.parseInt(st.nextToken())); cal.set(13, Integer.parseInt(st.nextToken())); cal.set(14, 0); String nick = st.nextToken(); int mult = 1; if (sms) mult = Integer.parseInt(new StringBuffer(st.nextToken()).delete(0, 1).toString()); if (cal.getTimeInMillis() + Config.L2TOP_CLEAN_DAY * 86400000 > System.currentTimeMillis()) checkAndSaveFromDb(cal.getTimeInMillis(), nick, mult); } catch (NoSuchElementException nsee) { } } else line = in.readLine(); } } catch (Exception e) { e.printStackTrace(); } } private synchronized void clean() { Calendar cal = Calendar.getInstance(); cal.add(6, -Config.L2TOP_CLEAN_DAY); Connection con = null; PreparedStatement statement = null; try { con = L2DatabaseFactory.getInstance().getConnection(); statement = con.prepareStatement("DELETE FROM character_vote WHERE date<?"); statement.setLong(1, cal.getTimeInMillis()); statement.execute(); } catch (SQLException e) { e.printStackTrace(); } finally { L2DatabaseFactory.close(con); } } private synchronized void checkAndSaveFromDb(long date, String nick, int mult) { Connection con = null; PreparedStatement statement = null; ResultSet rset = null; try { con = L2DatabaseFactory.getInstance().getConnection(); statement = con.prepareStatement("SELECT charId FROM characters WHERE char_name=?"); statement.setString(1, nick); rset = statement.executeQuery(); int objId = 0; if (rset.next()) { objId = rset.getInt("charId"); } if (objId > 0) { L2DatabaseFactory.close(con); statement = con.prepareStatement("SELECT * FROM character_vote WHERE id=? AND date=? AND multipler=?"); statement.setInt(1, objId); statement.setLong(2, date); statement.setInt(3, mult); rset = statement.executeQuery(); if (!rset.next()) { L2DatabaseFactory.close(con); statement = con.prepareStatement("INSERT INTO character_vote (date, id, nick, multipler) values (?,?,?,?)"); statement.setLong(1, date); statement.setInt(2, objId); statement.setString(3, nick); statement.setInt(4, mult); statement.execute(); } } } catch (SQLException e) { e.printStackTrace(); } finally { L2DatabaseFactory.close(con); } } private synchronized void giveReward() { Connection con = null; PreparedStatement statement = null; ResultSet rset = null; try { con = L2DatabaseFactory.getInstance().getConnection(); final Collection<L2PcInstance> players = L2World.getInstance().getAllPlayers().values(); for (L2PcInstance player : players) { int objId = player.getObjectId(); int mult = 0; statement = con.prepareStatement("SELECT multipler FROM character_vote WHERE id=? AND has_reward=0"); statement.setInt(1, objId); rset = statement.executeQuery(); while (rset.next()) { mult += rset.getInt("multipler"); } L2DatabaseFactory.close(con); statement = con.prepareStatement("UPDATE character_vote SET has_reward=1 WHERE id=?"); statement.setInt(1, objId); statement.executeUpdate(); if (mult > 0) { player.sendMessage("Администрация сервера " + Config.L2_TOP_SERVER_NAME + " благодарит Вас за голосование, не забывайте голосовать завтра!"); player.getInventory().addItem("L2Top Reward", Config.L2_TOP_REWARD_ID, Config.L2_TOP_REWARD_COUNT * mult, player, null); } L2DatabaseFactory.close(con); } } catch (SQLException e) { e.printStackTrace(); } finally { L2DatabaseFactory.close(con); } } private class GiveReward implements Runnable { private GiveReward() { } public void run() { L2TopManager.this.giveReward(); } } private class Clean implements Runnable { private Clean() { } public void run() { L2TopManager.this.clean(); } } private class ConnectAndUpdate implements Runnable { private ConnectAndUpdate() { } public void run() { L2TopManager.this.update(); L2TopManager.this.parse(true); L2TopManager.this.parse(false); } } } Изменено 20 июля, 2013 пользователем BymerOK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Russian 49 Опубликовано 20 июля, 2013 Переписывать надо. Т.к о2топ что-то сделал ято зыкрывается коннект, мой знакомый чинил у себя на хф5. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CalypsoToolz 451 Опубликовано 20 июля, 2013 (изменено) Переписывать надо. Т.к о2топ что-то сделал ято зыкрывается коннект, мой знакомый чинил у себя на хф5. Исчерпывающий таки ответ) Было бы все так просто - я бы не задал вопрос на форуме. Изменено 20 июля, 2013 пользователем BymerOK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CalypsoToolz 451 Опубликовано 22 июля, 2013 Или же может кто-нибуть поделится L2Topmanager'ом для L2J сборки? С меня жирный + )) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты