-1

所以我正在 Net Beans 中开发一个 MySQL/Java 程序,用于帮助我们理解执行时间等。

所以我创建了 java 程序,以便用户可以在 6 个表中的每一个中输入 x 数量的元组。所以我们必须输入超过 125000 个元组的数据。好吧,我只遇到了 60000 个元组的问题,当程序执行时,插入 60000 个元组大约需要 30 分钟。

不用说最终我将不得不在一个表中输入 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
);
4

2 回答 2

1

使用 aPreparedStatement而不是Statement. 它“预编译”SQL,以更快的速度连续调用它。

于 2012-07-26T18:45:08.907 回答
1

在没有仔细查看您的代码的情况下,这里有一些您可能想要查看的内容:

  1. PreparedStatement可能会有所帮助,因为不必为每个请求都编译该语句。
  2. 批量执行语句。查看 PreparedStatement 上的 addBatch() 方法。一旦添加了 1000 个批次,就可以使用 executeBatch() 来执行它们。如果您在连接上结合设置“ rewriteBatchedStatements ”执行此操作,那么 MySQL 驱动程序可能能够进行一些优化。
  3. 引入几个“插入”工作人员,每个工作人员负责插入给定大小的批次。如果您只使用一个连接,则需要一次插入一个。如果您使用多个连接(通过多个线程),您很可能会看到速度的提高。
于 2012-07-26T18:54:08.053 回答