2011-02-09 27 views
0

私はテーブルに大量のデータを格納していますが、これは普通のJavaで読み込んでXMLファイルに書き込む最良の方法ですか?データベースから巨大なデータを読み込み、xmlに書き込むJava

おかげ

+0

おかげで結構ですか? – code511788465541441

+1

標準読み込みでは、1つずつ選択してファイルにダンプしますが、これは簡単な手順です。手作業でxmlを作成するのは簡単です。 – bestsss

+0

@ user521180:それは数秒で非常に速く起こる必要があります – Gauls

答えて

1

あなたは最速意味最高による場合 - これはJDBCを使用するよりも道高速になりますように私は、ファイルをダンプするネイティブデータベースツールを使用して検討します。

+0

プログラムで行う必要があります – Gauls

0

Java(+ Hibernate?)は、プロセスを不必要にダウンさせる原因になります。 sqlplusスクリプトとスプール形式のフィールドをxmlファイルに簡単に追加できます。

+0

POJOのみ許可 – Gauls

0

私はデータベースのビルド手順(XMLパスなど)を使用して、既にxml形式で変換されたデータを取得します。

ファイルに書き込むには2通りの方法があります。
1.データを取得するためにJavaインタフェース(JDBC)を使用する必要がある場合は、このデータを読み込んでファイル(出力を確認する必要がない限り、XMLパーサーは関与しません)。
2. Javaの制限がない場合は、XMLデータをファイルにダンプするストアドプロシージャを記述します。

更新はコメントする:最速の検索のため

ワークフロー:

  1. データを取得し、ファイルにダンプしますストアドプロシージャを作成します。
  2. どちらのSPでもファイル名を返すことができます。また、出力場所を動的に管理できるようにファイル名を取得するSPを作成することもできます。

私は非常に長い間Oracleを使用していませんが、このlinkがキックスタートに役立つことを願っています。

+0

すべての例/リンク – Gauls

+0

Watsデータベース?また、あなたはJavaのインターフェイスを持っている必要がありますか? – JSS

+0

OracleデータベースのJavaインターフェイスはgr8ですが、別の方法も知っているわけではありません。 – Gauls

-1

データベースにクエリを実行し、すべてのデータをRESULTSETに取得し、次のコードを使用してルート要素を開始することができます。

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
Document document = documentBuilder.newDocument(); 

Element Element_root = document.createElement("rootElement"); 

その後あなたは

Element Element_childnode  = document.createElement("childnode");//create child node     
Element_childnode.appendChild(document.createTextNode("Enter the value of text here"));//add data to child node 
Element_root.appendChild(Element_childnode);//close the child node 

を使用して、子要素のように多くの人がこれを使用しFAILなし最後に

をルートを閉じて開かれたノードを閉じることを忘れないでくださいに追加することができます根を閉じてください。

終わり
document.appendChild(Element_causelist); 

あなたはXSDが良い結果を提供するオンライン検証をグーグル.....それに対してそれをあなたのXMLを検証している場合 .... http://tools.decisionsoft.com/schemaValidate/

注:TIME !!!それはデータが巨大であるときに時間がかかります... しかし、これは一つと、それを行うのが最も簡単な方法だと思う....データを考慮して、私は1つは、少ないトラフィック....このことができます

希望....グッドラックガウル....

+0

あなたは-ve投票を説明することができますか?これまで誰がこれを行ったのですか...答えで何が間違っているのか説明できます –

+1

私はdownvoteをしませんでしたが、レコードの大部分は非常にメモリを消費します。 –

0

ヒキガエルでは、あなたは右の表をクリックすると、XMLへのエクスポート]をクリックします。商用版ではすべてのテーブルをエクスポートできますが、わかりません

0

DBがOracleの場合は、SQLXクエリでJDBCを使用するだけで済みます。これにより、クライアント側で独自に行うよりも、サーバー上のXMLフラグメントとして直接結果セットが生成されます。 SQLXは8.1.7からAuroraプロジェクトとして、また9i以降はXMLDBとして標準で提供されています。

