Java學習-Java socket應用的幾個小實例

用於本機上的客護端與服務器對話的小程序:

  客護端:

  import java.io.BufferedReader;

  import java.io.BufferedWriter;

  import java.io.InputStreamReader;

  import java.io.OutputStreamWriter;

  import java.net.Socket;

  public class Client extends Thread

  {

  public void Write() throws Exception

  {

  Socket s=new Socket(“127.0.0.1″,12345);

  BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

  BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

  String message=”客護端說:”;

  while(!(message.equals(“”)))

  {

  message=br.readLine();

  System.out.println(“客護端說:”+message);

  bw.write(message+”\n”);

  bw.flush();

  }

  bw.close();

  s.close();

  }

  public void run()

  {

  Socket m=null;

  BufferedReader dr=null;

  try

  {

  m=new Socket(“127.0.0.1″,12345);

  dr=new BufferedReader(new InputStreamReader(m.getInputStream()));

  String msg=”服務器說:”;

  while(!(msg.equals(“”)))

  {

  msg=dr.readLine();

  System.out.println(“服務器說:”+msg);

  }

  }

  catch(Exception e){e.printStackTrace();}

  finally

  {

  try

  {

  dr.close();

  m.close();

  }

  catch(Exception e){e.printStackTrace();}

  }

  }

  public static void main(String args[])throws Exception

  {

  Client c=new Client();

  c.start();

  c.Write();

  }

  }

  服務器:

  import java.io.BufferedReader;

  import java.io.BufferedWriter;

  import java.io.InputStreamReader;

  import java.io.OutputStreamWriter;

  import java.net.ServerSocket;

  import java.net.Socket;

  public class Server extends Thread

  {

  private ServerSocket ss=null;

  public Server ()throws Exception

  {

  ss=new ServerSocket(12345);

  }

Oracle大量數據插入之性能優化理解

在學習Oracle中,我們使用SQL和ODBC鏈接進行數據插入,單獨插入少量數據時,沒有問題。但是在插入大量數據時,就會出現異常,內存溢出錯誤。

  如何解決在進行大量數據插入時,java程序能夠有效快速的進行數據處理。這就是數據庫中性能優化的問題。

  為什麽要進行性能優化。

  首先,在大量數據處理中 壹般常規的方式會造成程序處理效率和時間低下。達不到產品上線要求。

  其次,沒有性能優化在產品維護時也會出現很多錯誤,帶來麻煩。

  如何進行性能優化。

  壹般軟件都會進行大量數據測試,對性能做個整體評估,然後找出最好的方法來編寫需要的代碼。

  同時再次進行測試達到最佳的性能點。

  對於Oracle大量數據插入的性能優化我們采用如下方法進行

  先采用常規方式編寫代碼,如在放入數據時就直接使用list接口方法進行。

  插入數據中不進行批處理使用。

  發現,在插入10萬數據中 內存溢出,而且數據庫使用時間非常長。

  於是,我們先采用數據庫批處理命令 采用每1000條數據再進行壹次提交

  使用addBAEACH 方法,和excutbeach 方法來處理

  代碼為

  ps.addBatch();

  if(i!=0&&i%10000==0) {

  ps.executeBatch();

  con.commit();

  ps.clearBatch();

  }

  同時也使用預編譯語句進行插入。

  但是在仍然不能解決虛擬機內存溢出問題

  於是我們使用

  String[] fileList = new File(uploadDir).list();

  ArrayList<String[]> array = new ArrayList<String[]>();

  array.clear();

  來解決讀取文件後如何放入數據庫中再使用SQL語句進行插入。

  經過反復測試。最後找到最優點。在插入100萬數據情況下 每次1萬條數據提交。性能最優。

ORACLE中dbms_stats的使用

dbms_stats能良好地估計統計數據(尤其是針對較大的分區表),並能獲得更好的統計結果,最終制定出速度更快的SQL執行計劃。

  exec dbms_stats.gather_schema_stats(

  ownname          => ‘SCOTT’,

  options          => ‘GATHER AUTO’,

  estimate_percent => dbms_stats.auto_sample_size,

  method_opt       => ‘for all columns size repeat’,

  degree           => 15

  )       為了充分認識dbms_stats的好處,需要仔細體會每壹條主要的預編譯指令(directive)。下面讓我們研究每壹條指令,並體會如何用它為基於代價的SQL優化器收集最高質量的統計數據。

  options參數

  使用4個預設的方法之壹,這個選項能控制Oracle統計的刷新方式:

  gather——重新分析整個架構(Schema)。

  gather empty——只分析目前還沒有統計的表。

  gather stale——只重新分析修改量超過10%的表(這些修改包括插入、更新和刪除)。

  gather auto——重新分析當前沒有統計的對象,以及統計數據過期(變臟)的對象。註意,使用gather auto類似於組合使用gather stale和gather empty。

  註意,無論gather stale還是gather auto,都要求進行監視。如果妳執行壹個alter table xxx monitoring命令,Oracle會用dba_tab_modifications視圖來跟蹤發生變動的表。這樣壹來,妳就確切地知道,自從上壹次分析統計數據以來,發生了多少次插入、更新和刪除操作。

  estimate_percent選項

  estimate_percent參數是壹種比較新的設計,它允許Oracle的dbms_stats在收集統計數據時,自動估計要采樣的壹個segment的最佳百分比:

  estimate_percent => dbms_stats.auto_sample_size

  要驗證自動統計采樣的準確性,妳可檢視dba_tables sample_size列。壹個有趣的地方是,在使用自動采樣時,Oracle會為壹個樣本尺寸選擇5到20的百分比。記住,統計數據質量越好,CBO做出的決定越好。

  method_opt選項

  method_opt:for table –只統計表

  for all indexed columns –只統計有索引的表列

  for all indexes –只分析統計相關索引

  for all columns

  dbms_stats的method_opt參數尤其適合在表和索引數據發生變化時刷新統計數據。method_opt參數也適合用於判斷哪些列需要直方圖(histograms)。

  某些情況下,索引內的各個值的分布會影響CBO是使用壹個索引還是執行壹次全表掃描的決策。例如,假如在where子句中指定的值的數量不對稱,全表掃描就顯得比索引訪問更經濟。

  如果妳有壹個高度傾斜的索引(某些值的行數不對稱),就可創建Oracle直方圖統計。但在現實世界中,出現這種情況的機率相當小。使用CBO時,最常見的錯誤之壹就是在CBO統計中不必要地引入直方圖。根據經驗,只有在列值要求必須修改執行計劃時,才應使用直方圖。

  為了智能地生成直方圖,Oracle為dbms_stats準備了method_opt參數。在method_opt子句中,還有壹些重要的新選項,包括skewonly,repeat和auto:

  method_opt=>’for all columns size skewonly’

  method_opt=>’for all columns size repeat’

  method_opt=>’for all columns size auto’

  skewonly選項會耗費大量處理時間,因為它要檢查每個索引中的每個列的值的分布情況。

  假如dbms_stat發現壹個索引的各個列分布得不均勻,就會為那個索引創建直方圖,幫助基於代價的SQL優化器決定是進行索引訪問,還是進行全表掃描訪問。例如,在壹個索引中,假定有壹個列在50%的行中,如清單B所示,那麽為了檢索這些行,全表掃描的速度會快於索引掃描。

  –*************************************************************

  – SKEWONLY option—Detailed analysis

  –

  – Use this method for a first-time analysis for skewed indexes

  – This runs a long time because all indexes are examined

  –*************************************************************

  begin

  dbms_stats.gather_schema_stats(

  ownname          => ‘SCOTT’,

  estimate_percent => dbms_stats.auto_sample_size,

  method_opt       => ‘for all columns size skewonly’,

  degree           => 7

  );

  end;

  重新分析統計數據時,使用repeat選項,重新分析任務所消耗的資源就會少壹些。使用repeat選項(清單C)時,只會為現有的直方圖重新分析索引,不再搜索其他直方圖機會。定期重新分析統計數據時,妳應該采取這種方式。

  –**************************************************************

  – REPEAT OPTION – Only reanalyze histograms for indexes

  – that have histograms

  –

  – Following the initial analysis, the weekly analysis

  – job will use the “repeat” option. The repeat option

  – tells dbms_stats that no indexes have changed, and

  – it will only reanalyze histograms for

  – indexes that have histograms.

  –**************************************************************

  begin

  dbms_stats.gather_schema_stats(

  ownname          => ‘SCOTT’,

  estimate_percent => dbms_stats.auto_sample_size,

  method_opt       => ‘for all columns size repeat’,

  degree           => 7

  );

  end;