2017-05-31 53 views
0

我使用的是MySQL數據庫和JDBC連接JDBC MySQL的新插入未檢測

,問題就來工作客棧Java服務器當我嘗試做以下步驟

1.啓動服務器

2.手動插入(使用phmypadmin)數據庫中的新記錄。

3.Select使用JDBC API

我只得到已經分別在DB,而不是新的記錄的記錄。

這裏是我的連接:

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

+0

你確定你是在phpMyAdmin的會議上提交你的事務?此外,雖然JDBC不緩存任何內容,但也許您的服務器設置了某種類型的數據庫緩存,請檢查您的配置。 – SJuan76

+0

是的,很確定。 –

+1

最好的做法是隻在需要時打開連接,並且爲最小的必要範圍打開連接。我有一種感覺,你可能會在程序期間建立連接。 (我認爲與此相關的問題是,在更新數據庫之前打開連接,因此它沒有與數據庫當前狀態的連接,所以當您執行檢索時,將不檢索添加的行。)將連接作爲字段刪除可能會更好,並使其成爲每種方法的局部變量。這種方式可以控制何時打開和關閉連接。 – Ishnark

回答

2

總而言之,這似乎是Transaction Isolation的問題。

基本上,只要某些事務沒有提交插入或更新的數據,就無法在另一個程序中看到該數據。

同樣,只要您的交易是開放的,您將始終收到您的數據庫在交易開始時的相同狀態。

設置了autocommit = false後,你在程序的早期就開始了這個事務,只要你沒有你的事務,你就會看到相同的快照(至少默認的mysql事務隔離REPEATABLE READ就緒)

這就是爲什麼在選擇作品之前手動將您的連接連接起來。

一致讀

甲讀使用快照信息基於在時間點 本查詢結果,而不管變化的操作 通過同時運行的其他事務執行。如果查詢到 數據已被其他事務更改,則根據撤消日誌的內容重構原始數據 。該技巧 避免了一些鎖定問題,這些問題可能會通過強制事務等待其他事務完成而降低併發性。

另一個話題:你的代碼可以從一些清潔大大受益 - 參見下面的實現getCitas的使用try-與資源:

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