Java 可以添加到PreparedStatement批更新的最大参数集数是多少?

Java 可以添加到PreparedStatement批更新的最大参数集数是多少?,java,sql,prepared-statement,Java,Sql,Prepared Statement,我需要通过jdbc执行100000多条insert语句,如下所示: 我以为这是一个常见的问题,但我似乎找不到任何明确的答案。这是一个跨数据库的项目。我认为唯一的限制是磁盘工作空间和内存。见本讨论: 您应该能够使用单元测试(JUnit)来模拟这一点。如果交易中途终止,通过交易管理这一点也会让你头疼。这可能不是一个常见的问题,因为还有其他方法可以做到这一点。我个人的建议是创建一个存储过程,它接收准备好的数据(如XML文档),并以真正的批处理格式进行处理 这将取决于MySQL中的MAX_ALLOWE

我需要通过jdbc执行100000多条insert语句,如下所示:


我以为这是一个常见的问题,但我似乎找不到任何明确的答案。这是一个跨数据库的项目。

我认为唯一的限制是磁盘工作空间和内存。见本讨论:


您应该能够使用单元测试(JUnit)来模拟这一点。如果交易中途终止,通过交易管理这一点也会让你头疼。

这可能不是一个常见的问题,因为还有其他方法可以做到这一点。我个人的建议是创建一个存储过程,它接收准备好的数据(如XML文档),并以真正的批处理格式进行处理

这将取决于MySQL中的MAX_ALLOWED_数据包设置(如果您正在使用)

客户端上MySQL的默认最大数据包大小为16 MB

您可以通过以下任一方式更新该值:

[mysqld]
max_allowed_packet=64M


当然,这是假设您使用的是MySQL。其他数据库可能有不同的设置。

这实际上取决于应用程序运行的几个因素。由于您主要处理字符串,因此应该能够获得长度为Integer.MAX_值的字符串[根据Java规范,总是2147483647(2^31-1),字符串类用于内部存储的最大数组大小]或最大堆大小的一半(因为每个字符都是两个字节),以较小者为准。请确保在应用程序设计中,堆上的jvm使用率不超过分配的值,否则将出现内存不足错误。

存储的进程也将是我的首选项,但我们没有数据库特权,不允许以任何方式更改它。:(很遗憾听到这个消息。通常,数据库上的权限被锁定在存储过程中,因为直接的TSQL更危险……我不允许修改任何数据库设置。此外,这是一个跨数据库项目,主要处理db2、oracle和SQL Server。但是感谢您将我指向MAX_allowed_PACKET变量,肯定有类似的变量。)对于其他数据库来说,这很难,因为你无法控制数据库。我能告诉你的最好的事情是将你的100K语句分成500个或更多的批。当然,我会首先使用不同的JDBC驱动程序对它进行单元测试,以确保它适用于你正在使用的所有数据库。祝你好运!我看不出这有什么不好的o处理字符串。
setString
参数是
String
,此参数最终将在发送到数据库之前在内部转换为字节。
语句
对象将使用更多堆,因为调用了更多的
setString
。因此,要回答可以添加到
Prepar>的最大参数集数是多少edStatement
批量更新明确,我通过告诉影响因素来解释。抱歉,如果我错了,请纠正我-将作为参数添加的字符串已在内存中,如果它们的大小将成为一个问题,那么在创建/读取它们时不会发生这种情况吗?如果是,则不是预处理的限制因素paredStatement将与DB或其他网络/DB约束的最大数据包大小相关?是的,将添加为
params
的字符串已在内存中。准确地说,当声明
params
二维数组并为其赋值时,将使用堆大小。当调用方法
s时在
PreparedStatement
中的etString
,本质上是通过值传递的,等价于增加循环期间的堆使用量。现在,您可以在for循环期间运行测试并检查堆大小,您会注意到增量。在讨论方法
executeBatch
之前,您最好考虑一下是否已运行我不知道网络或它的数据包大小到底是怎样的,但是在这一点上,如果你没有遇到oom,数据库驱动程序应该为你处理数据包拆分。
[mysqld]
max_allowed_packet=64M
mysql --max_allowed_packet=64M