上传图片超时

Posted

技术标签:

【中文标题】上传图片超时【英文标题】:Timeout when uploading images 【发布时间】:2012-11-13 23:26:22 【问题描述】:

我目前正在测试 Tridion 2011,但在创建包含上传内容的多媒体组件(而不是外部)时遇到问题。

我填写标题、架构、多媒体类型,从我的系统中选择一个文件,然后单击保存。我收到一条 Saving item... 信息消息,然后大约 30 秒后我将收到一条 The wait operation timed out 消息。

C:\Program Files (x86)\Tridion\log 目录中似乎没有任何错误消息。查看事件查看器,我看到以下与保存操作相关的信息

Unable to save Component (tcm:4-738361).
The wait operation timed out

Error Code:
0x8004033F (-2147220673)

Call stack:
System.Data.SqlClient.SqlConnection.OnError(SqlException,Boolean,Action`1)
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException,Boolean,Action`1)
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject,Boolean,Boolean)
System.Data.SqlClient.TdsParser.TryRun(RunBehavior,SqlCommand,SqlDataReader,BulkCopySimpleResultSet,TdsParserStateObject,Boolean&)
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader,RunBehavior,String)
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior,RunBehavior,Boolean,Boolean,Int32,Task&,Boolean)
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior,RunBehavior,Boolean,String,TaskCompletionSource`1,Int32,Task&,Boolean)
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1,String,Boolean,Int32,Boolean)
System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
Tridion.ContentManager.Data.AdoNet.Sql.SqlDatabaseUtilities.SetBinaryContent(Int32,Stream)
Tridion.ContentManager.Data.AdoNet.ContentManagement.ItemDataMapper.Tridion.ContentManager.Data.ContentManagement.IItemDataMapper.SetBinaryContent(Stream,TcmUri)
Tridion.ContentManager.ContentManagement.RepositoryLocalObject.SetBinaryContent(BinaryContent)
Tridion.ContentManager.ContentManagement.Component.OnSaved(SaveEventArgs)
Tridion.ContentManager.IdentifiableObject.Save(SaveEventArgs)
Tridion.ContentManager.ContentManagement.VersionedItem.Save(Boolean)
Tridion.ContentManager.ContentManagement.VersionedItem.Save()
Tridion.ContentManager.BLFacade.ContentManagement.VersionedItemFacade.UpdateAndCheckIn(UserContext,String,Boolean,Boolean)
XMLState.Save
Component.Save

由于another issue,我已经将 Content Manager 管理单元中的超时设置设置为较高的值(超过 10 分钟)。

如果有帮助,内容管理数据库中的 BINARIES 表为 25GB。

有什么想法吗?谢谢。

编辑 1

按照 Bart Koopman 的建议,我的 DBA 重建了索引,但不认为事务日志对性能有任何影响。问题依然存在。

编辑 2

我刚刚找到了错误的更多细节

Unable to save Component (tcm:0-0-0).
Timeout expired.
The timeout period elapsed prior to completion of the operation or the server is not responding.
A database error occurred while executing Stored Procedure "EDA_ITEMS_UPDATEBINARYCONTENT".EDA_ITEMS_UPDATEBINARYCONTENT

查看此过程后,看起来以下语句可能是根本原因

SELECT 1 FROM BINARIES WHERE ID = @iBINARY_ID AND CONTENT IS NULL

我使用@iBINARY_ID 作为-1 手动执行它,2 分钟后它仍然没有完成。我假设当我插入一个新的多媒体组件时,查询将是类似的(即 id 将不存在于表中)。

BINARIES 表当前有一个NON-CLUSTERED 主键。也许解决方案是将其更改为CLUSTERED Primary Key?但是,我认为它是非集群的。

【问题讨论】:

你的商品有多大,小件可以试试吗? 我目前尝试上传的图片只有4kb 【参考方案1】:

刚刚收到 SDL 客户支持的回复。显然,这是一个与统计信息和所选查询计划相关的已知问题。

从 SQL Server Management Studio 手动运行以下语句可以解决问题(甚至不需要为我完成)

SELECT 1 FROM BINARIES WHERE ID = -1 AND CONTENT IS NULL

希望这对其他人有所帮助!

【讨论】:

这一次解决了我的问题,但现在又出现了。有没有人知道如何永久修复这个问题,这样我就不必继续运行这个查询来修复它了?【参考方案2】:

数据库操作超时通常表示配置错误或缺乏维护。通过增加超时时间,您只是在解决问题而不是解决问题。

对于这么大的二进制表,您将需要确保您的数据库设置正确,数据文件与日志文件分开(在不同的物理分区/磁盘上分开),甚至可能在多个物理分区上的多个数据文件充分利用性能提升。

除此之外,您还需要确保每天/每小时执行标准数据库维护。诸如每小时备份和截断事务日志之类的事情将大大提高您的数据库性能(在 MS SQL Server 上,超过 1GB 的事务日志会大大降低数据库的速度,您应该始终尝试通过及时备份 / trucate 将其保持在该大小以下)。定期更新统计信息和重建索引也是您不应该忘记的事情。

【讨论】:

现场 5.3 db 是否设置/维护不同?我通常在未维护的开发服务器上遇到这些问题,我希望实时数据库有一个 DBA 监视它。 我已经和我的 DBA 谈过了,他们认为问题出在数据库之外,因为他们现在已经进行了一些性能调整。

以上是关于上传图片超时的主要内容,如果未能解决你的问题,请参考以下文章

nginx+tomcat使用apache的FtpClient上传图片时由于多线程问题导致的文件大小为0的问题

nginx+tomcat使用apache的FtpClient上传图片时由于多线程问题导致的文件大小为0的问题

react利用await/async实现批量上传图片可预览可限制上传图片数量

layui-解决手机调用图片上传出现接口异常的情况

使用 PHP 上传图片并达到脚本内存限制

Android图片压缩上传(整体压缩VS单张压缩)