ここは簡単な例です。 XMLELEMENTに加えて

select XMLelement ("Process", 
        XMLelement("number", p.p_ka_id, '.', p_id), 
        XMLElement("name", p.p_name), 
        XMLElement ("processGroup", pg.pg_name)) 
from 
    PMP_processes p, 
    PMP_process_groups pg 
where 
    condition ; 

、SQLXはあなたにどんな結果ツリーを可能にXMLattribute、XMLFOREST、XMLaggregate ...を持っています。

0

もう1つの可能性(JDBCドライバですべてのdbを操作する)は、Apache Cocoonを使用することです。実際には2つの方法があります:XSP(単独で、およびESQLで)。両方の技術が素早く開発できます。

XSP単独の例XSPをJSPのように少し考えてみてください。例えばDB。

<?xml version="1.0"?> 
<xsp:page language="java" xmlns:xsp="http://apache.org/xsp" 
    xmlns:esql="http://apache.org/cocoon/SQL/v2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://apache.org/cocoon/SQL/v2 xsd/esql.xsd" 
    space="strip"> 

    <xsp:structure> 
    <xsp:include>java.sql.Connection</xsp:include> 
    <xsp:include>java.sql.DriverManager</xsp:include> 
    <xsp:include>java.sql.PreparedStatement</xsp:include> 
    <xsp:include>java.sql.SQLException</xsp:include> 
    <xsp:include>java.sql.ResultSet</xsp:include> 
    </xsp:structure> 

    <xsp:logic><![CDATA[ 

    private static final String connectionString = 
      "jdbc:mysql://localhost/mandarin?user=mandarin&password=mandarin" ; 

    private Connection conn = null ; 
    private PreparedStatement pstmt = null ; 

    private void openDatabase() { 
    try { 
     DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
      conn = DriverManager.getConnection (connectionString); 
     pstmt = conn.prepareStatement( 
       "select "      + 
       " count(*) as cardinality " + 
       " from "      + 
       " unihan50 u "   + 
       " where "      + 
       " unicode_id >= ? and " + 
       " unicode_id <= ? ") ; 
     } catch (SQLException e) { 
     e.printStackTrace(); 
     } 
    } 

    private int getRangeCardinality (int lowerBound, int upperBound) { 
     int cnt = 0 ; 
     try { 
      cnt = 2 ; 
      pstmt.setInt (1, lowerBound) ; 
      pstmt.setInt (2, upperBound) ; 
      boolean sts = pstmt.execute() ; 
      if (sts) { 
       ResultSet rs = pstmt.getResultSet(); 
      if (rs != null && rs.next()) { 
       cnt = rs.getInt ("cardinality") ; 
      } 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return cnt ; 
     } 

     private void closeDatabase() { 
      try { 
       pstmt.close() ; 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
      try { 
       conn.close() ; 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
    ]]> 
    </xsp:logic> 

    <ranges> 
     <xsp:logic><![CDATA[ 
       openDatabase() ; 

      for (int i = 0; i < 16 ; i++) { 
        int from = i * 0x1000 ; 
        int to = i * 0x1000 + 0x0fff ; 
      ]]> 
      <range> 
       <from>0x<xsp:expr>Integer.toString(from, 16)</xsp:expr></from> 
       <to>0x<xsp:expr>Integer.toString(to, 16)</xsp:expr></to> 
       <count><xsp:expr>getRangeCardinality (from, to)</xsp:expr></count> 
      </range> 
      } 
      closeDatabase() ; 
      </xsp:logic> 
     </ranges> 
    </xsp:page> 

XSPはさらにESQLと相まって簡単です。ここでDOM、XMLをしませ書き込むためのサンプル

<?xml version="1.0" encoding="UTF-8"?> 
<xsp:page language="java" xmlns:xsp="http://apache.org/xsp" 
    xmlns:esql="http://apache.org/cocoon/SQL/v2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsp-request="http://apache.org/xsp/request/2.0" 
    xsi:schemaLocation="http://apache.org/cocoon/SQL/v2 xsd/esql.xsd" 
    space="strip"> 

    <keys> 
    <esql:connection> 
    <esql:pool>mandarinMySQL</esql:pool> 
    <esql:execute-query> 
     <esql:query><![CDATA[ 
     select 
      unicode_id, 
      kMandarin, 
      ... 
     from 
      unihan50_unified 
     where 
      add_strokes = 0 
     order by 
      radical 
     ]]> 
     </esql:query> 
     <esql:results> 
     <esql:row-results><key><esql:get-columns /></key></esql:row-results> 
     </esql:results> 
     </esql:execute-query> 
    </esql:connection> 
</keys> 
</xsp:page> 
0

使用StAXのです。すべての再ため

-2

感謝私はスレッドを使用することに基づいて解決策を得ることができたし、複数の選択を1つの複雑なSQL結合(私はSQLの複雑なものを嫌う)の代わりに使用する人生は単純でなければなりません:)私はあまりにも多くの時間私は各選択ステートメントごとに新しいスレッドを使用しています。

probabaly春を使用してPOJOの任意のより良い解決策はまた、取るよ時間的に ガウル

+0

複数の選択肢があなたを遅らせる可能性があります。結合を解く - それがあなたのデータベースを持っている理由です! –

-1
public class someclassname{ 

public static String somemethodname(){   

    String sql; 
    sql="SELECT * from yourdatabase.yourtable "; 
    return sql; 
} 
public static String anothermethodname(){   
    /*this is another method which is used to excute another query simultaneously*/ 
    String sql; 
    sql="SELECT * from youdatabase.yourtable2"; 
    return sql; 
} 

private static void saveasxml(String sql,String targetFile) throws SQLException, XMLStreamException, IOException{  
    int i,count; 
    FileOutputStream fos; 

    try{ 

    Class.forName("com.mysql.jdbc.Driver"); 

    Connection con=DriverManager.getConnection("jdbc:mysql://yourdomain:yourport/yourdatabase","username","password"); 
    Statement stmt=con.createStatement(); 

    ResultSet rs=stmt.executeQuery(sql); 
    ResultSetMetaData rsmd=rs.getMetaData(); 

    count=rsmd.getColumnCount(); 
    XMLOutputFactory outputFactory = XMLOutputFactory.newFactory(); 
    fos=new FileOutputStream(targetFile); 
    XMLStreamWriter writer = outputFactory.createXMLStreamWriter(fos); 
     writer.writeStartDocument(); 
     writer.writeCharacters("\n"); 
     writer.writeStartElement("maintag line"); 
     writer.writeCharacters("\n"); 

    while(rs.next()){ 
      writer.writeCharacters("\t"); 
      writer.writeStartElement("foreveyrow-tagline"); 
      writer.writeCharacters("\n\t"); 
     for(i=1;i<count+1;i++){ 

      writer.writeCharacters("\t"); 
      writer.writeStartElement("Field"+i); 
      writer.writeCharacters(rs.getString(i)); 
      writer.writeEndElement(); 
      writer.writeCharacters("\n\t");  
     } 
      writer.writeEndElement(); 
      writer.writeCharacters("\n"); 
    } 
     writer.writeEndElement(); 
     writer.writeEndDocument(); 
     writer.close(); 
}catch(ClassNotFoundException | SQLException e){  
    } 
} 
public static void main(String args[]) throws Exception{ 
    saveasxml(somemethodname(), " file location-path"); 
    saveasxml(anothermethodname(), "file location path"); 
} 

}

+3

コードで説明している解決策は何ですか?いくつかの説明を含めてください。ありがとう! –

+0

このコードは、結果セットとしてデータベース(mysql)からデータを取得し、STAXライターを使用して結果セットをxmlファイルに変換する方法を説明しています......データベースからデータを取得し、複数のxmlファイルをクエリに –

関連する問題