#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 "';");