2016-09-28 57 views
-1

我想从一个ngrams(HashMap)中提取数据库中的所有值。我的问题是如何更好地实现提取功能。这段代码的执行速度很慢,因为如果表中存在HashMap,那么java程序必须检查每次。如果存在,则必须从表格中选择前一个频率,并将其添加到新的频率中。在单个查询中插入,选择和更新 - SQL

为了使这个过程更好,我可以更改三个函数(更新,插入,检查)吗?

这里是与数据库

public boolean insert(String w1, String w2, String w3, String w4, Integer f, float rf) throws SQLException{ 
    ... 
    String sql = "INSERT INTO fourgrams " + 
      "VALUES("+w1 + "," + w2 + "," + w3 + "," + w4 + "," + f + ',' + rf + ")" 
    ... 
} 
public boolean update(String w1, String w2, String w3, String w4, Integer f) throws SQLException{ 
    ... 
    String sql = "UPDATE fourgrams " + 
      "SET frequency =" + f + " WHERE gram1=" + w1 + 
      " AND gram2=" + w2 + " AND gram3=" + w3 + 
      " AND gram3=" + w3; 
    ... 
} 
public int check(String w1, String w2, String w3, String w4) throws SQLException{ 
    ... 
    String sql = "SELECT frequency FROM fourgrams " + 
      "WHERE gram1=" + w1 + 
      " AND gram2=" + w2 + " AND gram3=" + w3 + 
      " AND gram3=" + w3; 

    ... 
} 

连接的代码,这里是代码,我有问题

public void extract(Database myDB) throws SQLException{ 
    Iterator it = ngrams.entrySet().iterator(); 
    while(it.hasNext()){ 
     ... 
     int fr=myDB.check(...); 
     if (fr == -1) 
     { 
     myDB.insert(...); 
     }else{ 
     myDB.update(...); 
     } 
    } 
    ... 
} 

回答

0

1)插入。在你的循环中建立一个形式的单一插入

INSERT INTO fourgrams VALUES 
(w1..), 
(w1..), 
(w1..).. 

2)更新。从该表

UPDATE fourgrams 
JOIN temp ON fourgrams.gram1= temp.gram1 AND ... 
SET frequency = temp.frequency 

创建临时表以同样的方式和更新如果数据集太大,你不妨将它们传送到服务器计算机为CSV和LOAD INFILE http://dev.mysql.com/doc/refman/5.7/en/load-data.html

+0

谢谢您的回答。我想LOAD INFILE就是我需要的。 –