/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.measurement.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.rhq.core.util.jdbc.JDBCUtil; import org.rhq.enterprise.server.measurement.MeasurementStorageException; public class DataInserter { private static final long INTERVAL = 5 * 60 * 1000L; // five minute average private static final long HOUR = 1000L * 60 * 60; private static Connection c; // Inserts one hour of time public static void insert(long time, int numSchedules) throws SQLException { c.setAutoCommit(false); int count = 0; long start = System.currentTimeMillis(); try { List<Integer> scheduleIds = new ArrayList<Integer>(); Statement s = c.createStatement(); try { ResultSet rs = s.executeQuery("SELECT id FROM RHQ_MEASUREMENT_SCHED"); try { while (rs.next() && (numSchedules > 0)) { scheduleIds.add(rs.getInt(1)); numSchedules--; } } finally { rs.close(); } } finally { s.close(); } System.out.println("INSERTING for " + scheduleIds.size() + " schedules starting at " + new Date(time)); for (long i = 0; i < HOUR; i += INTERVAL) { long ts = (long) (time + i + (Math.random() * 1000D)); PreparedStatement ps = null; try { String table = MeasurementDataManagerUtility.getTable(ts); String insertSql = "INSERT INTO " + table + "(schedule_id,time_stamp,value) VALUES(?,?,?)"; ps = c.prepareStatement(insertSql); for (int scheduleId : scheduleIds) { ps.setInt(1, scheduleId); ps.setLong(2, ts); ps.setInt(3, (int) (Math.random() * 100)); ps.addBatch(); } int[] res = ps.executeBatch(); for (int updates : res) { if (updates != 1) { throw new MeasurementStorageException("Unexpected batch update size [" + updates + "]"); } count++; } c.commit(); System.out.print("."); System.out.flush(); JDBCUtil.safeClose(ps); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtil.safeClose(ps); } } System.out.println(" " + count + " rows added in " + (System.currentTimeMillis() - start) + "ms starting in " + MeasurementDataManagerUtility.getTable(time)); } catch (Exception e) { e.printStackTrace(); } finally { } } public static int sum(int[] arr) { int count = 0; for (int ar : arr) { count += ar; } return count; } public static void main(String[] args) throws ClassNotFoundException, SQLException { String driver = System.getProperty("driver", "org.postgresql.Driver"); String url = System.getProperty("url", "jdbc:postgresql://127.0.0.1:5432"); String username = System.getProperty("username", "jon"); String password = System.getProperty("password", "jon"); int numSchedules = Integer.parseInt(System.getProperty("numSchedules", "5")); System.out.println("driver=" + driver); System.out.println("url=" + url); System.out.println("username=" + username); System.out.println("password=" + password); System.out.println("numSchedules=" + numSchedules); System.out.println("(to override these, set system properties of the same names as above)"); Class.forName(driver); c = DriverManager.getConnection(url, username, password); try { long time = System.currentTimeMillis() - (7L * 24 * HOUR); time = time - (time % HOUR); for (int i = 0; i < (7 * 24); i++) { long bucket = time + (i * HOUR); insert(bucket, numSchedules); } } finally { JDBCUtil.safeClose(c, null, null); } } }