最近遇到一個需求,每隔15分鐘彙總一次數據推送到第三方,由於數據量較大,所以採取的方式是每天彙總一次檔案數據, 每隔15分鐘用檔案數據關聯實時數據彙總推送。這種情況下容易出現檔案數據還未彙總完成時就已經到了去關聯實時數據表推送的時候了,毫無意外推送的數據會爲空,爲了避免這種情況,採用事務進行控制,先將檔案數據彙總到臨時表,然後從臨時表寫數據到正式表,在同一個事務中處理刪除數據和插入數據,就不會出現檔案數據爲空的時候了。
public void saveData(String dbname)
{
StringBuffer str=new StringBuffer();
String tableNameTmp="stu_info_tmp";
String tableNameEnd="stu_info";
String driver ="oracle.jdbc.driver.OracleDriver";
String jdbcUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
PreparedStatement psi = null;
Connection conn=null;
try {
Class.forName(driver); //裝載一個驅動
conn = DriverManager.getConnection(jdbcUrl,"stu","stu") ; //建立一個連接
conn.setAutoCommit(false) ; // 事物要進行整體提交,故我們必須關閉自動提交
String sqlStr=" delete from "+tableNameEnd+" ";
psi=conn.prepareStatement(sqlStr);
psi.executeUpdate();
str.append("insert into "+tableNameEnd+" ");
str.append(" (id, name, class, subject, grade) ");
str.append("select id, name, class, subject, grade from "+tableNameTmp+" ");
psi=conn.prepareStatement(str.toString());
int num=psi.executeUpdate();
conn.commit();
psi.close();
conn.close();
} catch (SQLException ex) {
if (conn!=null) {
try {
conn.rollback();
} catch (Exception e) {
}
}
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
注意:truncate table 是不走事務的,如果使用truncate table刪除表數據,那麼在事務未提交之前,數據庫就已經執行了刪除操作!!