MariaDB jdbc 连接在批量插入期间失败

Posted

技术标签:

【中文标题】MariaDB jdbc 连接在批量插入期间失败【英文标题】:MariaDB jdbc connection fails during bulk inserts 【发布时间】:2013-09-12 16:19:48 【问题描述】:

我在 MariaDB 中有一个具有此规范的表:

CREATE TABLE `pages_txt` (
    `id` INT(10) UNSIGNED NOT NULL,
    `title` TEXT NOT NULL,
    `txt` MEDIUMTEXT NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

我想在这个表中插入大约 200 万条记录。 但是,在插入大约 160K 记录后,连接断开,我收到此异常:

at Main.main(Main.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.mariadb.jdbc.internal.common.QueryException: Could not send query: Last packet not finished
    at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:954)
    at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:278)
    ... 21 more
Caused by: java.io.IOException: Last packet not finished
    at org.mariadb.jdbc.internal.common.packet.PacketOutputStream.startPacket(PacketOutputStream.java:38)
    at org.mariadb.jdbc.internal.common.packet.commands.StreamedQueryPacket.send(StreamedQueryPacket.java:76)
    at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:952)
    ... 22 more
java.sql.SQLNonTransientConnectionException: Could not send query: Last packet not finished
    at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:136)
    at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106)
    at org.mariadb.jdbc.MySQLStatement.executeQueryEpilog(MySQLStatement.java:262)
    at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:285)
    at org.mariadb.jdbc.MySQLStatement.executeUpdate(MySQLStatement.java:313)
    at org.mariadb.jdbc.MySQLPreparedStatement.executeUpdate(MySQLPreparedStatement.java:156)
    at Main$1.process(Main.java:50)

但 MariaDB 服务器已启动并正常工作! JDBC连接器中是否有任何错误??? 版本为 5.5.32-MariaDB。

【问题讨论】:

请在 JIRA (mariadb.atlassian.net) 中提交错误,并包含您的数据文件。还包括数据库等参数。 当我遇到这种情况时,我使用 mariaDB 作为我使用 JBoss AS 7 Final 的数据源。它运行良好,直到我决定在 JBoss 运行时删除我的数据库,然后重新创建数据库。我为解决这个问题所做的只是重新启动 JBoss。 【参考方案1】:

https://dev.mysql.com/downloads/connector/j/

您是否尝试过仅使用 MySQL Connector/J? MySQL 和 MariaDB 是二进制兼容的,我从来没有遇到过任何问题。 MySQL 连接器的优势在于社区规模大得多。

【讨论】:

如果您有许可方面的问题,MariaDB J 连接器附带的 LGPL 比 MySQL (GPL) 的限制要少。 您的答案不正确,但是通过使用 MySQL 连接器,我发现该错误在 MariaDB 的 JDBC 驱动程序中。因此,我接受了这个:)

以上是关于MariaDB jdbc 连接在批量插入期间失败的主要内容,如果未能解决你的问题,请参考以下文章

JDBC 批量插入异常处理以了解特定的失败记录

jdbc连hive怎么批量插入

使用“?::TIMESTAMP_NTZ”在查询中指定类型时,Snowflake JDBC 批量插入失败并显示“绑定变量?未设置”

mysql jdbc连接器批量更新异常更新计数不如预期

批量从Dataframe插入到DB,忽略Pyspark中的失败行

jdbc 批量插入数据,多少条批量插入效率最高