死锁预防(Java+;MySQL)

死锁预防(Java+;MySQL),java,mysql,jdbc,deadlock,Java,Mysql,Jdbc,Deadlock,我有一个sql类,它连接到数据库并从我的游戏服务器更新信息。我想知道这里是否有任何东西会导致死锁,有什么好方法可以防止死锁。我对很多事情都不熟悉,所以任何提示都很好:) 您需要担心Java端的同步,因为Java.sql实现不是线程安全的。您需要考虑数据库服务器上的隔离,用ACID平衡响应能力 我为您的Java类推荐一些其他东西: 使用连接池。销毁和创建连接非常昂贵。您的SQL类不应该处理这些琐事 使用PreparedStatement和绑定变量。以这种方式创建查询字符串是个坏主意 关闭final

我有一个sql类,它连接到数据库并从我的游戏服务器更新信息。我想知道这里是否有任何东西会导致死锁,有什么好方法可以防止死锁。我对很多事情都不熟悉,所以任何提示都很好:)


您需要担心Java端的同步,因为Java.sql实现不是线程安全的。您需要考虑数据库服务器上的隔离,用ACID平衡响应能力

我为您的Java类推荐一些其他东西:

  • 使用连接池。销毁和创建连接非常昂贵。您的SQL类不应该处理这些琐事
  • 使用PreparedStatement和绑定变量。以这种方式创建查询字符串是个坏主意
  • 关闭finally块中的资源

  • 所有这些静态字符串…我在手机上读到这些,但我看到的不好。您可能严重违反了第一范式。

    您需要担心Java端的同步,因为Java.sql实现不是线程安全的。您需要考虑数据库服务器上的隔离,用ACID平衡响应能力

    我为您的Java类推荐一些其他东西:

  • 使用连接池。销毁和创建连接非常昂贵。您的SQL类不应该处理这些琐事
  • 使用PreparedStatement和绑定变量。以这种方式创建查询字符串是个坏主意
  • 关闭finally块中的资源

  • 所有这些静态字符串…我在手机上读到这些,但我看到的不好。您可能严重违反了第一范式。

    死锁通常是由同步不良的代码引起的。最典型的情况是,线程A获取资源X上的锁,线程B获取资源Y上的锁,然后两个线程等待,同时它们各自尝试获取尚未锁定的资源

    因为您的代码根本没有同步,所以应该可以

    为了避免死锁问题,请尝试在同步块内尽可能少地执行工作。在同步块内调用类外部的代码时要非常小心,因为此外部代码可能试图获得锁并产生死锁。请记住,执行数据库查询是对外部代码的调用,db查询锁定数据库内的资源并不罕见


    您是真的看到了死锁,还是只是很谨慎?

    死锁通常是由同步不良的代码引起的。最典型的情况是,线程A获取资源X上的锁,线程B获取资源Y上的锁,然后两个线程等待,同时它们各自尝试获取尚未锁定的资源

    因为您的代码根本没有同步,所以应该可以

    为了避免死锁问题,请尝试在同步块内尽可能少地执行工作。在同步块内调用类外部的代码时要非常小心,因为此外部代码可能试图获得锁并产生死锁。请记住,执行数据库查询是对外部代码的调用,db查询锁定数据库内的资源并不罕见


    你是真的看到了僵局,还是只是很谨慎?

    为什么是静态的?有什么好的理由吗?如果你不需要记住状态,你真的应该使用静态的东西。为什么它是静态的?有什么好的理由吗?如果你不需要记住状态的话,你真的应该使用静态的东西。很多在服务器上使用mysql将信息保存到数据库的人都有死锁,我想知道是不是mysql造成了死锁。比如,假设他们在用户登录时建立mysql连接,如果两个用户同时登录,这会带来任何问题吗?我对数据库死锁的原因了解不够,无法智能地回答。希望其他人能加入进来帮助你。祝你好运。很多在服务器上使用mysql将信息保存到数据库的人都出现了死锁,我想知道是不是mysql造成的。比如,假设他们在用户登录时建立mysql连接,如果两个用户同时登录,这会带来任何问题吗?我对数据库死锁的原因了解不够,无法智能地回答。希望其他人能加入进来帮助你。祝你好运
    package server.util;
    
    import java.sql.*;
    import java.security.MessageDigest;
    
    import server.model.players.Client;
    
    public class SQL {
    
    public static Connection con = null;
    public static Statement stmt;
    public static boolean connectionMade;
    public static void createConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://URL/DATABASE", "USERNAME", "PASS");
            stmt = con.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static ResultSet query(String s) throws SQLException {
        try {
            if (s.toLowerCase().startsWith("select")) {
                ResultSet rs = stmt.executeQuery(s);
                return rs;
            } else {
                stmt.executeUpdate(s);
            }
            return null;
        } catch (Exception e) {
            destroyConnection();
            createConnection();
            e.printStackTrace();
        }
        return null;
    }
    
    public static void destroyConnection() {
        try {
            stmt.close();
            con.close();
            connectionMade = false;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static boolean saveHighScore(Client clientToSave) {
        try {
            query("DELETE FROM `skills` WHERE playerName = '"+clientToSave.playerName+"';");
            query("DELETE FROM `skillsoverall` WHERE playerName = '"+clientToSave.playerName+"';");
            //query("DELETE FROM `scores` WHERE playerName = '"+clientToSave.playerName+"';");
            query("INSERT INTO `skills` (`playerName`,`Attacklvl`,`Attackxp`,`Defencelvl`,`Defencexp`,`Strengthlvl`,`Strengthxp`,`Hitpointslvl`,`Hitpointsxp`,`Rangelvl`,`Rangexp`,`Prayerlvl`,`Prayerxp`,`Magiclvl`,`Magicxp`,`Cookinglvl`,`Cookingxp`,`Woodcuttinglvl`,`Woodcuttingxp`,`Fletchinglvl`,`Fletchingxp`,`Fishinglvl`,`Fishingxp`,`Firemakinglvl`,`Firemakingxp`,`Craftinglvl`,`Craftingxp`,`Smithinglvl`,`Smithingxp`,`Mininglvl`,`Miningxp`,`Herblorelvl`,`Herblorexp`,`Agilitylvl`,`Agilityxp`,`Thievinglvl`,`Thievingxp`,`Slayerlvl`,`Slayerxp`,`Farminglvl`,`Farmingxp`,`Runecraftlvl`,`Runecraftxp`,`Hunterlvl`,`Hunterxp`,`Summonlvl`,`Summonxp`) VALUES ('"+clientToSave.playerName+"',"+clientToSave.playerLevel[0]+","+clientToSave.playerXP[0]+","+clientToSave.playerLevel[1]+","+clientToSave.playerXP[1]+","+clientToSave.playerLevel[2]+","+clientToSave.playerXP[2]+","+clientToSave.playerLevel[3]+","+clientToSave.playerXP[3]+","+clientToSave.playerLevel[4]+","+clientToSave.playerXP[4]+","+clientToSave.playerLevel[5]+","+clientToSave.playerXP[5]+","+clientToSave.playerLevel[6]+","+clientToSave.playerXP[6]+","+clientToSave.playerLevel[7]+","+clientToSave.playerXP[7]+","+clientToSave.playerLevel[8]+","+clientToSave.playerXP[8]+","+clientToSave.playerLevel[9]+","+clientToSave.playerXP[9]+","+clientToSave.playerLevel[10]+","+clientToSave.playerXP[10]+","+clientToSave.playerLevel[11]+","+clientToSave.playerXP[11]+","+clientToSave.playerLevel[12]+","+clientToSave.playerXP[12]+","+clientToSave.playerLevel[13]+","+clientToSave.playerXP[13]+","+clientToSave.playerLevel[14]+","+clientToSave.playerXP[14]+","+clientToSave.playerLevel[15]+","+clientToSave.playerXP[15]+","+clientToSave.playerLevel[16]+","+clientToSave.playerXP[16]+","+clientToSave.playerLevel[17]+","+clientToSave.playerXP[17]+","+clientToSave.playerLevel[18]+","+clientToSave.playerXP[18]+","+clientToSave.playerLevel[19]+","+clientToSave.playerXP[19]+","+clientToSave.playerLevel[20]+","+clientToSave.playerXP[20]+","+clientToSave.playerLevel[21]+","+clientToSave.playerXP[21]+","+clientToSave.playerLevel[22]+","+clientToSave.playerXP[22]+");");
            query("INSERT INTO `skillsoverall` (`playerName`,`lvl`,`xp`) VALUES ('"+clientToSave.playerName+"',"+(clientToSave.getLevelForXP(clientToSave.playerXP[0]) + clientToSave.getLevelForXP(clientToSave.playerXP[1]) + clientToSave.getLevelForXP(clientToSave.playerXP[2]) + clientToSave.getLevelForXP(clientToSave.playerXP[3]) + clientToSave.getLevelForXP(clientToSave.playerXP[4]) + clientToSave.getLevelForXP(clientToSave.playerXP[5]) + clientToSave.getLevelForXP(clientToSave.playerXP[6]) + clientToSave.getLevelForXP(clientToSave.playerXP[7]) + clientToSave.getLevelForXP(clientToSave.playerXP[8]) + clientToSave.getLevelForXP(clientToSave.playerXP[9]) + clientToSave.getLevelForXP(clientToSave.playerXP[10]) + clientToSave.getLevelForXP(clientToSave.playerXP[11]) + clientToSave.getLevelForXP(clientToSave.playerXP[12]) + clientToSave.getLevelForXP(clientToSave.playerXP[13]) + clientToSave.getLevelForXP(clientToSave.playerXP[14]) + clientToSave.getLevelForXP(clientToSave.playerXP[15]) + clientToSave.getLevelForXP(clientToSave.playerXP[16]) + clientToSave.getLevelForXP(clientToSave.playerXP[17]) + clientToSave.getLevelForXP(clientToSave.playerXP[18]) + clientToSave.getLevelForXP(clientToSave.playerXP[19]) + clientToSave.getLevelForXP(clientToSave.playerXP[20]) + clientToSave.getLevelForXP(clientToSave.playerXP[21]) + clientToSave.getLevelForXP(clientToSave.playerXP[22]))+","+((clientToSave.playerXP[0]) + (clientToSave.playerXP[1]) + (clientToSave.playerXP[2]) + (clientToSave.playerXP[3]) + (clientToSave.playerXP[4]) + (clientToSave.playerXP[5]) + (clientToSave.playerXP[6]) + (clientToSave.playerXP[7]) + (clientToSave.playerXP[8]) + (clientToSave.playerXP[9]) + (clientToSave.playerXP[10]) + (clientToSave.playerXP[11]) + (clientToSave.playerXP[12]) + (clientToSave.playerXP[13]) + (clientToSave.playerXP[14]) + (clientToSave.playerXP[15]) + (clientToSave.playerXP[16]) + (clientToSave.playerXP[17]) + (clientToSave.playerXP[18]) + (clientToSave.playerXP[19]) + (clientToSave.playerXP[20]) + (clientToSave.playerXP[21]) + (clientToSave.playerXP[22]))+");");
            //query("INSERT INTO `scores` (`playerName`,`killcount`,`pkpoints`,`pcpoints`) VALUES ('"+clientToSave.playerName+"',"+clientToSave.KC+","+clientToSave.pkPoints+","+clientToSave.pcPoints+");");
            } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    }