我有2个线程的游戏服务器,一个主线程和一秒钟。数据库是mysql
用于计算游戏情况并将玩家连接到服务器的主线程响应,这使得与mysql的交易非常小。
第二个线程通过调用mysql过程来计算统计信息。计算需要10秒钟。
每个线程使用其自己的连接。但是,当我在第二个线程中开始统计信息计算时,主线程连接会一直等到计算结束。 因此,这意味着即使我有2个连接和2个线程,一个连接也会等待另一个连接完成。
但是当我从Web界面开始相同的过程时-没有块同时出现。
我在做什么错了?
已解决
Statement stmt = null;
try {
stmt = con.createStatement();
stmt.executeUpdate("call updateScores();");
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
} finally {
if (stmt != null) try { stmt.close(); } catch(Exception e) { }
}
我尽量减少了execute方法,所有锁都消失了!上面是统计计算器的新代码,下面是旧的
public MySQLConnector(GameServer serv, String url, String user, String password) {
/* */
try {
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public int update(SQLRequest r) {
//System.out.println("Executing query " + r.getRequest());
int id = -1;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
if (r.getParams() == null) {
stmt = con.createStatement();
stmt.executeUpdate(r.getRequest(), RETURN_GENERATED_KEYS);
rs = stmt.getGeneratedKeys();
} else {
pstmt = con.prepareStatement(r.getRequest(), Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i < r.getParams().size(); i++) pstmt.setString(i + 1, r.getParams().get(i));
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
}
if (rs.next())
id = rs.getInt(1);
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
} finally {
if (stmt != null) try { stmt.close(); } catch(Exception e) { /*can't do anything */ }
if (pstmt != null) try { pstmt.close(); } catch(Exception e) { /*can't do anything */ }
if (rs != null) try { rs.close(); } catch(Exception e) { /*can't do anything */ }
}
return id;
}
在统计信息线程中:
class ScoreCalculator extends Thread {
SQLConnector db;
public ScoreCalculator(SQLConnector db) {
this.db = db;
}
@Override
public void run() {
Slog.l("Scores calculation started");
SQLRequest request = new SQLRequest("updateScores()");
db.update(request);
Slog.l("Scores calculation finished");
}
}
在“计算开始”和“计算结束”之间,例如新玩家的连接被卡住了,因为它试图从mysql获取信息而不能这样做