?? dbimpl2.java
字號:
package org.com.gather;
import java.util.*;
import java.sql.*;
import org.com.gather.exception.*;
//切換了類,原版本事DBImpl,考慮到功能上的限制
//開發了另一個版本,DBImpl2,直接利用框架來切換類
public class DBImpl2 implements DB{
private Properties pro = null;
private Log log = null;
private BackUp back = null;
private static String key = "key";
private static DBImpl2 instance = null;
//屬性由Spring注入
private DBImpl2(Properties pro){
this.pro = pro;
}
//私有的構造器,為了獲取實例,要提供一個靜態方法,
//通過該方法獲取實例
public static DBImpl2 getInstance(Properties pro){
if(instance == null){
synchronized(key){
if(instance == null){
instance = new DBImpl2(pro);
}
}
}
return instance;
}
//有可能多個線程會同時保存數據,也就是說這個方法
//將會出現并發問題,為了防止多個線程同時對做入庫
//操作,在這加一個同步鎖.
public synchronized void storeToDB(Collection col)throws SQLException,ClassNotFoundException,DBException{
log.writeInfo("應該入庫數量大下---"+col.size());
if(!col.isEmpty()){
long start = System.currentTimeMillis();
Connection con = null;
con = this.getConnection();
log.writeDebug("成功獲取連接,程序繼續執行!");
long end = System.currentTimeMillis();
long time = (end - start)/1000;
log.writeInfo("獲取連接時長為 --->"+time);
//構建一塊緩存
Collection coll = new ArrayList();
//取出batchSize,每次入庫量大小
String s_size = pro.getProperty("batchSize");
int size = new Integer(s_size).intValue();
int c_size = col.size();
//對入庫集合進行遍歷
Iterator iter = col.iterator();
//為了測試,這里只插入一個字段
String sql = "insert into dt values(?)";
PreparedStatement pstmt = null;
try{
pstmt = con.prepareStatement(sql);
}catch(SQLException e){
e.printStackTrace();
log.writeError("解析sql語句出異常!");
back.storeForEmpty(col);
log.writeInfo("成功把入庫數據備份!");
System.exit(0);
}
while(iter.hasNext()){
//把集合的數據存放到緩存,等到數量到了
//batch-size指定的數量后再一次入庫;
coll.add(iter.next());
//如果集合數據存放到緩存,則可把集合的數據
//刪除;
iter.remove();
if(coll.size() == size){
try{
con.setAutoCommit(false);
Iterator it = coll.iterator();
while(it.hasNext()){
BIDR bidr = (BIDR)it.next();
pstmt.setString(1,bidr.getLoginName());
pstmt.addBatch();
}
pstmt.executeBatch();
con.commit();
}catch(SQLException e){
log.writeError(e.getMessage());
//把剩下沒入庫的數據,一并保存;
col.addAll(coll);
back.storeForEmpty(col);
log.writeInfo("入庫過程重出異常,成功把數據備份到文件;");
try{
con.rollback();
log.writeInfo("入庫異常,回滾!");
}catch(SQLException ee){
ee.printStackTrace();
log.writeError("數據庫異常,數據回滾!");
throw new DBException(ee);
}
throw new DBException(e);
}
//把緩存清空,重新載入數據;
coll.clear();
}
}
//把剩余的數據,繼續入庫;
Iterator itr = coll.iterator();
try{
con.setAutoCommit(false);
while(itr.hasNext()){
BIDR br = (BIDR)itr.next();
pstmt.setString(1,br.getLoginName());
pstmt.addBatch();
}
pstmt.executeBatch();
con.commit();
}catch(SQLException e){
e.printStackTrace();
back.storeForEmpty(coll);
log.writeInfo("成功把剩余數據備份!");
try{
con.rollback();
}catch(SQLException ee){
ee.printStackTrace();
log.writeError("入庫異常,剩余數據回滾!");
throw new DBException(e);
}
}
//清空緩存;
coll.clear();
//把剩余的集合數據清空;
col.clear();
log.writeDebug("成功將數據插入數據庫!");
}else{
System.out.println("入庫數據量為零!");
}
}
//這里每次都是拿到物理連接,可以考慮用連接池.
public Connection getConnection()throws SQLException,ClassNotFoundException{
Class.forName(pro.getProperty("driver"));
Connection con = DriverManager.getConnection(pro.getProperty("url"),pro.getProperty("username"),pro.getProperty("password"));
return con;
}
public void setLog(Log log){
this.log = log;
}
public void setBackUpServer(BackUp back){
this.back = back;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -