2011-11-14 25 views
0

サーバーテーブルにはサーバー名に関する情報が含まれているスタースキーマモデルがあります。 情報テーブルには、特定のサーバーに必要な情報が含まれています。 実際のデータテーブルには、どのサーバにどの情報が含まれているかに関する情報が含まれています。JDBCを使用して効率的にスタースキーマに挿入

Server Table 

enter image description here

Information Table 
Actual Data Table 

enter image description here

enter image description here

今、私はIS-私が使用して データテーブルにデータを挿入しようとしていますが午前問題J DBC。しかし、スタースキーマモデルの実際のデータテーブルにどのようにデータを追加すればよいかわかりません。私はデータベースに接続して各情報のたびにそれを挿入するか、データベースと一度だけ通信することでそれを行うことができる直接的な方法があります。これは私のコードで、私は各サーバーのすべての情報を取得しています。 IndexDataはOracle Databaseに値を挿入するクラスです。

public void fetchlog() { 
      InputStream is = null; 
      InputStream isUrl = null; 
      FileOutputStream fos = null; 
      try { 
       is = HttpUtil.getFile(monitorUrl); 
       if(monitorUrl.contains("stats.jsp") || monitorUrl.contains("monitor.jsp")) { 
        trimUrl = monitorUrl.replaceAll("(?<=/)(stats|monitor).jsp$", "ping"); 
       } 
       isUrl = HttpUtil.getFile(trimUrl); 
       BufferedReader in = new BufferedReader (new InputStreamReader (is)); 
      String line; 
      int i=0,j=0,k=0; 
      while ((line = in.readLine()) != null) { 
       if(line.contains("numDocs")) { 
        docs = in.readLine().trim(); 
    //So should I keep on inserting into Database for each information, like this 
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, docs); 
       } else if(line.contains("indexSize")) { 
        indexSize = in.readLine().trim(); 
    //For this information-- the same way? 
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, indexSize); 
       } else if(line.contains("cumulative_lookups")) { 
        cacheHits= in.readLine().trim(); 
    //For this information too-- the same way? 
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, cacheHits); 
       } else if(line.contains("lastCommitTime")) { 
        lastCommitTime = in.readLine().trim();  
    //For this information too-- the same way? 
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, lastCommitTime); 

      } 

      BufferedReader inUrl = new BufferedReader (new InputStreamReader (isUrl)); 
      String lineUrl; 
      Pattern regex = Pattern.compile("<str name=\"status\">(.*?)</str>"); 

      while ((lineUrl = inUrl.readLine()) != null) { 
       System.out.println(lineUrl); 
       if(lineUrl.contains("str name=\"status\"")) { 
        Matcher regexMatcher = regex.matcher(lineUrl); 
        if (regexMatcher.find()) { 
         upDown= regexMatcher.group(1); 
//For this information too-- the same way? 
    //IndexData id = new IndexData(timeStamp, ServerName, InformationName, upDown); 

        }     
        System.out.println("Status:- " + status);     
       } 
      } 
    //Or is there some other way we can insert directly into database by communicating with database only one time not multiple times for each information.  
      //IndexData id = new IndexData(timeStamp, ServerName, InformationName, Value); 
       fos = new FileOutputStream(buildTargetPath()); 
       IOUtils.copy(is, fos); 
      } catch (FileNotFoundException e) { 
       log.error("File Exception in fetching monitor logs :" + e); 
      } catch (IOException e) { 
       log.error("Exception in fetching monitor logs :" + e); 
      } 
     } 

I hope question is clear to everyone. Any suggestions will be appreciated. 

答えて

4

私がお勧めする2つのことがあります。まず、一括挿入を使用して、1つのJDBCトランザクション内のすべての関連する挿入を実行します。詳細については:

JDBC Batch Insert Example

また、私は強く、あなたがライブラリをJDBC接続プーリングを使用することをお勧めします。 Postgresデータベースではc3p0を使用します。あなたはここでより多くの情報を見つけることができますでしょう

c3p0 Project Page

基本的な考え方は、その後、関連するインサートのセットごとにJDBCバッチを作成し、起動時に接続プールを作成することです。

+0

起動時にjdbc接続プーリングを使用しています。しかし、どうやってデータベースに挿入すればいいのか分かりません。スキーマがスタースキーマでない場合は、次のような方法でこれを行いました。このように、 'IndexData id = new IndexData(timeStamp、ServerName、updown、indexSize、cacheHits、lastCommit、docs);' – ferhan

+0

JDBCを使用したJavaでのバッチ操作の例接続プールからの接続方法を既に知っていると仮定すると、 http://www.jguru.com/faq/view.jsp?EID=5079 –

関連する問題