我在基于c#和Fluent NHibernate构建的项目中有各种大型数据修改操作.DB是sqlite(在磁盘上而不是在内存中,因为我对性能感兴趣)
我想检查这些的性能,所以我创建了一些测试来提供大量数据并让流程做他们的事情.其中2个过程的结果让我非常困惑.
第一个是一个相当简单的例子,它采用XML文件中提供的数据进行一些轻量处理并导入它.XML包含大约172,000行,并且该过程总共需要大约60秒才能运行,实际插入大约需要40秒.
在下一个过程中,我对同一组数据进行一些处理.所以我在一个表中有一个大约172,000行的数据库.然后,该过程将处理此数据,执行一些较重的处理并生成一大堆数据库更新(插入和更新到同一个表).总的来说,这会导致插入大约50,000行并更新80,000行.在这种情况下,处理大约需要30秒,这很好,但保存对DB的更改需要30分钟!并且它在用sqlite'磁盘或i/o错误完成之前崩溃'
所以问题是:为什么第二个进程中的插入/更新速度要慢得多?它们使用相同的连接在同一个数据库的同一个表上工作.在这两种情况下,都使用IStatelessSession,ado.batch_size设置为1000.
在这两种情况下,代码看起来都像这样执行更新:
BulkDataInsert((IStatelessSession session) =>
{
foreach (Transaction t in transToInsert) { session.Insert(t); }
foreach (Transaction t in transToUpdate) { session.Update(t); }
});
Run Code Online (Sandbox Code Playgroud)
(虽然第一个进程没有'transToUpdate'行,因为它只是插入 - 删除更新行只是进行插入仍然需要大约10分钟.)transTo*变量是List,包含要更新/插入的对象.
BulkDataInsert创建会话并处理数据库事务.
我创建了一个包含 2 个程序集的 nuget 包。一个针对 .Net Framework 4.0,另一个针对 .Net Standard 1.6。
这似乎没有任何问题。但是,面向 .NET Standard 的版本需要几个额外的依赖项才能运行,因此我将这些作为依赖项添加到 nuspec 文件中并重新构建。
依赖项在 NuGet 包管理器中按预期显示,但是当我从 .Net Core 或 .Net Standard 应用程序引用包时,它不会添加依赖项的引用。该软件包似乎安装正常,日志中没有错误。
这是我的 nuspec 文件的相关部分:
<dependencies>
<group targetFramework="netstandard1.3">
<dependency id="System.Collections.Specialized" version="4.0.1.0" />
<dependency id="System.Threading.Tasks.Parallel" version="4.3.0.0" />
</group>
<group targetFramework="netcoreapp1.0">
<dependency id="System.Collections.Specialized" version="4.0.1.0" />
<dependency id="System.Threading.Tasks.Parallel" version="4.3.0.0" />
</group>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?
编辑:
多一点信息:
我尝试从上面的配置中删除分组,只是列出了没有分组的依赖项,然后我尝试在常规 ASP.NET 项目上安装该包。
当您通过包管理器安装包时,会弹出一个窗口,列出正在安装的包,在这种情况下,它列出了我的包以及依赖项。都好。
但是,当我在 .NETCoreApp 或 .NETStandard 项目上安装相同的包时,列表中只显示我的包。
编辑2:
我一直在与 NuGet 支持中非常有帮助的人讨论这个问题,并发现如果我们使用相同的包,添加到 Visual Studio 2017 中的 .NET Core 应用程序,那么它工作正常,只有在 VS 2015 中才会出现问题。
他们让我在 …
我目前正在开发一个具有相当标准的解耦结构的项目,如下所示:
存储库 - >服务 - >查看模型 - >视图
存储库和服务层使用POCO对象.视图模型是从这些对象构建的,并调用服务方法,然后传递给视图.
我有两个前端项目,一个使用MVC3的Web应用程序和一个使用WPF的桌面应用程序.视图模型包含在独立的类库中,因为两个应用程序的大多数都相同.(有一些例外,但这些是使用每个项目的特定VM处理的)
目前我正处于奠定基础工作阶段并且MVC方面全部工作的阶段.我现在正在研究WPF方面,并考虑使用MVVM light toolkit.
我的问题是:鉴于视图模型是在MVC和WPF应用程序之间共享的,MVVM轻量级工具包(或任何其他工具包)是否合适?有没有什么理由认为MVVM light toolkit不应该与MVC3一起使用?
我用Google搜索了一段时间后发现没有具体的东西.提前感谢您的想法.
我有一个非常简单的 Web 应用程序,其中包含我添加了 Facebook OAuth 提供程序和 Sqlite 数据库的默认 ASP.NET Core Web 应用程序。
让它在本地运行没有任何问题,但是当我部署到 Azure 时,我开始出现错误。
过了一会儿,我遇到了一个错误,指出:
An error occurred while starting the application
Run Code Online (Sandbox Code Playgroud)
在互联网上搜索了几个小时并尝试了各种方法来实际查看错误后,我在这里偶然发现了答案。
现在我可以看到错误详细信息:
ArgumentException: The 'ClientId' option must be provided.
Microsoft.AspNetCore.Authentication.OAuth.OAuthMiddleware..ctor(RequestDelegate next, IDataProtectionProvider dataProtectionProvider, ILoggerFactory loggerFactory, UrlEncoder encoder, IOptions<SharedAuthenticationOptions> sharedOptions, IOptions<TOptions> options)
Microsoft.AspNetCore.Authentication.Facebook.FacebookMiddleware..ctor(RequestDelegate next, IDataProtectionProvider dataProtectionProvider, ILoggerFactory loggerFactory, UrlEncoder encoder, IOptions<SharedAuthenticationOptions> sharedOptions, IOptions<FacebookOptions> options)
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.Extensions.Internal.ActivatorUtilities+ConstructorMatcher.CreateInstance(IServiceProvider provider)
Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions+<>c__DisplayClass3_0.<UseMiddleware>b__0(RequestDelegate next)
Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder.Build()
Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我可以在网上找到的所有文档都说你应该只需要 Facebook 的 AppId 和 AppSecret。我按照 Microsoft指南进行了配置。这是 …
我在SQLite上使用c#和NHibernate.System.Data.SQLite版本1.0.88 SQLite版本3.7.17
我最近发现了SQLite WAL模式,看起来就像我需要的那样.问题是我似乎无法让它发挥作用.
文档简单地说明:
要转换为WAL模式,请使用以下编译指示:
PRAGMA journal_mode = WAL;
journal_mode pragma返回一个字符串,它是新的日志模式.成功时,pragma将返回字符串"wal".如果无法完成到WAL的转换(例如,如果VFS不支持必要的共享内存原语),则日记模式将保持不变,并且从原语返回的字符串将是先前的日记模式(例如"删除").
我在代码中尝试过这个:
ISQLQuery query = session.CreateSQLQuery("PRAGMA journal_mode=WAL;");
object result = query.UniqueResult();
Run Code Online (Sandbox Code Playgroud)
并在SQLiteman管理应用程序中.
在每种情况下,我得到'删除'的返回值.即数据库无法进入WAL模式.麻烦的是,我不明白为什么..我在文档中看到的唯一可能性是你的文件系统不支持共享内存的原型,但我在Win 7上这样不是问题.
任何想法如何我可以启用WAL模式或弄清楚它为什么不起作用?
c# ×2
.net ×1
.net-core ×1
asp.net-core ×1
mvvm ×1
mvvm-light ×1
nhibernate ×1
nuget ×1
oauth-2.0 ×1
sqlite ×1
wpf ×1