2015-10-04 51 views
4

我有一个表PERSON超过5百万行,我需要根据字段NAME在同一个表内的字段NICKNAME更新字段NICKNAMEUpdateString没有通过SQLite JDBC驱动程序

ResultSet rs = statement.executeQuery("select NAME from PERSON"); 
while(rs.next()) 
{ 
    // some parsing function like: 
    // Nickname = myparsingfunction(rs.getString("NAME")); 
    rs.updateString("NICKNAME", Nickname); 
    rs.updateRow(); 
} 

但我得到这个错误:

not implemented by SQLite JDBC driver

我使用SQLite-JDBC-3.8.11.2.jar在https://bitbucket.org/xerial/sqlite-jdbc/downloads下载。

我知道我可以使用下面的SQL查询:

statement.executeUpdate("update PERSONS set NICKNAME = Nickname where ID = Id"); 

但是,这将需要永远和我的理解更新ResultSet会更快。那么我需要什么选择以最快的方式更新表格呢?还有其他的驱动程序吗我应该移出Java吗?

UPDATE

我能找到使用以下语法快速的解决方案。 CASEEND之间的块是我在执行SQL查询之前构建的连接字符串,因此我可以一次发送所有更新。

update PERSON 
set  NICKNAME= case ID       
         when 173567 then 'blabla' 
         when 173568 then 'bleble' 
         ... 
         when 173569 then 'blublu' 
        end 
where ID in (173567, 173568, 173569) 
+0

也许看看使用批处理:http://stackoverflow.com/questions/14264953/how-is-jdbc-batch-update-helpful – tim

+1

昵称解析可能在SQL而不是Java?然后更新声明会快很多。 – RealSkeptic

+1

你为什么说“那将永远”?你认为'updateRow()'的确如此(在支持它的JDBC驱动上)?两者都会向服务器发送“UPDATE”SQL语句。准备一个'UPDATE'语句并对它们进行批处理,对于性能来说实际上会更好*,因为'updateRow()'不是*批处理。 – Andreas

回答

3

正如你所遇到的,SQLite的JDBC驱动程序目前不支持的updateString操作。这可以在the source code这个驱动程序中看到。

我能想到的三个选项:

  1. 正如你在你的问题中所述,您可以选择的人的姓名和ID,然后更新其ID的人。这些更新可以批量完成(使用PreparedStatement.addBatch())以提高性能(tutorial)。
  2. 在纯SQL中实现方法myparsingfunction,以便查询可能变成UPDATE PERSONS SET NICKNAME = some_function(NAME)
  3. 创建用Java实现的用户定义函数(使用org.sqlite.Function),并在SQL中调用它。例如,来自this answer采取:

    Function.create(db.getConnection(), "getNickName", new Function() { 
        protected void xFunc() throws SQLException { 
         String name = value_text(0); 
         String nickName = ...; // implement myparsingfunction here 
         result(nickName); 
        } 
    }); 
    

    ,并使用它是这样的:UPDATE PERSONS SET NICKNAME = getNickName(NAME);

的SQLite does not support stored procedures以便选择是从表中的。

我不确定哪些选项可以提供最佳性能(当然,使用纯SQL会更快,但这可能不是一个可行的解决方案)。您应该对每个解决方案进行基准测试以找到适合您的解决方案