畢業設計要在數據庫中插入200,000條數據。使用兩種方法分別插入數據,結構的性能對比讓我非常的吃驚。前者插入200,,000條數據需要多月2個小時,後者僅僅需要2分鐘。
前者的核心代碼是:
for(index=0;index<(int)(sumnum*danxuan);index++){
//難度
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
sql="insert into danxuan (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here!danxuan"+index);
ps.executeUpdate();
System.out.println("aaa");
}
這樣在每一次插入數據都會起動一次磁盤,效率可想而知。
後者核心代碼爲:
sql="insert into danxuan (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
int index=0;
conn.setAutoCommit(false);
for(index=0;index<(int)(sumnum*danxuan);index++){
//難度
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here!danxuan"+index);
System.out.println("aaa");
ps.addBatch();
if((index+1)%1000==0){
ps.executeBatch();
conn.commit();
ps.clearBatch();
System.out.println("commit one");
}
}
每次插入的數據都是1000條,效率大大的提高了。
附:
package lightblue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
//import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//import java.sql.Statement;
public class ga {
/*
* 試卷數據庫參數
* sumnum:試題總數
* danxuan:單選題所佔的比例
* duoxuan:多選題所佔的比例
* tiankong:填空題所佔的比例
* jianda:簡答題所佔的比例
* wenda:問答題所佔的比例
* jisuan:計算題所佔的比例
*/
int sumnum=200000;
double danxuan=0.35;
double duoxuan=0.35;
double tiankong=0.15;
double jianda=0.05;
double wenda=0.05;
double jisuan=0.05;
/*
* 數據庫連接參數
* addr:數據庫地址
* usr:用戶名
* pwd:密碼
*/
Connection conn=null;
String addr="jdbc:mysql://localhost:3306/zujuandb";
String usr="root";
String pwd="123456";
String addr2="jdbc:mysql://localhost:3306/schemata";
String addr3="jdbc:mysql://localhost:3306/test";
/*
* addr數據庫地址
* usr用戶名
* pwd密碼
*/
public Connection getConnectionByJDBC(String addr,String usr,String pwd){
try {
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
System.out.println("裝載驅動包出現異常!請查正!");
e.printStackTrace();
}
try{
conn=DriverManager.getConnection(addr, usr, pwd);
}catch(SQLException e) {
System.out.println("鏈接數據庫發生異常!");
e.printStackTrace();
}
return conn;
}
public void createdb(){
String sql="";
try{
//ResultSet rs=null;
//Statement stmt=null;
//如果上面檢測到了數據庫的存在,則隨機生成數據存入數據庫中
try{
getConnectionByJDBC(addr,usr,pwd);
}
catch(Exception e){
System.out.println("sss");
}
//清空元數據
sql="delete from danxuan";
Statement st=conn.createStatement();
st.executeUpdate(sql);
sql="delete from duoxuan";
st.executeUpdate(sql);
sql="delete from tiankong";
st.executeUpdate(sql);
sql="delete from jianda";
st.executeUpdate(sql);
sql="delete from wenda";
st.executeUpdate(sql);
sql="delete from jisuan";
st.executeUpdate(sql);
//單選題
sql="insert into danxuan (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
int index=0;
conn.setAutoCommit(false);
for(index=0;index<(int)(sumnum*danxuan);index++){
//難度
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here!danxuan"+index);
System.out.println("aaa");
ps.addBatch();
if((index+1)%1000==0){
ps.executeBatch();
conn.commit();
ps.clearBatch();
System.out.println("commit one");
}
}
//多選題
sql="insert into duoxuan (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
ps=conn.prepareStatement(sql);
for(index=0;index<(int)(sumnum*duoxuan);index++){
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here !duoxuan"+index);
ps.addBatch();
if((index+1)%1000==0){
ps.executeBatch();
conn.commit();
ps.clearBatch();
System.out.println("commit one");
}
}
//填空題
sql="insert into tiankong (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
ps=conn.prepareStatement(sql);
for(index=0;index<(int)(sumnum*tiankong);index++){
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here tiankong"+index);
ps.addBatch();
if((index+1)%1000==0){
ps.executeBatch();
conn.commit();
ps.clearBatch();
System.out.println("commit one");
}
}
//簡答題
sql="insert into wenda (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
ps=conn.prepareStatement(sql);
for(index=0;index<(int)(sumnum*wenda);index++){
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here tiankong"+index);
ps.addBatch();
if((index+1)%1000==0){
ps.executeBatch();
conn.commit();
ps.clearBatch();
System.out.println("commit one");
}
}
//問答題
sql="insert into jianda (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
ps=conn.prepareStatement(sql);
for(index=0;index<(int)(sumnum*jianda);index++){
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here wenda"+index);
ps.addBatch();
if((index+1)%1000==0){
ps.executeBatch();
conn.commit();
ps.clearBatch();
System.out.println("commit one");
}
}
//計算題
sql="insert into jisuan (id,nandu,zhishidian,zhangjie)value(?,?,?,?)";
ps=conn.prepareStatement(sql);
for(index=0;index<(int)(sumnum*jisuan);index++){
int nandu=(int)((Math.random()*100)+1);//1---100
int zhishidian=(int)(Math.random()*100+1);//1---100
int zhangjie=(int)(Math.random()*10+1);//1---10
ps.setInt(1, index);
ps.setInt(2, nandu);
ps.setInt(3, zhishidian);
ps.setInt(4, zhangjie);
System.out.println("I am here jisuan"+index);
ps.addBatch();
if((index+1)%1000==0){
ps.executeBatch();
conn.commit();
ps.clearBatch();
System.out.println("commit one");
}
}
}
catch(Exception e){
System.out.println("error");
}
}
public void test(){
String sql="select * from student";
getConnectionByJDBC(addr3,usr,pwd);
try{
sql="insert into student(id,name)value(?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1 , 12);
ps.setString(2, "dd");
ps.executeUpdate();
}catch (SQLException e){
System.out.println(e.getMessage());
e.printStackTrace();
}finally{
try{
if(conn!=null)
conn.close();
} catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
public static void main(String[]args){
ga g=new ga();
g.createdb();
//g.test();
}
}