/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.poweroff;
import java.io.File;
import java.io.FileDescriptor;
import java.io.RandomAccessFile;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/**
* This test shows the raw file access performance using various file modes.
* It also tests databases.
*/
public class TestWrite {
private TestWrite() {
// utility class
}
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String... args) throws Exception {
testFile("rw", false);
testFile("rwd", false);
testFile("rws", false);
testFile("rw", true);
testFile("rwd", true);
testFile("rws", true);
testDatabase("org.h2.Driver", "jdbc:h2:test", "sa", "");
testDatabase("org.hsqldb.jdbcDriver", "jdbc:hsqldb:test4", "sa", "");
testDatabase("org.apache.derby.jdbc.EmbeddedDriver", "jdbc:derby:test;create=true", "sa", "");
testDatabase("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/test", "sa", "sa");
testDatabase("org.postgresql.Driver", "jdbc:postgresql:test", "sa", "sa");
}
private static void testFile(String mode, boolean flush) throws Exception {
System.out.println("Testing RandomAccessFile(.., \"" + mode + "\")...");
if (flush) {
System.out.println(" with FileDescriptor.sync()");
}
RandomAccessFile file = new RandomAccessFile("test.txt", mode);
file.setLength(0);
FileDescriptor fd = file.getFD();
long start = System.currentTimeMillis();
byte[] data = { 0 };
file.write(data);
int i = 0;
if (flush) {
for (;; i++) {
file.seek(0);
file.write(data);
fd.sync();
if ((i & 15) == 0) {
long time = System.currentTimeMillis() - start;
if (time > 5000) {
break;
}
}
}
} else {
for (;; i++) {
file.seek(0);
file.write(data);
if ((i & 1023) == 0) {
long time = System.currentTimeMillis() - start;
if (time > 5000) {
break;
}
}
}
}
long time = System.currentTimeMillis() - start;
System.out.println("Time: " + time);
System.out.println("Operations: " + i);
System.out.println("Operations/second: " + (i * 1000 / time));
System.out.println();
file.close();
new File("test.txt").delete();
}
private static void testDatabase(String driver, String url, String user, String password) throws Exception {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("Testing Database, URL=" + url);
Statement stat = conn.createStatement();
try {
stat.execute("DROP TABLE TEST");
} catch (SQLException e) {
// ignore
}
stat.execute("CREATE TABLE TEST(ID INT)");
PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST VALUES(?)");
long start = System.currentTimeMillis();
int i = 0;
for (;; i++) {
prep.setInt(1, i);
// autocommit is on by default, so this commits as well
prep.execute();
if ((i & 15) == 0) {
long time = System.currentTimeMillis() - start;
if (time > 5000) {
break;
}
}
}
long time = System.currentTimeMillis() - start;
System.out.println("Time: " + time);
System.out.println("Operations: " + i);
System.out.println("Operations/second: " + (i * 1000 / time));
System.out.println();
stat.execute("DROP TABLE TEST");
conn.close();
}
}