Java 批处理执行中插入查询的最佳数量

Java 批处理执行中插入查询的最佳数量,java,sql,performance,jdbc,Java,Sql,Performance,Jdbc,我正在使用JDBC的executeBatch方法运行一些insert查询。 首先让我解释一下这个应用程序。 有一个web应用程序,当用户浏览某些网页时,它将以异步方式向缓存发送一些insert语句。当缓存查询的大小增长到一定数量时,例如“n”,查询将使用JDBC的executeBatch方法作为批处理执行 我不是真正的DB背景,也不知道如何计算“n”的值。所有的因素都会决定它,在进行负载测试之前,我如何从数学上计算出一些近似值 就使用情况而言,我预计一小时内大约有72000个insert查询,优

我正在使用JDBC的executeBatch方法运行一些insert查询。 首先让我解释一下这个应用程序。 有一个web应用程序,当用户浏览某些网页时,它将以异步方式向缓存发送一些insert语句。当缓存查询的大小增长到一定数量时,例如“n”,查询将使用JDBC的executeBatch方法作为批处理执行

我不是真正的DB背景,也不知道如何计算“n”的值。所有的因素都会决定它,在进行负载测试之前,我如何从数学上计算出一些近似值

就使用情况而言,我预计一小时内大约有72000个insert查询,优先考虑的是web应用程序的顺利运行,而不是数据的插入

请建议


编辑-从2000年起将查询数更新为每小时72000次,很抱歉,之前的数据有误:

2000插入查询每小时大约是每1.5秒一次。这对于在任何现代设备上运行的任何数据库来说都不是一个严重的负载。唯一的例外是插入过长,例如存储兆字节长的blob或插入可能具有长触发链来执行复杂工作

我怀疑尝试优化应用程序的这一方面为时过早。您应该能够在不影响性能的情况下为每个操作执行单独的插入。这也将简化应用程序。通过不使用缓存,您不必担心维护与缓存的一致性,也不必担心应用程序端失败时该怎么办,也不必担心在前一次缓存更新结束之前发生第二次缓存更新时该怎么办,等等。您也不必担心在实际更新缓存时如何处理缓存


我应该注意,缓存更新可能会产生一些负面影响,比如锁定表/页的时间更长。总的来说,如果操作正确,只需一次往返数据库,它们的效率就会更高。但是,这种效率可能会掩盖在数据库中锁定对象的较长时间。

2000插入查询一小时大约是每1.5秒一次。这对于在任何现代设备上运行的任何数据库来说都不是一个严重的负载。唯一的例外是插入过长,例如存储兆字节长的blob或插入可能具有长触发链来执行复杂工作

我怀疑尝试优化应用程序的这一方面为时过早。您应该能够在不影响性能的情况下为每个操作执行单独的插入。这也将简化应用程序。通过不使用缓存,您不必担心维护与缓存的一致性,也不必担心应用程序端失败时该怎么办,也不必担心在前一次缓存更新结束之前发生第二次缓存更新时该怎么办,等等。您也不必担心在实际更新缓存时如何处理缓存


我应该注意,缓存更新可能会产生一些负面影响,比如锁定表/页的时间更长。总的来说,如果操作正确,只需一次往返数据库,它们的效率就会更高。但是,效率可能会掩盖对象在数据库中被锁定的较长时间。

您的问题不包含任何有用的数据来回答此问题。插入的速度取决于:

行的大小,即您告诉数据库的限制 插入所触及的索引数 有些类型的CLOB比其他类型的更贵 每行的实际数据量 您使用的数据库 延迟 磁盘上表存储的布局 根据经验,对于2-3列的小插入,我们连接10000行;对于整行,我们连接<100字节;对于每个<1KB的普通行,我们连接1-2000行;对于>100K的大行,我们连接1行


编辑-编写一个小型性能测试,插入具有不同批量大小和时间的一百万条记录。其他的都是猜测。

你的问题没有任何有用的数据来回答这个问题。插入的速度取决于:

行的大小,即您告诉数据库的限制 插入所触及的索引数 有些类型的CLOB比其他类型的更贵 每行的实际数据量 您使用的数据库 延迟 磁盘上表存储的布局 根据经验,对于2-3列的小插入,我们连接10000行;对于整行,我们连接<100字节;对于每个<1KB的普通行,我们连接1-2000行;对于>100K的大行,我们连接1行


编辑-编写一个小型性能测试,插入具有不同批量大小和时间的一百万条记录。其他任何事情都只是猜测。

为什么不每X次执行一次批处理作业?是的,这也是项目中讨论的问题,但它仍然归结为在这段时间内要执行的查询数。@BMISHRA:缓存如何维护缓存和数据库之间的ACID?如果其中一个更新
rom缓存到DB失败,是否会像DB事务一样回滚?嗨,tonga,不,没有事务回滚,每个查询都不是相互依赖的,失败的案例只会被记录。为什么不每X次执行一次批处理作业?是的,这也是项目中讨论的问题,但这仍然归结为在这段时间内要执行的查询数量。@BMISHRA:缓存如何维护缓存和数据库之间的ACID?如果其中一个从缓存到数据库的更新失败,它会像数据库事务一样回滚吗?嗨,汤加,不,没有事务回滚,每个查询都不是相互依赖的,失败的情况只会被记录下来。嗨,艾伦,我在用MS SQL。该表由8列组成,分别为7列nvarchar50和1列datetime。该表没有索引,它的唯一用途是通过基于datetime列的计划作业定期生成数据提取。该表由8列组成,分别为7列nvarchar50和1列datetime。该表未编制索引,该表的唯一用途是通过基于datetime列的计划作业定期生成数据提取。感谢您的回答,我回去与团队讨论,并了解到客户已收购了一家公司,负载将在几周内增加,他们预计在一小时内查询72000次,每分钟1200次。您对这种类型的负载有什么建议?非常不同的问题,尽管每秒20次更新仍然偏低。但是,您的问题并没有提供足够的信息,而且StackOverflow在峰值流量、查询混合、响应要求等方面可能不是合适的地方。感谢您的回答,我回去与团队进行了讨论,并了解到客户已经收购了一家公司,负载将在几周内增长,他们预计在一小时内查询72000次,每分钟1200次。您对这种类型的负载有什么建议?非常不同的问题,尽管每秒20次更新仍然偏低。但是,您的问题没有提供足够的信息,而且StackOverflow可能不是关于峰值容量、查询混合、响应要求等的合适位置。