2015-10-03 2 views
1
exception

est ici la chose:Java - un verrou ne pouvait pas être obtenue dans le délai demandé après

  • J'ai un DB qui sert de scoreborad; J'ai un bouton qui met à jour la base de données avec les nouveaux scores; J'ai une «exception de développeur» qui lance une exception SQLException chaque fois que le score est faible et ne peut remplacer aucun score dans le tableau de bord (DB);

Le problème:

  • je reçois un faible score et l'exception se produisent, puis-je obtenir un score élevé et au lieu de mettre à jour la base de données que je reçois l'erreur.

Voici l'erreur:

  • "un verrou ne pouvait être obtenue dans le délai demandé"

Voici le code dans le bouton:

try 
    { 
     Connection conec=DriverManager.getConnection(hostname,username,password); //<-- Conecçao com a base de dados 
     Statement stm=conec.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); //<-- Conecção com as tabelas 
     //------------Aquisição dos dados------------------// 
     SQL="SELECT * FROM DEMOLION.MINER"; 
     res=stm.executeQuery(SQL); 
     //-------------------------------------------------// 
     res.first(); 
     nome=JOptionPane.showInputDialog("Introduza o mone que deseja registar:","Jogador1"); 
     Desktop.getDesktop().open(new File("Jogos RPG Maker/Miner mapa/Game.exe")); 
     pontuacao=JOptionPane.showInputDialog("Introduza a pontuação obtida:","0"); 
     pontos=Integer.parseInt(pontuacao); 
     do 
     { 
      pontos_insuf(); 
      dbpontos=res.getInt("PONTUACOES"); 
      System.out.println("pt="+pontos+"db="+dbpontos); 
      if(pontos>dbpontos) 
      { 
       res.updateInt("PONTUACOES",pontos); 
       res.updateString("NOME",nome); 
       res.updateRow(); 
      } 
      if(pontos<dbpontos || pontos==dbpontos) 
      { 
       res.next(); 
      } 
     } 
     while(pontos<dbpontos); 
     stm.close(); 
     res.close(); 
    } 
    catch (IOException ex) 
    { 
     Logger.getLogger(Jogos_Pacman.NewJFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    catch(SQLException e) 
    { 
     MsgBox.show(e.getMessage(),"AVISO", JOptionPane.INFORMATION_MESSAGE); 
    } 

voici l'exception du développeur:

private void pontos_insuf() throws SQLException{ 
if(!res.next()) 
{ 
    throw new SQLException("Obteve uma pontuação insuficiente para superar pontuações anteriores!"); 
} } 

Répondre

1

Vous créez votre Statement avec CONCUR_UPDATABLE que je devine que votre base de données nécessite un verrou, mais lorsqu'une erreur est lancée, vous ne libérez pas le verrou, c'est-à-dire que vous ne fermez pas explicitement la Déclaration.

Le meilleur des cas est que vous êtes à la merci de GC pour collecter la déclaration et libérer la serrure, dans le pire des cas, cela n'arrive jamais.

Ce que vous devez faire est de déplacer ces déclarations:

stm.close(); 
res.close(); 

dans un bloc finally afin qu'ils se produisent, peu importe ce que