来自另一个线程的JDBC连接阻止对查询执行的访问

时间:2018-12-02 12:13:26

标签: java mysql multithreading jdbc

我有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获取信息而不能这样做

0 个答案:

没有答案