首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结果集自动关闭

结果集自动关闭
EN

Stack Overflow用户
提问于 2020-06-23 21:56:24
回答 2查看 55关注 0票数 0

我的音乐机器人出了点问题,不和谐。我想在曲目列表启动时发送嵌入消息,但ResultSet总是关闭。所以它不能传递if-query。

下面是我的代码(“TrackScheduler”类):

代码语言:javascript
复制
try {
                
                file = new URL("https://img.youtube.com/vi/" + videoID + "/hqdefault.jpg").openStream();
                builder.setImage("attachment://thumbnail.png");
                
                System.out.println("4");
                
                ResultSet set = LiteSQL.onQuery("SELECT * FROM musicchannel WHERE guildid = " + guildid);
                
                try {
                    System.out.println("3");
                    
                    if(set.next()) {
                        long channelid = set.getLong("channelid");
                                                
                        TextChannel channel;
                        
                        System.out.println("2");
                        
                        if((channel = guild.getTextChannelById(channelid)) != null) {
                            
                            System.out.println("1");
                            
                            channel.sendTyping().queue();
                            channel.sendFile(file, "thumbnail.png").embed(builder.build()).queue();
                        }                   
                    }

                }
                catch (SQLException e) {
                    e.printStackTrace();
                }
                
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

我的LiteSQL.onQuery (“LiteSQL”类):

代码语言:javascript
复制
private static Connection c;
    
    private static Statement s;

public static ResultSet onQuery(String sql) {
        
        try {
            
            return s.executeQuery(sql);
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
        
        return null;
    }

下面是错误:

代码语言:javascript
复制
ava.sql.SQLException: ResultSet closed
        at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:76)
        at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:39)
        at org.sqlite.jdbc3.JDBC3ResultSet.getLong(JDBC3ResultSet.java:423)
        at de.nameddaniel.bot.musik.TrackScheduler.onTrackStart(TrackScheduler.java:79)
        at com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter.onEvent(AudioEventAdapter.java:72)
        at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer.dispatchEvent(DefaultAudioPlayer.java:368)
        at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer.startTrack(DefaultAudioPlayer.java:117)
        at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer.playTrack(DefaultAudioPlayer.java:80)
        at de.nameddaniel.bot.musik.AudioLoadResult.trackLoaded(AudioLoadResult.java:20)
        at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.checkSourcesForItemOnce(DefaultAudioPlayerManager.java:443)
        at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.checkSourcesForItem(DefaultAudioPlayerManager.java:419)
        at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$createItemLoader$0(DefaultAudioPlayerManager.java:218)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

我是新来的,如果有任何遗漏的信息,请告诉我。同样,我对糟糕的格式表示抱歉。

大牛,问候:)

EN

回答 2

Stack Overflow用户

发布于 2020-06-23 22:09:11

tl;dr

不要在StatementConnection字段中使用static

详细信息

  1. 此代码有一个安全漏洞。查找SQL注入。基本的要点是:语句几乎是完全无用的。您希望使用PreparedStatement,并且希望您的SQL查询仅使用字符串文字。永远不要通过连接中的用户输入来“生成查询字符串”。查询字符串应该是SELECT * FROM musicchannel WHERE guildid = ? (是,字符串中有一个文字问号),然后使用PreparedStatementsetInt方法设置公会id。或者更好的是,由于JDBC API实际上不是为像这样的使用而设计的,所以可以使用类似于JDBI.

的东西

  1. 这是一个糟糕的异常处理。如果你不知道该怎么做,正确的“我不知道”catch代码块是throw new RuntimeException("Uncaught", e);而不是e.printStackTrace();。更好的是,让这些方法只抛出SQLException;显然做DB事情的方法应该抛出它。请注意,您的main方法可以(也应该)声明为抛出Exception。

  1. Connection、PreparedStatement和ResultSets都是资源,需要通过try-with-resources打开。不这样做意味着你的应用程序有一个漏洞,如果它运行足够长的时间,就会破坏一些东西。对于DB代码,DB最终将耗尽连接,并且在您关闭java应用程序之前将变得完全不可访问。这就是您需要try-with-resources.

的原因

  1. 您只有一个语句和连接(字段是静态的)。大概你的“不和谐”机器人可以接收多条消息,所以如果你尝试发送多条消息,系统就会崩溃。不要在这里使用'static‘。您粘贴的代码本身并不包含任何会关闭ResultSet的内容,但是通过重新设计而不是静态的,这个问题很可能会自动消失。
票数 5
EN

Stack Overflow用户

发布于 2020-06-23 22:13:55

(除了另一个答案,实际上都是非常好的建议,你应该遵循)我认为以下是问题所在:

代码语言:javascript
复制
            return s.executeQuery(sql);

如果它是静态的,并且被其他对象多次使用,我认为这不会起作用。它最终会被清理干净的。您应该只返回一个包含所需数据的对象,而不是在那里这样做。查看DAO类模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62536450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档