-1

そこで、実行時間などを理解するのに役立つクラス用の MySQL/Java プログラムを Net Beans で開発しています。

そこで、ユーザーが x 個のタプルを 6 つのテーブルのそれぞれに入力できるように、Java プログラムを作成しました。そのため、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

あなたのコードをあまり詳しく調べていなくても、あなたが見たいと思うかもしれないいくつかの事柄がここにあります:

  1. PreparedStatementステートメントはリクエストごとにコンパイルする必要がないため、おそらく少し役立つでしょう。
  2. ステートメントをバッチで実行します。PreparedStatementのaddBatch()メソッドを見てください。たとえば、1000個のバッチを追加したら、executeBatch()を使用してそれらを実行できます。これを接続の設定' rewriteBatchedStatements 'と組み合わせて行うと、MySQLドライバーがいくつかの最適化を実行できる可能性があります。
  3. いくつかの「挿入」ワーカーを紹介します。各ワーカーは、特定のサイズのバッチを挿入する役割を果たします。単一の接続のみを使用している場合は、一度に1つの挿入を行う必要があります。(複数のスレッドを介して)複数の接続を使用している場合は、速度が向上する可能性があります。
于 2012-07-26T18:54:08.053 に答える
1

PreparedStatementの代わりに を使用しStatementます。SQL を「プリコンパイル」して、SQL への連続呼び出しを高速化します。

于 2012-07-26T18:45:08.907 に答える