Skip to Main Content

Java Database Connectivity (JDBC)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to speed up the aggregate process as fast as possible?

acepsutJan 7 2014 — edited Oct 15 2014

I save stock data in a mySql table @ frame 1 minute, so that 1 row is 1 minute data. Data saved are as follow


http://s18.postimg.org/4uj8e0mfd/Z514.png


Since market session ranges from 0900 up to 1730, I have 511 rows for each day.

I need to compress (aggregate) these intra-day data into 1 daily data (one row only), so that

daily open -> first intra-day open value (0900 open value)

daily high -> highest value for all 511 intra-day value rows

daily low -> lowest value for all 511 intra-day value rows

daily close -> latest intra-day traded value (1730 close value)

daily volume -> sum of all 511 intra-day volume value rows

I need to perform this compression as fast as possibile since I would plot hundreds of daily data.

Any help really appreciated: here is my full code

import importexportdata.DataItem;
import java
.sql.Connection;
import java
.sql.PreparedStatement;
import java
.sql.ResultSet;
import java
.sql.SQLException;
import java
.sql.Statement;
import java
.text.ParseException;
import java
.text.SimpleDateFormat;
import java
.util.ArrayList;
import java
.util.Calendar;
import java
.util.LinkedList;
import java
.util.logging.Level;
import java
.util.logging.Logger;

