/**
* Copyright 2010 Wallace Wadge
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
Copyright 2009 Wallace Wadge
This file is part of BoneCP.
BoneCP is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
BoneCP 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 BoneCP. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jolbox.benchmark;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import javax.sql.DataSource;
/** For unit testing only
* @author wwadge
*
*/
@SuppressWarnings("all")
public class ThreadTesterUtil implements Callable<Long>{
/** A dummy query for HSQLDB. */
public static final String TEST_QUERY = "SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS";
private CountDownLatch startSignal;
private CountDownLatch doneSignal;
private Random rand = new Random();
private int workDelay;
private DataSource ds;
private boolean doPreparedStatement;
static AtomicInteger c = new AtomicInteger(0);
public ThreadTesterUtil(CountDownLatch startSignal, CountDownLatch doneSignal, DataSource ds, int workDelay, boolean doPreparedStatement) {
this.ds=ds;
this.startSignal = startSignal;
this.doneSignal = doneSignal;
this.workDelay = workDelay;
this.doPreparedStatement = doPreparedStatement;
}
/** {@inheritDoc}
* @see java.util.concurrent.Callable#call()
*/
public Long call() throws Exception {
long time = 0;
try {
this.startSignal.await();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
Connection con = null;
boolean success = false;
boolean error;
long start = System.nanoTime();
do{
try {
con = this.ds.getConnection();
// System.out.println(con);
time = time + (System.nanoTime() - start);
success = true;
} catch (Throwable e1) {
//e1.printStackTrace();
success = false;
}
} while (!success);
try{
if (this.doPreparedStatement){
start = System.nanoTime();
Statement s = con.prepareStatement(TEST_QUERY);
s.close();
time = time + (System.nanoTime() - start);
}
if (this.workDelay > 0){
Thread.sleep(this.workDelay);
}
start = System.nanoTime();
con.close();
time = time + (System.nanoTime() - start);
} catch (SQLException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
} catch (Throwable t){
t.printStackTrace();
}
this.doneSignal.countDown();
return time;
}
}