未检测到JDBC MySQL新插入

时间:2017-05-31 13:05:46

标签: java mysql jdbc server

我使用Mysql数据库和jdbc连接在java服务器上工作

当我尝试执行以下步骤时出现问题

1.启动服务器

2.手动(使用phmypadmin)在数据库中插入新记录。

3.使用jdbc api

选择记录

我只获取数据库中已有的记录,而不是新记录。

这是我的联系:

 public JDBCMySQL(String nomFitxerPropietats) throws Exception {
        if (nomFitxerPropietats == null) {
            nomFitxerPropietats = "jdbcMysql.txt";
        }
        Properties props = new Properties();
        try {
            props.load(new FileReader(nomFitxerPropietats));
        } catch (FileNotFoundException ex) {
            throw new Exception("No es troba fitxer de propietats", ex);
        } catch (IOException ex) {
            throw new Exception("Error en carregar fitxer de propietats", ex);
        }
        String driver = props.getProperty("driver");
        if (driver == null && System.getProperty("java.version").compareTo("1.6") < 0) {
            throw new Exception("La versió de Java obliga a definir la propietat driver dins el fitxer de propietats");
        }
        String url = props.getProperty("url");
        if (url == null) {
            throw new Exception("Manca la propietat url en el fitxer de propietats");
        }
        String user = props.getProperty("user");
        String password = props.getProperty("password");
        // No controlem !=null per què hi ha SGBDR que permeten no indicar user/contrasenya (MsAccess)
        try {
            if (driver != null) {
                Class.forName(driver);
            }
            con = DriverManager.getConnection(url, user, password);
            con.setAutoCommit(false);
        } catch (SQLException ex) {
            throw new Exception("No es pot establir connexió", ex);
        } catch (ClassNotFoundException ex) {
            throw new Exception("No es pot carregar la classe " + driver);
        }

    }

这是我用来检索记录的功能:

  @Override
    public List<Cita> getCitas(int sesID) {
    List<Cita> citas = new ArrayList<Cita>();
     try {

     Statement st = null;
    ResultSet rs = null;

       String consulta = "  select iii.estatinforme,s.NUMERO,c.diahora, s.PERIT_NO,s.INFORME_NO,s.POLISSA_ID,s.DATAASSIGNACIO,s.DATAOBERTURA,s.DATATANCAMENT,s.DESCRIPCIOSINISTRE,s.TIPUSSINISTRE,s.ESTATSINISTRE,s.polissa_id,p.municipi from SINISTRE s join POLISSA p on (s.polissa_id = p.ID_POLISSA) join PERIT pe on ( pe.NUMERO = s.PERIT_NO) join CITA c on (c.sinistre_id = s.numero) left join INFORMEPERICIAL iii on (c.sinistre_id=iii.sinistre_id) where ( s.PERIT_NO = ? and (iii.ESTATINFORME = 'PENDENT'  or iii.ESTATINFORME is null  or DATE_FORMAT(c.diahora, '%Y-%m-%d') = CURDATE()   )) order by c.diahora ";

       PreparedStatement pstmt = con.prepareStatement(consulta);

       pstmt.setInt(1, sesID);

      rs =  pstmt.executeQuery();

        while (rs.next()) {
          //handling my reads...

        }
         pstmt.close();
           rs.close();
  } catch (SQLException ex) {
      Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
  }

    return citas;
}

我怀疑它与准备好的语句或查询无关,因为在我停止服务器并再次启动它之后,将使用GetCitas()函数检索新的。

已编辑:配置文件我正在使用(jdbcMysql.txt):

  

URL = JDBC:MySQL的:// MYIP:3306 / mydb的

     

用户= myuser的

     

密码=为mypass

1 个答案:

答案 0 :(得分:2)

总而言之,这似乎是Transaction Isolation的一个问题。

基本上,只要某些事务没有提交插入或更新的数据,就无法在另一个程序中看到它。

同样,只要您的交易处于开放状态,您将始终获得数据库在交易开始时所具有的相同状态。

设置autocommit = false后,您在程序中很早就启动了该事务,只要您没有commit()您的事务,您就会看到相同的快照(至少使用默认的mysql事务隔离REPEATABLE READ到位)

这就是为什么在您选择之前手动commit()连接的原因。

  

一致阅读

     

使用快照信息的读取操作   根据时间点呈现查询结果,无论更改如何   由同时运行的其他事务执行。如果查询   数据已被另一个事务更改,原始数据是   基于撤消日志的内容重建。这种技术   避免一些可能降低并发性的锁定问题   强制交易等待其他交易完成。

关于另一个主题:您的代码可以从一些清理中受益匪浅 - 请参阅以下使用try-with-resource实现getCitas:

    @Override
    public List<Cita> getCitas(int sesID) {
      List<Cita> citas = new ArrayList<Cita>();
      String consulta = "select iii.estatinforme,s.NUMERO, [...]";
      try (PreparedStatement pstmt = con.prepareStatement()) {
          pstmt.setInt(1, sesID);
          try(ResultSet rs =  pstmt.executeQuery()) {
              while (rs.next()) {
                  //handling my reads...
              }
          }
      } //Closing happend automatically! Even in case of an error!
      catch (SQLException ex) {
          Logger.getLogger(JDBCMySQL.class.getName()).log(Level.SEVERE, null, ex);
      }     
      return citas;
    }