выполнение запросов с возвращаемыми значениями в потоках

#java #sql #multithreading #bukkit

#java #sql #многопоточность #bukkit

Вопрос:

 public String getCurrentGuild(final String playername) {

        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    conn = DriverManager.getConnection(DB_URL, USER, PASS);
                    DatabaseMetaData dbm = conn.getMetaData();
                    stmt = conn.createStatement();

                    ResultSet set = stmt.executeQuery("SELECT CurrentGuild FROM Players WHERE Username='"   playername   "';");
                    if (set.next()) {
                        guildss = set.getString("CurrentGuild");
                    }
                } catch (SQLException se) {
                    //Handle errors for JDBC
                    se.printStackTrace();
                } catch (Exception e) {
                    //Handle errors for Class.forName
                    e.printStackTrace();
                } finally {
                    //finally block used to close resources
                    try {
                        if (stmt != null) {
                            conn.close();
                        }
                    } catch (SQLException se) {
                    }// do nothing
                    try {
                        if (conn != null) {
                            conn.close();
                        }
                    } catch (SQLException se) {
                        se.printStackTrace();
                    }//end finally try
                }//en

            }
        });
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return guildss;
    }
 

Возвращаемое значение возвращает null в этой строке:

 if(!gs.getCurrentGuild(p.getName()).equalsIgnoreCase("-"))
 

Могу ли я в любом случае получить результат быстрее?

Комментарии:

1. где вы определяете гильдии? если к нему обращаются в runnable, он должен быть окончательным и не может быть изменен, компилируется ли ваш код?

2. В чем преимущество использования a Thread таким образом? Если у вас «есть» Object блокировка монитора или ReentrantLock может быть лучшим выбором join (поскольку поток, возможно, еще не запустился к моменту вашего вызова)

3. Нет никакого отношения к !gs.getCurrentGuild к предоставленному коду..

Ответ №1:

попробуйте Like вместо = в вашем запросе

что-то вроде этого —

 ResultSet set = stmt.executeQuery("SELECT CurrentGuild FROM Players WHERE Username like '"   playername   "';");