2016-08-04 63 views
0

我知道,这个问题已经问过了。但我仍然没有明白为什么我的准备声明不会影响执行时间。在java中编写语句对性能的影响

Connection conn=null; 
Statement stmt=null; 

public Database(){ 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     conn = DriverManager 
       .getConnection("jdbc:sqlite:***"); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

public void insert(String [] data){ 
    try { 
     String query = "INSERT INTO tableName " 
       + "VALUES ('"+data[0]+"',"+"'"+data[1]+"',"+Double.parseDouble(data[2])+","+ 
       Double.parseDouble(data[3])+","+Double.parseDouble(data[4])+","+ 
       Double.parseDouble(data[5])+")"; 

     stmt =conn.createStatement(); 
     stmt.executeUpdate(query); 

    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

首先,这个方法我试过来执行插入表情,然后我学到准备语句上的执行时间的好效果。然后,我用以下方法尝试了计划:

Connection conn=null; 
PreparedStatement preStmt=null; 
private String queryTemplate = "insert into tableName values(?,?,?,?,?,?)"; 

public Database(){ 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     conn = DriverManager 
       .getConnection("jdbc:sqlite:***"); 
     preStmt = conn.prepareStatement(queryTemplate); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

public void insert(String [] data){ 
    try { 
     preStmt.setString(1,data[0]); 
     preStmt.setString(2,data[1]); 
     preStmt.setDouble(3,Double.parseDouble(data[2])); 
     preStmt.setDouble(4,Double.parseDouble(data[3])); 
     preStmt.setDouble(5,Double.parseDouble(data[4])); 
     preStmt.setDouble(6,Double.parseDouble(data[5])); 

     preStmt.addBatch(); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

public void ExecuteBatch() 
{ 
    try { 
     preStmt.executeBatch(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

我使用的SQLite数据库btw.I使用则ExecuteBatch和addBatch方法来减少执行时间。但它仍然是一样的,甚至比第一个更糟糕。有人可以给我解释一下吗?谢谢:)

+1

[如果要执行Statement对象**多次**,它通常降低了使用PreparedStatement对象,而不是执行时间(http://docs.oracle.com/javase /tutorial/jdbc/basics/prepared.html)。 –

回答

1

尝试在交易模式,而不是自动切换提交模式下一个:

conn = DriverManager.getConnection("jdbc:sqlite:***"); 
// Set auto-commit to false which enable the transactional mode 
conn.setAutoCommit(false); 
... 
// Explicitly commit statements to apply changes 
conn.commit(); 

事实上,自动提交模式,将在专用的事务执行每个插入请求,并自动提交它具有很大的成本就I/O而言,当你有很多要执行的请求时,因此性能会填满数据库的事务日志。

更多细节here

+0

它完美的工作,当我按下加载到数据库按钮,程序说你的文件被加载。非常感谢 :) –

0

所以使用预准备语句的主要优势来自预编译发生。如果多次使用该语句,这可以节省大量时间。如果它只被使用一次,代码执行期间不会节省太多时间。
使用准备语句的其他优点是防止sql注入和易于添加Objects