2012-07-26 89 views
-1

所以我在Net Beans中開發了一個MySQL/Java程序,幫助我們理解執行時間等。MySQL/JAVA插入速度

因此,我創建了Java程序,以便用戶可以將x數量的元組輸入到6個表中的每個表中。所以我們必須輸入125000個元組。那麼我只能解決60000個元組的問題,而當程序執行時,只需要30分鐘就可以插入60000個元組。

不用說,最終我不得不輸入125000個元組到表中,我需要知道如何使插入更快?有任何想法嗎?

謝謝

布蘭登

編輯:

代碼

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package program2; 


import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.Statement; 
import java.util.Random; 


public class Program2 { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

      // Variables 
      int takesnum=0; 
      int instructornum=0; 
      int coursenum = 0; 
      int studentnum = 0; 
      int count = 0; 
      int departmentnum =0; 
      int counts= 0; 
      int minimum=0; 
      int x=0; 
      int teachesnum=0; 
      // Variables 

      //Connection to the database 
      Connection conn = null; 
      String url = "jdbc:mysql://localhost:3306/"; 
      String dbName = "university2"; 
      String Driver = "com.mysql.jdbc.Driver"; 
      // Change the userName & password to what ever your credentials are. 
      String userName = "root"; 
      String password = "121089bn"; 
      //Connection to the database 

     try { 

      InputStreamReader istream = new InputStreamReader(System.in); 
      BufferedReader MyReader = new BufferedReader(istream); 

      Class.forName(Driver).newInstance(); 
      conn = DriverManager.getConnection(url+dbName,userName,password); 
      System.out.println("Connected"); 

      // Ask the user how many tuples in department table. 
      System.out.println("How many tuples would you like to create in Department Table?"); 

      // Takes in as string the number then parse it to an int. 
      String dept = MyReader.readLine(); 
      departmentnum = Integer.parseInt(dept); 

// ****************** Department Table ******************// 
      while (count < departmentnum) 
      { 
       Statement st = conn.createStatement(); 
       // Counts keeps the counter so the Primary Key is unique. 
       st.executeUpdate("Insert into department (dept_name, building, budget) values ('Dept "+counts+"', 'Voigt', '1200')"); 
       count++; 
       counts++; 
      } 

// ****************** Student Table ******************//     
      count=0; 
      counts=0; 

      System.out.println("How many tuples would you like to create in Student Table?"); 
      String student = MyReader.readLine(); 
      studentnum = Integer.parseInt(student); 

      while (count < studentnum) 
      { 
       int z=0; 
       int credit=128; 
       Random ran = new Random(); 
       int range = departmentnum - minimum; 
       x = ran.nextInt(range) + minimum; 

       Random random = new Random(); 
       int totcred = credit - minimum; 
       z = random.nextInt(totcred) + minimum; 

       Statement st = conn.createStatement(); 
       st.executeUpdate("Insert into student (id, name, dept_name,tot_cred) select '"+counts+"', 'Student "+counts+"', dept_name, '"+z+"' from department where dept_name='Dept "+x+"'"); 
       count++; 
       counts++; 
      } 

// ****************** Course Table ******************//     
      x=0; 
      count=0; 
      counts=0; 

      System.out.println("How many tuples would you like to create in Course Table?"); 
      String course = MyReader.readLine(); 
      coursenum = Integer.parseInt(course); 

      while (count < coursenum) 
      { 
       Random ran = new Random(); 
       int range = departmentnum - minimum; 
       x = ran.nextInt(range) + minimum; 
       int credit=5; 
       int z=0; 

       Random random = new Random(); 
       int totcred = credit - minimum; 
       z = random.nextInt(totcred) + minimum; 

       Statement st = conn.createStatement(); 
       st.executeUpdate("Insert into course (course_id, title, dept_name,credits) select '"+counts+"', 'Computer Science "+counts+"', dept_name, '"+z+"' from department where dept_name='Dept "+x+"'"); 
       count++; 
       counts++; 
      } 

// ****************** Instructor Table ******************//     
      x=0; 
      count=0; 
      counts=0; 

      System.out.println("How many tuples would you like to create in Instructor Table?"); 
      String instructor = MyReader.readLine(); 
      instructornum = Integer.parseInt(instructor); 

      while (count < instructornum) 
      { 
       Random ran = new Random(); 
       int range = departmentnum - minimum; 
       x = ran.nextInt(range) + minimum; 

       Statement st = conn.createStatement(); 
       st.executeUpdate("Insert into instructor (id, name, dept_name,salary) select '"+counts+"', 'Instructor "+counts+"', dept_name, '10000' from department where dept_name='Dept "+x+"'"); 
       count++; 
       counts++; 

      } 

// ****************** Teaches Table ******************//      
      x=0; 
      count=0; 
      counts=0; 

      System.out.println("How many tuples would you like to create in Teaches Table?"); 
      String teaches = MyReader.readLine(); 
      teachesnum = Integer.parseInt(teaches); 

      while (count < teachesnum) 
      { 
       Random ran = new Random(); 
       int range = instructornum - minimum; 
       x = ran.nextInt(range) + minimum; 

       Random random = new Random(); 
       int courserange = coursenum - minimum; 
       int y = random.nextInt(courserange) + minimum; 

       int g = 100; 
       Random r = new Random(); 
       int f = g - minimum; 
       int h = r.nextInt(f) + minimum; 

       int l = 100; 
       Random random1 = new Random(); 
       int j = l - minimum; 
       int k = random1.nextInt(j) + minimum; 


       Statement st = conn.createStatement(); 
       st.executeUpdate("Insert into teaches (id, course_id, semester, year) select id, course_id, 'Spr "+h+"', '20"+k+"' from course, instructor where instructor.id='"+x+"' and course.course_id='"+y+"'"); 
       count++; 
       counts++; 
      } 

// ****************** Takes Table ******************//      
      x=0; 
      count=0; 
      counts=0; 

      System.out.println("How many tuples would you like to create in Takes Table?"); 
      String takes = MyReader.readLine(); 
      takesnum = Integer.parseInt(takes); 

      while (count < takesnum) 
      { 
       Random ran = new Random(); 
       int range = studentnum - minimum; 
       x = ran.nextInt(range) + minimum; 

       Random random = new Random(); 
       int courserange = coursenum - minimum; 
       int y = random.nextInt(courserange) + minimum; 

       int g = 100; 
       Random r = new Random(); 
       int f = g - minimum; 
       int h = r.nextInt(f) + minimum; 

       int l = 100; 
       Random random1 = new Random(); 
       int j = l - minimum; 
       int k = random1.nextInt(j) + minimum; 

       Statement st = conn.createStatement(); 
       st.executeUpdate("Insert into takes (id, course_id, semester, year, grade) select id, course_id, 'Spr "+h+"', '20"+k+"', 'B' from course, student where student.id='"+x+"' and course.course_id='"+y+"'"); 
       count++; 
       counts++; 
      } 

      conn.close(); 
     } 

      catch (Exception e) { 
      System.err.println("Error"); 
      System.err.println(e.getMessage()); 
      } 
} 
} 

drop database university2; 
create database university2; 

use university2; 

create table department 
(dept_name  varchar(20) primary key, 
building  varchar(15), 
budget    numeric(12,2) 
); 

create table student 
(ID    int, 
name   varchar(20) not null, 
dept_name  varchar(20), 
tot_cred  numeric(10,0), 
primary key (ID), 
foreign key (dept_name) references department(dept_name) 

); 

create table course 
(course_id  int, 
title   varchar(50), 
dept_name  varchar(15), 
credits  numeric(2,0), 
primary key (course_id), 
foreign key (dept_name) references department(dept_name) 
); 



create table instructor 
(ID   int, 
name   varchar(20) not null, 
dept_name  varchar(20), 
salary   numeric(8,2), 
primary key (ID), 
foreign key (dept_name) references department(dept_name) 
); 

create table teaches 
(ID   int, 
course_id  int, 
semester  varchar(6), 
year   numeric(4,0), 
primary key (ID, course_id, semester, year), 
foreign key (course_id) references course(course_id) 
    on delete cascade, 
foreign key (ID) references instructor(ID) 
    on delete cascade 
); 


create table takes 
(ID   int, 
course_id  int, 
semester  varchar(6), 
year   numeric(4,0), 
grade    varchar(2), 
primary key (ID, course_id, semester, year), 
foreign key (course_id) references course(course_id) 
    on delete cascade, 
foreign key (ID) references student(ID) 
    on delete cascade 
); 
+0

出於許多(許多)原​​因,您可能會遇到插入速度慢的問題。我們需要看到一些代碼以及你的mySQL數據庫是如何設置的。 – 2012-07-26 18:34:34

+0

您可以嘗試禁用autommit以避免每個插入單獨提交。請參閱http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Connection.html#setAutoCommit(boolean) – Michael 2012-07-26 18:57:23

回答

1

沒有上過你的代碼太仔細看,這裏就是你可能想看看幾件事情:

  1. PreparedStatement可能會有點幫助,因爲語句沒有被編譯每一個請求。
  2. 批量執行語句。查看PreparedStatement上的addBatch()方法。一旦添加了1000個批次,就可以使用executeBatch()來執行它們。如果你在連接上設置'rewriteBatchedStatements',那麼MySQL驅動程序可能會做一些優化。
  3. 引入幾個「插入」工人,每個工人負責插入給定尺寸的批次。如果您只使用單個連接,則需要一次完成一次插入。如果你使用多個連接(通過多線程),你很可能會看到速度的增加。
+0

是的,我現在正在查看PreparedStatement。我看到的大多數示例都爲每個單列輸入數據。從語句傳遞到PreparedStatement的任何鏈接或示例 – 2012-07-26 18:57:55

1

使用PreparedStatement代替n Statement。它「預編譯」了SQL,以更快的速度對其進行連續調用。

+0

那麼,您將如何對所擁有的內容進行更改。也許只是在部門部門。 – 2012-07-26 18:48:41

+0

你已經有一個例子在這裏:http://stackoverflow.com/questions/11633443/creating-multiple-tuples-in-multiple-tables。 – SJuan76 2012-07-26 18:57:19

+0

順便說一句:提供一些反饋和標記爲被接受的正確答案... – SJuan76 2012-07-26 18:57:40