?? cmppdbaccess.java~1~
字號:
package com.zhanghao.cmpp;/** * <p>Title:CMPPDBAccess</p> * <p>Description: 湖南移動短信網關通訊程序</p> * <p>數據庫訪問類</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: sunun tech ltd.</p> * @author zhanghao * @version 1.0 */import java.util.*;import java.sql.*;import com.zhanghao.common.database.*;import com.zhanghao.common.util.*;public class CMPPDBAccess { private static CMPPDBAccess DBAccess; public boolean isAvail = false; /** 上行數據緩沖,當CMPPMOReceiveThread接受到上行數據后,將數據保存在該緩沖中,由 * CMPPMODataSaveThread線程將數據再保存到數據庫中 **/ public Vector vctMOData = new Vector(1,1); /** 下行數據緩沖,當CMPPDBAccess從數據庫中取出數據后,保存在該緩沖中,由 * 單連接時的CMPPMOSendThread線程或雙連接時的CMPPMTSendThread線程將數據發送到ISMG **/ public Vector vctMTData = new Vector(1,1); private CMPPMODataSaveThread moSaveThread; public CMPPDBAccess() { } /**取得CMPPMOSocketProcess的唯一實例 **/ public static CMPPDBAccess getInstance(){ if(DBAccess == null){ DBAccess = new CMPPDBAccess(); } if(!DBAccess.isAvail){ DBAccess.connect(); } else{ } return DBAccess; } /** * 連接到數據庫 * @return true(成功)or false(失敗) */ public boolean connect(){ Connection conn = null; ResultSet rs = null; try {// Class.forName(DBDriver);// conn = DriverManager.getConnection(Connect_URL, DBUser, DBPass); conn = ConnectionPool.getConnection(); //從連接池取得連接并測試連接是否成功 String strSql = ""; if(CMPPParameter.DBType ==1) strSql = "SELECT SYSDATE FROM DUAL"; else if(CMPPParameter.DBType ==2) strSql = "select getdate()"; else if(CMPPParameter.DBType ==3) strSql = "select getdate()"; rs = conn.createStatement().executeQuery(strSql); rs.next(); rs.getString(1); System.out.println("[CMPPMaster]"+PublicFunction.getFormatTime()+" 通訊程序連接數據庫成功!"); rs.close(); this.isAvail = true; moSaveThread = new CMPPMODataSaveThread(); moSaveThread.start(); System.out.println("[CMPPMaster]"+PublicFunction.getFormatTime()+" 緩沖數據線程啟動..."); }// catch (ClassNotFoundException cnfe) {// disconnect();// System.out.println("Not Found Database Connect Driver " + cnfe);// } catch (Exception ex) { System.out.println("[CMPPMaster]連接數據庫失敗DBAccess.connect() 異常:" + ex); this.isAvail = false; } finally{ discloseconn(conn,null,null); //關閉connection(放回連接池) } return this.isAvail; } /** * 將vctMOData中的MO數據保存到數據庫中 * @param vctMOData * @throws java.lang.Exception */ public void saveMODataFromVector(Vector vctMOData) throws Exception{ Connection conn = null; Statement stmt = null; try{ conn = ConnectionPool.getConnection(); stmt = conn.createStatement(); conn.setAutoCommit(false); //插入語句 for(int i=0;i<vctMOData.size();i++){ CMPP submitMsg = (CMPP)vctMOData.elementAt(i); StringBuffer sbSql = new StringBuffer(""); sbSql.append("insert into cmpp_from_ismg ( from_ismg_id, deliver_msg_id, deliver_destnation_id,"); sbSql.append("deliver_service_id, deliver_msg_fmt, deliver_src_terminal_id, deliver_registered_delivery,"); sbSql.append("deliver_msg_length, deliver_msg_content"); sbSql.append(") values (seq_sms.nextval,"); sbSql.append("" +submitMsg.Msg_Id+","); sbSql.append("'"+submitMsg.Dest_Id+"',"); sbSql.append("'"+submitMsg.Service_Id+"',"); sbSql.append("" +submitMsg.Msg_Fmt+","); sbSql.append("'"+submitMsg.Src_terminal_Id+"',"); sbSql.append("'"+submitMsg.Registered_Delivery+"',"); sbSql.append("'"+submitMsg.Msg_Length+"',"); sbSql.append("'"+submitMsg.Msg_Content+"'"); sbSql.append(")"); stmt.addBatch(sbSql.toString()); } stmt.executeBatch(); conn.commit(); conn.setAutoCommit(true); } catch(Exception ex){ throw ex; } finally{ discloseconn(conn,stmt,null); } } /** * 將待發送數據放入緩沖 * @return */ public boolean fectchMTDataToBuffer(){ String strSql = ""; if(CMPPParameter.DBType ==1) strSql = "select * from (select rownum as my_rownum,a.* from( "+ "SELECT * FROM cmpp_to_ismg WHERE submit_status = 1"+ ") a where rownum<= 20 )where my_rownum> 0"; else strSql = "select * from cmpp_to_ismg where submit_status = 1"; ResultSet rs = null; Statement stmt = null; Connection conn = null; try { //System.out.println("[SPAMaster]讀取待發送信息到緩沖..."); conn = ConnectionPool.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery(strSql); } catch (Exception ex) { this.isAvail = false; Debug.outWarn("[CMPPMaster]Fetch data from cmpp_to_ismg table failed: " + ex) ; return false; } byte[] msg; try { int num = 0; //取出待發送數據的計數器 String content = ""; while( rs.next()) { if(num++ > 1000) break; //每次最多取出1000條記錄 String msgcontent = rs.getString ("MSG_CONTENT")==null?"":rs.getString ("MSG_CONTENT").trim(); //如果發送字符長,則截成多段 int length = 70; //標準為70個字符 int iMsgLenth = msgcontent.length();// int iLength = (0 + length > iMsgLenth) ? iMsgLenth - 0 : length;// int iBeginIndex = 0;// int iEndIndex = iEndIndex =// (iBeginIndex + iLength > iMsgLenth) ? (iMsgLenth) : (iBeginIndex + iLength);//// for (;iBeginIndex < iEndIndex;// iBeginIndex = iEndIndex,// iEndIndex = (iBeginIndex + iLength > iMsgLenth) ?// (iMsgLenth) : (iBeginIndex + iLength)// )// { CMPP mtMsg = new CMPP(CMPP.CMPP_SUBMIT); mtMsg.Msg_Id = rs.getLong("to_ismg_id"); mtMsg.Service_Id = rs.getString("service_id"); mtMsg.Pk_total = rs.getByte("pk_total"); Debug.outInfo("[發送數據]"+PublicFunction.getFormatTime()+ " Mobile Num:" + mtMsg.Dest_Id + ",Msg Content:" + msgcontent); synchronized(vctMTData){ vctMTData.addElement(mtMsg); }// } // end for (;iBeginIndex < iEndIndex;..... } } catch(Exception e){ e.printStackTrace(); return false; } //關閉連接 try{ rs.close() ; stmt.close() ; } catch(SQLException e){ e.printStackTrace(); this.isAvail = false; return false; } //System.out.println("開始只標志為"); //置發送標記SEND_STATUS為-2 CMPP mtMsg; int sndSize = vctMTData.size() ; for(int i = 0; i < sndSize; i++){ mtMsg = (CMPP)vctMTData.elementAt (i); strSql = "update cmpp_to_ismg set send_status = -2 where msgid = " + mtMsg.Msg_Id ; try { stmt = conn.createStatement(); stmt.execute(strSql); stmt.close() ; } catch (SQLException ex) { System.out.println("[SPAMaster]DBAccess.Set Send_Status error :" +ex.toString()); vctMTData.removeElementAt (i); i--; sndSize--; this.isAvail = false; return false; } } discloseconn(conn,null,null); //關閉connection(放回連接池) return true; } /**釋放連接池的連接closeconn(); //關閉connection(放回連接池)**/ private void discloseconn(Connection conn,Statement stmt,ResultSet rst){ try{ if(rst != null){ rst.close(); } if(conn != null){ conn.close(); } if(stmt != null){ stmt.close(); } } catch (Exception sqle){ System.out.println("Database disconnecting failed"+sqle); } } /** * <p>Title: CMPPMODataSaveThread保存上行數據的線程</p> * <p>Description: 湖南移動短信網關通訊程序</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: sunun tech ltd.</p> * @author zhanghao * @version 1.0 */ public class CMPPMODataSaveThread extends Thread{ public boolean isAvail = false; public CMPPMODataSaveThread(){ isAvail = true; } public void run(){ //轉儲緩沖中的MO數據 Vector vctWillSaveMO = new Vector(1,1); try{ while(isAvail && CMPPDBAccess.getInstance().isAvail){ if(vctMOData.size()>0){ synchronized(vctMOData){ for(int i=0;i<vctMOData.size();i++){ vctWillSaveMO.addElement(vctMOData.elementAt(i)); } //清空緩沖中的數據 vctMOData.removeAllElements(); } //調用CMPPDBAccess的存儲方法存儲上行數據 System.out.println("vctWillSaveMO.size"+vctWillSaveMO.size()); CMPPDBAccess.getInstance().saveMODataFromVector(vctWillSaveMO); vctWillSaveMO.removeAllElements(); } else{ PublicFunction.sleep(20); } } } catch(Exception ex){ //打印異常,并關閉連接 Debug.outInfo("[CMPPMaster]保存MO數據失敗:"+ex.toString()); //將未寫入數據庫的MO數據放回原MO緩沖 if(vctWillSaveMO.size()>0){ for(int i =0;i<vctWillSaveMO.size();i++){ vctMOData.addElement(vctWillSaveMO.elementAt(i)); vctWillSaveMO.removeElementAt(i); } } DBAccess.getInstance().disclose(null); } } } /** * 斷開數據庫連接 */ private void disclose(Connection conn) { try { if(this.isAvail){ if(conn != null){ conn.close(); } this.isAvail = false; Debug.outInfo("通訊程序關閉數據庫連接"); } } catch (Exception sqle){ System.out.println("Database disconnecting failed"); } }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -