數據庫的性能能問題

畢業設計要在數據庫中插入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();
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章