public PointUpdaterDaemon() {
    con = null;
    stm = null;
    //	rs               = null;
    //	affectedRow      = 0;
    recordCounter = 0;
    statCreate = false;
    statMonthly = false;
    statQuarterly = false;
    statGrandprize = false;
    workingDir = System.getProperty("user.dir");
    monthlyFile = PropertiesLoader.getProperty("POINT_MONTHLY_FILE");
    quarterlyFile = PropertiesLoader.getProperty("POINT_QUARTERLY_FILE");
    grandprizeFile = PropertiesLoader.getProperty("POINT_GRANDPRIZE_FILE");
    recSeparator = '|';
    escChar = '\'';
    headerLine = 1;

    // Establishing a Single DB Connection.
    // This Connection is usable across app life-cycle.
    try {
      db_object = new MysqlConnect();
      con = db_object.getConnection();
    } catch (ClassNotFoundException nfe) {
      nfe.printStackTrace();
    } catch (SQLException sqle) {
      sqle.printStackTrace();
    }
  }
  @SuppressWarnings("unused")
  public static void main(String[] args) throws IOException, SQLException {
    // Evaluation Timer
    System.out.println("[MAIN PROCESS] Started: " + getCurrentTimeStamp());
    LogLoader.setInfo(
        PointUpdaterDaemon.class.getSimpleName(),
        "[MAIN PROCESS] Started: " + getCurrentTimeStamp());
    long startTime = System.currentTimeMillis();

    pointDaemon = new PointUpdaterDaemon();

    // Choose these options:

    // (A) Fresh start with ALL INSERT. Separated Tables.
    // 3 Separated Point Tables would be Created, then Inserted.

    // Creating Table must be DONE BEFORE running INSERTION Threads.
    pointDaemon.createTruncateSeparatedPointTables();

    // 1. With Single, Blocking Process (No Thread Programming)
    if (false) {
      pointDaemon.insertMonthlyPoint();
      pointDaemon.insertQuarterlyPoint();
      pointDaemon.insertGrandprizePoint();
    }
    // 2. With Concurrent, Multi-Thread Programming
    else if (true) {
      Runnable monthlyRunnable =
          new Runnable() {
            public void run() {
              System.out.println(
                  "[THREAD] ["
                      + getCurrentTimeStamp()
                      + "]"
                      + "Thread 1: Inserting Monthly Point Records..");
              LogLoader.setInfo(
                  PointUpdaterDaemon.class.getSimpleName(),
                  "[THREAD 1 START] [" + getCurrentTimeStamp() + "]");
              try {
                pointDaemon.insertMonthlyPoint();
              } catch (IOException | SQLException e) {
                e.printStackTrace();
              }
              System.out.println(
                  "[THREAD] [" + getCurrentTimeStamp() + "]" + "Thread 1: Finished.");
              LogLoader.setInfo(
                  PointUpdaterDaemon.class.getSimpleName(),
                  "[THREAD 2 STOP] [" + getCurrentTimeStamp() + "]");
            }
          };
      Runnable quarterlyRunnable =
          new Runnable() {
            public void run() {
              System.out.println(
                  "[THREAD] ["
                      + getCurrentTimeStamp()
                      + "]"
                      + "Thread 2: Inserting Quarterly Point Records..");
              LogLoader.setInfo(
                  PointUpdaterDaemon.class.getSimpleName(),
                  "[THREAD 2 START] [" + getCurrentTimeStamp() + "]");
              try {
                pointDaemon.insertQuarterlyPoint();
              } catch (IOException | SQLException e) {
                e.printStackTrace();
              }
              System.out.println(
                  "[THREAD] [" + getCurrentTimeStamp() + "]" + "Thread 2: Finished.");
              LogLoader.setInfo(
                  PointUpdaterDaemon.class.getSimpleName(),
                  "[THREAD 2 STOP] [" + getCurrentTimeStamp() + "]");
            }
          };
      Runnable grandprizeRunnable =
          new Runnable() {
            public void run() {
              System.out.println(
                  "["
                      + getCurrentTimeStamp()
                      + "]"
                      + "Thread 3: Inserting Grand Prize Point Records..");
              LogLoader.setInfo(
                  PointUpdaterDaemon.class.getSimpleName(),
                  "[THREAD 3 START] [" + getCurrentTimeStamp() + "]");
              try {
                pointDaemon.insertGrandprizePoint();
              } catch (IOException | SQLException e) {
                e.printStackTrace();
              }
              System.out.println("[" + getCurrentTimeStamp() + "]" + "Thread 3: Finished.");
              LogLoader.setInfo(
                  PointUpdaterDaemon.class.getSimpleName(),
                  "[THREAD 3 STOP] [" + getCurrentTimeStamp() + "]");
            }
          };

      Thread monthlyThread = new Thread(monthlyRunnable);
      Thread quarterlyThread = new Thread(quarterlyRunnable);
      Thread grandprizeThread = new Thread(grandprizeRunnable);

      // Setting Daemon Mode if Necessary

      // monthlyThread.setDaemon(true);
      // quarterlyThread.setDaemon(true);
      // grandprizeThread.setDaemon(true);

      monthlyThread.start();
      quarterlyThread.start();
      grandprizeThread.start();

      // Processing Time, If using No Thread Concept
      long endTime = System.currentTimeMillis();
      long duration = endTime - startTime;
      System.out.println("[MAIN PROCESS] Duration: " + duration + " ms.");
      LogLoader.setInfo(
          PointUpdaterDaemon.class.getSimpleName(),
          "[MAIN PROCESS] Finished: " + getCurrentTimeStamp() + "(" + duration + " ms).");
    }

    // (B) Fresh start with ONE INSERT, TWO UPDATES. One united point Table.
    // 1 Point Table would be Created, then Inserted once, Updated twice.
    /*
    pointDaemon.createTruncateUnitedPointTable();
    pointDaemon.insertMonthlyPoint();
    pointDaemon.updateQuarterlyPoint();
    pointDaemon.updateGrandprizePoint();
    */
    // (C) Current start with existing records
    /*
    pointDaemon.updateMonthlyPoint();
    pointDaemon.updateQuarterlyPoint();
    pointDaemon.updateGrandprizePoint();
    */

    // Final Result Report
    if (statCreate) System.out.println("[RESULT]: TABLES CREATED.");
    if (statMonthly) System.out.println("[RESULT]: MONTHLY POINTS INSERTED.");
    if (statQuarterly) System.out.println("[RESULT]: QUARTERLY POINTS INSERTED.");
    if (statGrandprize) System.out.println("[RESULT]: GRAND PRIZE POINTS INSERTED.");
  }