Java - 在异常

时间:2015-10-03 15:46:51

标签: java database jdbc sqlexception

这是事情:

  • 我有一个DB作为得分记录;

  • 我有一个按钮,用新分数更新数据库;

  • 我有一个“开发者异常”,只要分数低而无法替换记分板(DB)中的任何分数,就会抛出SQLException;

问题:

  • 我得到一个低分并且发生异常,然后我获得高分而不是更新数据库我得到了错误。

这是错误:

  • “在请求的时间内无法获得锁定”

以下是按钮中的代码:

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);
    }

这是开发者例外:

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

1 个答案:

答案 0 :(得分:1)

您正在使用CONCUR_UPDATABLE创建您的声明,我猜测您的数据库需要锁定,但是当发生错误时您不会释放锁定,即您没有明确关闭声明。

最好的情况是你受GC支持收集声明并释放锁定,最坏的情况是它永远不会发生。

您需要做的是移动这些陈述:

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

进入finally块,以便无论发生什么

都会发生