簡體   English   中英

使該程序更有效?

[英]Make this program more efficient?

只是好奇是否有人有任何想法可以使該程序更簡單。 它將記錄從數據庫讀取到ArrayList中,並允許用戶按狀態搜索記錄。 它處理大約16000毫秒內的100萬條記錄的數據庫。

import java.sql.*;
import java.util.*;
public class ShowEmployeeDB
{
public static void main(String args[])     
{
   ArrayList <String> Recs = new ArrayList <String>();
   String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";
   String connectionURL = "jdbc:odbc:CitizensDB";  
   Connection con = null;    
   Statement  stmt = null;     
   String sqlStatement = "SELECT * FROM Citizens";
   ResultSet rs = null;       
   int r = 0;
   Scanner scan = new Scanner(System.in);
   String search = null;
   long starttime = System.currentTimeMillis();
   try 
   {   
       Class.forName(driverName).newInstance();  
       con = DriverManager.getConnection(connectionURL);
       stmt = con.createStatement();    
       rs = stmt.executeQuery(sqlStatement);  

       String ID = null;
       String Age = null;
       String State = null;
       String Gender = null;
       String Status = null;
       String record = null;
       while (rs.next())
       {
           for (int k = 1; k <= 1; ++k)
           {
               ID = rs.getString(k) + " ";
               for (int j = 2; j <= 2; ++j)
                   Age = rs.getString(j) + " ";
               for (int i = 3; i <= 3; ++i)
                   State = rs.getString(i).toUpperCase() + " ";
               for (int h = 4; h <= 4; ++h)
                   Gender = rs.getString(h) + " ";
               for (int g = 5; g <= 5; ++g)
                   Status = rs.getString(g) + " ";
           }//for
           record = ID + Age + State + Gender + Status;
           Recs.add(record);
           ++r;
       }//while
       rs.close();
       stmt.close();
       con.close();
   } catch (Exception ex) { ex.printStackTrace();  }

   String endtime = System.currentTimeMillis() - starttime + "ms";
   System.out.println(endtime);

   System.out.print("Enter A Search State: ");
   search = scan.nextLine().toUpperCase();

   Iterator<String> iter = Recs.iterator();
    while(iter.hasNext())
    {
        String s = iter.next();
        if (s.contains(search))
        {
            System.out.println(s);
        }
    }//while
} // main
} // ShowEmployeeBD

任何建議將不勝感激。 先感謝您!

如果不經常搜索,我建議在運行查詢之前接受搜索字符串輸入,以便搜索結果直接來自數據庫。 在這種情況下,您不必重復所有的100萬條記錄。

直接在數據庫上執行搜索,而不是獲取所有記錄並通過Java代碼搜索。 同樣,如果搜索是在多列上,則根據ID在單個位置的DB中准備一個元數據,然后該元數據可以進一步用於獲取與查詢匹配的所需結果。

  • 將邏輯與技術隔離。 在這種復雜的情況下,很難進行單元測試或任何優化。
  • 當只詢問一個值時,為什么需要循環。
  • 使用StringBuilder代替String串聯。
  • 使用try-with或將close語句放在finally子句中。
  • 不要初始化不需要的變量(r)。
  • 用於每個語句。
  • 查詢數據庫,而不是結果集。
  • 調整數據庫。
  • 如果僅搜索狀態,則僅過濾那些狀態,因此構建一個對象並比較狀態而不是包含的字符串。
  • 在將字符串存儲在列表中之前先比較狀態。
  • 調整您的列表,因為它會隨着1Mio記錄而不斷增長。
  • 使用哈希集而不是arraylist。
  • 針對界面進行開發。

更好的程序可能如下所示:

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class ShowEmployeeDB {

  private static final String DRIVERNAME = "sun.jdbc.odbc.JdbcOdbcDriver";
  private static final String CONNECTIONURL = "jdbc:odbc:CitizensDB";

  private static final String SELECT_CITIZENS = "SELECT * FROM Citizens";

  static {
    try {
      DriverManager.registerDriver((Driver) Class.forName(DRIVERNAME).newInstance());
    } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
      e.printStackTrace();
    }
  }

  public static void main(final String args[]) {
    System.out.print("Enter A Search State: ");
    searchRecords();
  }

  private static void searchRecords() {
    try(Scanner scan = new Scanner(System.in);) {
      final String state = scan.nextLine();

      final long starttime = System.currentTimeMillis();
      final Set<Record> records = searchRecordsByState(state);
      System.out.println(System.currentTimeMillis() - starttime + "ms");

      for(final Record r : records) {
         System.out.println(r);
      }

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

  private static Set<Record> searchRecordsByState(final String stateToFilter) {
    final Set<Record> records = new HashSet<>();
    try(Connection con = DriverManager.getConnection(CONNECTIONURL);
        PreparedStatement stmt = con.prepareStatement(SELECT_CITIZENS);
        ResultSet rs = stmt.executeQuery(); ) {

      while(rs.next()) {
        final String state = rs.getString(3);
        if(state.equalsIgnoreCase(stateToFilter)) {
          final Record r = new Record(rs.getString(1), rs.getString(2), state, rs.getString(4), rs.getString(5));
          records.add(r);
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    return records;
  }
}

class Record {
  String id, age, state, gender, status;

  public Record(String id, String age, String state, String gender, String status) {
    this.id = id;
    this.age = age;
    this.state = state;
    this.gender = gender;
    this.status = status;
  }

  public String getState() {
    return state;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append(id).append(' ')
      .append(age).append(' ')
      .append(state).append(' ')
      .append(gender).append(' ')
      .append(status);
    return sb.toString();
  }
}

這未經測試,因為我沒有手工記錄一百萬個條目的數據庫。

但是最好的辦法是查詢數據庫並僅捕獲您需要的那些條目。 因此,在您的陳述中使用WHERE- WHERE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM