2012-07-26 85 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