1、問:用JDBC訪問ORACLE數據庫,做DELETE操作,能用JAVA多線程實現嗎? ORACLE服務器要怎么配?(以下答案來自網絡,僅供參考)
答: Oracle有自己的鎖機制。就算你開100條線,它還是一條一條刪除。不能同時刪除多項的。
對於大量數據更新,Oracle有建議一些優化措施。
(1) 首先是把auto-commit給關閉。因為你每刪一條數據,oracle就要自動執行一次commit。commit是需要資源的。所以如果你手動設置為每刪數據1000條,執行一次commit. 那你就可以節省資源了。
(2) 充分利用batch update。如果不用batch,每個delete命令都需要從網絡上傳送到oracle。1萬個刪除命令,要有1萬次傳送。如果將100個刪除命令綁在一起送去Oracle執行。那就只要傳送100次就可以了。大大縮短所需時間和網絡資源。
以上這些建議,都可以在Oracle參考里查到。
2、問:oracle中什么操作需要commit才能保存到數據庫?(以下答案來自網絡,僅供參考)
答:平時用的時候Commit、Rollback 主要用在DML(數據操縱語言) - Insert、Update、Delete 這些語句上,可以設置保存點,然后依次提交,同樣也可以rollback。單獨commit,是把之前的數據改動都一次提交。正常的關閉,exit是可以自動提交的,可以不用commit,直接關閉窗口,屬於強制關閉,關閉之前需要commit。
3、問:jdbc 批處理插入數據庫 每100條提交一次,有余數時如何解決?(以下答案來自網絡,僅供參考)
答:
String sql="insert into t1(id) values (?)";
Connection con=null;
PreparedStatement ps=null;
con= dao.getConnection();
ps=con.prepareStatement(sql);
ps.addBatch();
把
if(i%100==0)//每100條提交一次
{
ps.executeBatch();
con.commit();
ps.clearBatch();
}
改成
if(i%100==0||i==(list.size()-1)){
ps.executeBatch();
con.commit();
ps.clearBatch();
}
4、通過測試得到的:(來自網絡,僅供參考)
(1)、批處理要conn.setAutoCommit(false)(默認會自動提交,不能達到批處理的目的,速度極慢!)。
(2)、pstmt.executeBatch(); //PreparedStatement pstmt
conn.commit();
要提交,數據庫才會有數據。
(3)、避免內存溢出,應每x(如:萬)條提交一次數據。
(4)、可用“數據庫名.表名”的方法來訪問數據庫表
這樣,則在寫JdbcUtil的DB_CONNECTION = "jdbc:mysql://localhost:3306/"時,
可不具體到數據庫,方便跨數據庫的數據操作。
(5)、Statement和PrepareStatement不僅可以操作DDL,添加刪除表和數據庫的sql都可以操作,用execute(String sql)方法。
5、conn.setAutoCommit(true)和(false)的區別:(來自網絡,僅供參考)
JDBC中的這個參數
true:sql命令的提交(commit)由驅動程序負責
false:sql命令的提交由應用程序負責,程序必須調用commit或者rollback方法
通過jdbc對數據庫進行操作的時候,conn.commit(),可以將修改的數據提交,但是前提必須是數據庫的autocommit屬性為false,否則你進行一次操作后,數據庫會自行commit。
6、為什么采用批處理的方式后,沒有寫conn.commit()也能提交?
答:這樣可能是程序結束conn關閉導致的提交
conn.setAutoCommit(true)是控制是否每條SQL執行完后自動提交。
7、(一)
1.java程序循環執行10000條sql語句,不commit,共耗時13.395s;sql*plus可以查詢的到;重啟sql*plus
依然可以查詢得到。
2.在sql*plus中執行刪除表中內容 delete from "TAB_orderDetail"(沒有commit);然后再在此次的
sql*plus中查詢,記錄數為0;但用java查詢數據並沒有被刪除,還能查得到。但重啟sql*plus,記錄數仍
為10000。這都是由於在sql*plus中執行刪除表中內容時沒有commit造成的。
3.在java中執行刪除表中內容 delete from "TAB_orderDetail"(沒有commit),在java中再查詢結果為0
;在sql*plus中查詢結果也為0.(說明此時已經真正刪除)
(二)
1、java程序循環執行10000條插入sql語句,不commit,共耗時7.652s。java程序循環執行10000條sql語句
,commit,共耗時7.595s。改為批處理后,批處理插入100000條記錄,用時52.867s;批處理插入10000條記錄,用時5.337s。