java - UpdateString 未由 SQLite JDBC 驱动程序实现

标签 java sqlite jdbc

我有一张 table PERSON超过 500 万行,我需要更新字段 NICKNAME基于领域的每一个NAME在同一张 table 内。

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

我正在使用在 https://bitbucket.org/xerial/sqlite-jdbc/downloads 下载的 sqlite-jdbc-3.8.11.2.jar .

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

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

但这会花很长时间,我知道更新 ResultSet会更快。那么我有什么选择可以最快的方式更新表格呢?还有其他可用的驱动程序吗?我应该离开 Java 吗?

更新

我能够使用以下语法找到快速解决方案。 CASE 之间的 block 和 END是我在执行 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)

最佳答案

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

我可以想到三个选项:

  1. 正如您在问题中所述,您可以选择此人的姓名和 ID,然后通过其 ID 更新此人。这些更新可以批量完成(使用 PreparedStatement.addBatch() )以提高性能 ( tutorial )。
  2. 在纯 SQL 中实现方法 myparsingfunction,这样查询就可以变成 UPDATE PERSONS SET NICKNAME = some_function(NAME)
  3. 创建一个用户定义的函数(使用 org.sqlite.Function ),用 Java 实现,并在 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 会更快,但这可能不是一个可行的解决方案)。您应该对每种解决方案进行基准测试,以找到适合您的解决方案。

关于java - UpdateString 未由 SQLite JDBC 驱动程序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32933384/

相关文章:

扩展 String(或类似)的 Java 类

python - Django - 从 JSON 文件填充数据库表

android - 如何在android上根据时间戳删除sqlite数据库中的条目

java - JDBC 远程 MySQL 连接

multithreading - Spring @Async 和 AbstractRoutingDataSource

java - 在 Java 中弃用包的最清晰方法是什么?

java - Spring 3 和 Google App 引擎的问题

Java投票系统

c# - 如何在没有 ADO 包装器的情况下在 C# 中使用 SQLite

java - 最新的 Hibernate 和 Derby : Unable to make JDBC Connection