1

私のアプリケーションでは、20000行を超える結果セットがあります。配列リストに保存したい。私はこれに以下のコードを使用しています。

Class.forName("com.mysql.jdbc.Driver") ;
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Data",     "root", "root") ;
  Statement stmt = conn.createStatement() ;
  String query = "select * from temp ;" ;
  ResultSet rs = stmt.executeQuery(query) ;

  ArrayList<String> varList = new ArrayList<String>();
  while(rs.next()){
  varList.add(rs.getString(1));
  }

クエリを使用すると、結果セットからデータをフェッチするのに時間がかかり、テーブルに20000を超えるエントリが含まれている場合は遅すぎます。これはどのように解決できますか?どんな提案も非常に素晴らしいでしょう。

4

4 に答える 4

1

データベース行に関しては、20000 は大きな数字ではありません。

問題はArrayListにある可能性があります。

デフォルトでは、ArrayList にはデフォルトのサイズがあります。たとえば 100 など、いくつあるかはわかりません。挿入されたアイテムがその数を超えると、Java はサイズがいくつかの値だけインクリメントされた新しい arraylist を作成します。確かにいくつですか、100とも言います。次に、前のリストの内容が新しいリストにコピーされます。あなたの場合、これらはすべて文字列操作です。これで、遅い理由がわかります。以下を実行すると、問題が解決する場合があります。

int rsSize = getResultSetSize(connection,query);  //return the size of the result set first
ArrayList<String> varList = new ArrayList<String>(rsSize);
于 2013-01-08T13:43:29.557 に答える
1

あなたが間違った問題を解決しようとしているのではないかと強く疑っています。これらの 20,000 行を処理する場合は、データベースで実行し、操作の結果のみをクライアントに返す必要があります (これにより、スペースが大幅に削減されることが期待されます)。

データで何をしようとしているのかを正確に教えていただければ、その方法についてより具体的な提案を提供できる可能性があります。

(または、クライアントで 20,000 行すべてが本当に必要な場合はデータベースを完全にスキップして、それらをクライアントに格納するだけにすることもできます。)

于 2013-01-08T12:29:34.087 に答える
0

あなたの問題はデータベースではなく、リストへのアイテムの連結である可能性が高いと思われます。Java により多くのメモリを提供する必要があります。それが list.add の場合、結果のサイズの配列を割り当ててから、インデックスを使用してデータを配列に挿入することで、速度を上げることができます。

于 2013-01-08T12:33:39.213 に答える
0

フェッチした後、これらの 20000 レコードで何をしたいですか? PL-SQLコードを使用してDBレベルで実行できるかどうかを確認してください。多くのプログラマーは、PL-SQL の機能を使用していません。他の高水準プログラミング言語でできることは何でも、これらのほとんどのことは PL-SQL でも行うことができます。

于 2013-01-08T12:40:17.083 に答える