本文试图证明多线程的效率,在有10000条数据的表中做大量查询,但结果证明多线程没有提高运行速度。
package c1;
import java.sql.*;
import java.util.Calendar;
import java.util.Properties;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//MultiThread mt=new MultiThread();
SingleThread.run();
MultiThread.initconn();
// String[] str={};
for(int i=0;i<10;i++){
//mt[i]=new MultiThread();
//str[i]="s";
//System.out.println(str[i]);
new Thread(new MultiThread()).start();
//mt[i].start();
}
}
}
class SingleThread{
public static void run(){
// TODO Auto-generated method stub
//Test t=new Test();
// select * from dba_tablespaces
try{
DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver());
Properties conProps = new Properties();
conProps.put("user", "sys");
conProps.put("password", "test");
conProps.put("defaultRowPrefetch", "15");
conProps.put("internal_logon", "sysdba");
// Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test","system","test");
Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test",conProps);
PreparedStatement pstmt;
ResultSet rset;
//boolean tableexist;
pstmt = conn.prepareStatement("select count(*) from user_tables where table_name='PERSONS'");
//pstmt = conn.prepareStatement("select count(*) from dba_tablespaces");
pstmt.execute();//
rset = pstmt.executeQuery();
while (rset.next()){
//System.out.println (rset.getString(1)); // Print col 1
if(rset.getInt(1)==1){
pstmt = conn.prepareStatement("DROP TABLE Persons");
pstmt.executeQuery();
}
}
pstmt = conn.prepareStatement("CREATE TABLE Persons(Id_P int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255))");
pstmt.execute();
int i;
int j=10000;
for(i=0;i pstmt = conn.prepareStatement("INSERT INTO Persons VALUES ("+i+", 'Gates"+i+"', 'Bill', 'Xuanwumen 10', 'Beijing')");
pstmt.executeUpdate();
pstmt.close();//we need to close pstmt, otherwise there might be exceptions like java.sql.SQLException: ORA-01000: maximum open cursors exceeded
}
System.out.println(i+" records were inserted into SingleThread;");
Calendar calendar = Calendar.getInstance();
int oday=calendar.get(Calendar.DAY_OF_MONTH);
int ohour=calendar.get(Calendar.HOUR_OF_DAY);
int omin=calendar.get(Calendar.MINUTE);
int osec=calendar.get(Calendar.SECOND);
for(i=0;i pstmt = conn.prepareStatement("select * from persons where lastname='Gates"+i+"'");
rset = pstmt.executeQuery();
//while (rset.next()){
// System.out.println (i+"selecting records "+rset.getString(1)); // Print col 1
//}
pstmt.close();//we need to close pstmt, otherwise there might be exceptions like java.sql.SQLException: ORA-01000: maximum open cursors exceeded
}
Calendar ccalendar = Calendar.getInstance();
int cday=ccalendar.get(Calendar.DAY_OF_MONTH);
int chour=ccalendar.get(Calendar.HOUR_OF_DAY);
int cmin=ccalendar.get(Calendar.MINUTE);
int csec=ccalendar.get(Calendar.SECOND);
if(csec-osec<0){
csec=csec+60;
cmin=cmin-1;
}
if(cmin-omin<0){
cmin=cmin+60;
chour=chour-1;
}
if(chour-ohour<0){
chour=chour+24;
cday=cday-1;
}
System.out.println((cday-oday)+" day "+(chour-ohour)+" hour " + (cmin-omin)+" min "+(csec-osec)+" sec");
//conn.close();
System.out.println("SingleThread methord finished");
}
catch(SQLException e){e.printStackTrace();}
}
}
class MultiThread implements Runnable {
public static Connection conn;
public static int i=0;
public static int j=10000;
public static int cur=0;
public int startpoint=0;
public int endpoint=0;
public static int id=0;
public int threadid=id++;
public static Calendar calendar;
public static Calendar ccalendar;
MultiThread(){
//System.out.println("in MultiThread "+threadid);
}
public void run(){
//System.out.println("in MultiThread run "+threadid);
if(cur==0){
calendar = Calendar.getInstance();
}
while(cur synchronized(this){
if(cur+100 startpoint=cur;
cur=cur+100;
endpoint=cur;
}else{
startpoint=cur;
cur=cur+100;
endpoint=j;
}
}
//System.out.println("startpoint "+startpoint+"endpoint " + endpoint +"cur "+cur);
try{
PreparedStatement pstmt;
ResultSet rset;
for(;startpoint pstmt = conn.prepareStatement("select * from persons where lastname='Gates"+startpoint+"'");
rset = pstmt.executeQuery();
//while (rset.next()){
// System.out.println ("selecting records "+rset.getString(1)); // Print col 1
//}
pstmt.close();//we need to close pstmt, otherwise there might be exceptions like java.sql.SQLException: ORA-01000: maximum open cursors exceeded
}
}
catch(SQLException e){e.printStackTrace();}
if(cur>=j){//cur>j means all the threads has finished;
ccalendar = Calendar.getInstance();
int oday=calendar.get(Calendar.DAY_OF_MONTH);
int ohour=calendar.get(Calendar.HOUR_OF_DAY);
int omin=calendar.get(Calendar.MINUTE);
int osec=calendar.get(Calendar.SECOND);
int cday=ccalendar.get(Calendar.DAY_OF_MONTH);
int chour=ccalendar.get(Calendar.HOUR_OF_DAY);
int cmin=ccalendar.get(Calendar.MINUTE);
int csec=ccalendar.get(Calendar.SECOND);
if(csec-osec<0){
csec=csec+60;
cmin=cmin-1;
}
if(cmin-omin<0){
cmin=cmin+60;
chour=chour-1;
}
if(chour-ohour<0){
chour=chour+24;
cday=cday-1;
}
System.out.println((cday-oday)+" day "+(chour-ohour)+" hour " + (cmin-omin)+" min "+(csec-osec)+" sec");
System.out.println("MultiThread methord finished");
}
}
//System.out.println("in MultiThread runend "+threadid);
}
public static void initconn(){
try{
DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver());
Properties conProps = new Properties();
conProps.put("user", "sys");
conProps.put("password", "test");
conProps.put("defaultRowPrefetch", "15");
conProps.put("internal_logon", "sysdba");
// Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test","system","test");
conn= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test",conProps);
PreparedStatement pstmt;
ResultSet rset;
//boolean tableexist;
pstmt = conn.prepareStatement("select count(*) from user_tables where table_name='PERSONS'");
//pstmt = conn.prepareStatement("select count(*) from dba_tablespaces");
pstmt.execute();//
rset = pstmt.executeQuery();
while (rset.next()){
//System.out.println (rset.getString(1)); // Print col 1
if(rset.getInt(1)==1){
pstmt = conn.prepareStatement("DROP TABLE Persons");
pstmt.executeQuery();
}
}
pstmt = conn.prepareStatement("CREATE TABLE Persons(Id_P int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255))");
pstmt.execute();
for(i=0;i pstmt = conn.prepareStatement("INSERT INTO Persons VALUES ("+i+", 'Gates"+i+"', 'Bill', 'Xuanwumen 10', 'Beijing')");
pstmt.executeUpdate();
pstmt.close();//we need to close pstmt, otherwise there might be exceptions like java.sql.SQLException: ORA-01000: maximum open cursors exceeded
}
System.out.println(i+" records were inserted in MultiThread;");
}
catch(SQLException e){e.printStackTrace();}
}
}
/*
10000 records were inserted into SingleThread;
0 day 0 hour 0 min 57 sec
SingleThread methord finished
10000 records were inserted in MultiThread;
0 day 0 hour 0 min 57 sec
MultiThread methord finished
*/
阅读(1844) | 评论(0) | 转发(0) |