public class AggregateByDay {  

String dbTabName 
= "";  
String sTimeFrom
= "";
String sTimeTo
= "";  
short iTotBar
= 0;
boolean volumeFieldIsOnTable
;
LinkedList
<DataItem> data_aggregated = null;
Dividends dividendsHdl
= null;

Connection con
= null;  
ResultSet rs 
= null;
Statement st 
= null;
PreparedStatement selectReview
=null;  
Statement stmtPrepareInitRow
=null;
ResultSet rsSelectPrepareInitRow 
= null;

public AggregateByDay(String dbTabName, String timeFrom, String timeTo, short iTotBar, boolean volumeFieldIsOnTable, Dividends dividendsHdl){  
  this
.dbTabName  = dbTabName;
  this
.sTimeFrom  = timeFrom;
  this
.sTimeTo  = timeTo;  
  this
.iTotBar  = iTotBar;  
  this
.volumeFieldIsOnTable  = volumeFieldIsOnTable;
  this
.dividendsHdl  = dividendsHdl;
}

private void connectToDb
(){
  try
{
  Class
.forName("com.mysql.jdbc.Driver");
  
//String connectionUrl = "jdbc:mysql://localhost:3306/borsaitalia?" +
  
//   "user="+_dBUserName+"&password="+_dBPassword;

  String connectionUrl
= DbConnect.getConnectionUrl();

  con
= DriverManager.getConnection(connectionUrl);
  
} //end try Class.forName("com.mysql.jdbc.Driver");  
  catch
(SQLException ex) {
  System
.out.println("Error "+ ex.getMessage ()+" "+ex.toString());
  
} catch (ClassNotFoundException cE) {
  System
.out.println("Class Not Found Exception: "+ cE.toString());
  
}  
}

private String getLastFirstDayLower
(String _date, String _DbTabName){
  String lastDate
= "";

  try
{  
  st
= con.createStatement();
  
if ( "".equals(_date)) {
  
//Get the most recent date
  rs
= st.executeQuery("SELECT date FROM "+_DbTabName+" ORDER BY date DESC, time DESC LIMIT 1;");
  
}
  
else{
  rs
= st.executeQuery("SELECT date FROM "+_DbTabName+" WHERE date < "+_date+" ORDER BY date DESC, time DESC LIMIT 1;");
  
}
  
while (rs.next()){
  lastDate 
= rs.getString("date");  
  
}

  
if (st != null) {
  st
.close();
  st
= null;
  
}
  
} //end try Class.forName("com.mysql.jdbc.Driver");  
  catch
(SQLException ex) {
  System
.out.println("Error "+ ex.getMessage ()+" "+ex.toString());
  
}
  
return lastDate;  
}

private String getLastFirstDayLowerNext
(String _date, String _DbTabName){
  String lastDate
= "";

  try
{  
  
if (rsSelectPrepareInitRow.next()){
  lastDate 
= rsSelectPrepareInitRow.getString("date");  
  
}
  
//System.out.println("lastDate "+lastDate);
  
} //end try Class.forName("com.mysql.jdbc.Driver");  
  catch
(SQLException ex) {
  System
.out.println("Error "+ ex.getMessage ()+" "+ex.toString());
  
}
  
return lastDate;  
}

private LinkedList
<DataItem> getDbOneMinuteDataForDay(String _date, String _sTimeFrom, String _sTimeTo){

  String sDate
= "", sTime = "";
  
double dOpen = 0d,  dHigh = 0d, dLow = 0d, dClose = 0d;
  int iVolume
= 0;
  float dividendsValue
= 0;

  LinkedList
<DataItem> init_one_minute_data = new LinkedList<>();
  try
{
  selectReview
.setString(1, _date);
  selectReview
.setString(2, _sTimeFrom);
  selectReview
.setString(3, _sTimeTo);
  rs
= selectReview.executeQuery();

  
while (rs.next()){

  sDate 
= rs.getString("date");
  sTime 
= rs.getString("time");
  dOpen 
= rs.getDouble("open");
  dHigh 
= rs.getDouble("high");
  dLow 
= rs.getDouble("low");
  dClose 
= rs.getDouble("close");

  
if (volumeFieldIsOnTable)
  iVolume
= rs.getInt("volume");
  
else
  iVolume
= 0;

  DataItem dataItem
= new DataItem();

  java
.util.Date date = null;
  try
{
  date
= new SimpleDateFormat("yyyyMMdd HHmm").parse(sDate+" "+sTime);
  
} catch (ParseException ex) {
  Logger
.getLogger(AggregateByDay.class.getName()).log(Level.SEVERE, null, ex);
  
}
  dataItem
.setDate(date);

  
if (dividendsHdl != null) {
  dividendsValue
= dividendsHdl.getTotalDividendsFromDate(sDate);
  
}
  dataItem
.setOpen(dOpen-dividendsValue);
  dataItem
.setHigh(dHigh-dividendsValue);
  dataItem
.setLow(dLow-dividendsValue);
  dataItem
.setClose(dClose-dividendsValue);
  dataItem
.setVolume(iVolume);

  init_one_minute_data
.add(dataItem);  
  
}
  
} //end try Class.forName("com.mysql.jdbc.Driver");  
  catch
(SQLException ex) {
  System
.out.println("Error "+ ex.getMessage ()+" "+ex.toString());
  
}/* catch (ClassNotFoundException cE) {
  System
.out.println("Class Not Found Exception: "+ cE.toString());
  
}*/

  
return init_one_minute_data;
}

public void getAggregateValue(ArrayList<DataItem> externalDataList) {

  String sDate
;
  short count_min
;
  Calendar calendarCurrWeek
= null;
  int i
, n;
  boolean 
end;
  LinkedList
<DataItem>  one_minute_data = null;
  LinkedList
<DataItem>  data_one_day_aggregated = new LinkedList<>();
  java
.util.Date dDateTimeRgp = null;
  int iVolumeRaggruppato
= 0;
  
double  dOpenRgp = 0d,  dHighRgp = 0d, dLowRgp = 0d, dCloseRgp = 0d;

  data_aggregated
= new LinkedList<>();

  connectToDb
();
  sDate
= getLastFirstDayLower("", dbTabName);
  
if ( "".equals(sDate) ) {
  
return;
  
}

  
end = false;

  try
{
  
//selectPrepareInitRow = con.prepareStatement("SELECT date FROM "+DbTabName+" WHERE date < ? ORDER BY date DESC, time DESC LIMIT 1;");  

  stmtPrepareInitRow
= con.createStatement();
  rsSelectPrepareInitRow
= stmtPrepareInitRow.executeQuery("SELECT DISTINCT date FROM "+dbTabName+" WHERE date < "+sDate+" ORDER BY date DESC, time DESC;");
  
} catch (SQLException ex) {
  Logger
.getLogger(AggregateByDay.class.getName()).log(Level.SEVERE, null, ex);
  
}

  
if (volumeFieldIsOnTable) {
  try
{

  selectReview
= con.prepareStatement("SELECT open, high, low, close, volume, date, time FROM "+dbTabName+" WHERE date = ? AND time >= ? AND time <= ? ORDER BY time ASC;");
  
} catch (SQLException ex) {
  Logger
.getLogger(AggregateByDay.class.getName()).log(Level.SEVERE, null, ex
This post has been answered by unknown-7404 on Jan 8 2014
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 6 2014
Added on Jan 7 2014
8 comments
2,165 views