我正在尝试将SQL Server用作Orleans的数据存储。

我已经设法使用Azure本地存储模拟器使解决方案正常工作,但是无法使其与SQL Server的本地实例一起工作。我使用以下方法创建了数据库:



并使我的配置文件看起来像这里的一个:



这是我的配置文件:

<?xml version="1.0" encoding="utf-8"?>
<OrleansConfiguration xmlns="urn:orleans">
  <Globals>
    <StorageProviders>
      <SystemStore SystemStoreType ="SqlServer"
           DeploymentId="OrleansTest"
           DataConnectionString="Data Source=.\SQL2014;Initial Catalog=Orleans;Integrated Security=True;Pooling=False;Max Pool Size=200;Asynchronous Processing=True;MultipleActiveResultSets=True" AdoInvariant="System.Data.SqlClient" />
      <Provider Type="Orleans.SqlUtils.StorageProvider.SqlStorageProvider" Name="SqlServer" />
      <!--<Provider Type="Orleans.Storage.AzureTableStorage" Name="AzureStore" DataConnectionString="UseDevelopmentStorage=true" />-->
    </StorageProviders>
    <SeedNode Address="localhost" Port="11111" />
  </Globals>
  <Defaults>
    <Networking Address="localhost" Port="11111" />
    <ProxyingGateway Address="localhost" Port="30000" />
  </Defaults>
</OrleansConfiguration>

我在 Cereal 中添加了以下属性:
[StorageProvider(ProviderName = "SqlServer")]

然后,我得到以下错误:Could not locate a state map factory type...
请有人让我知道我需要添加到提供程序中的内容,或者我做错了什么吗?我是否需要为SQL提供程序创建与StateMapFactoryType有关的内容?

谢谢

最佳答案

首先,<SystemStore>不是StorageProvider。该节点用于成员资格Oracle。
像这样:

<OrleansConfiguration xmlns="urn:orleans">
  <Globals>
    <SystemStore SystemStoreType ="SqlServer"
       DeploymentId="OrleansTest"
       DataConnectionString="Data Source=.\SQL2014;Initial Catalog=Orleans;Integrated Security=True;Pooling=False;Max Pool Size=200;Asynchronous Processing=True;MultipleActiveResultSets=True" AdoInvariant="System.Data.SqlClient" />
  </Globals>
  <Defaults>
    <Networking Address="" Port="11111" />
    <ProxyingGateway Address="" Port="30000" />
  </Defaults>
</OrleansConfiguration>

现在放进您的StorageProvider
<OrleansConfiguration xmlns="urn:orleans">
  <Globals>

<StorageProviders>
  <Provider Type="Orleans.SqlUtils.StorageProvider.SqlStorageProvider" Name="SqlServer" />
</StorageProviders>


    <SystemStore SystemStoreType ="SqlServer"
       DeploymentId="OrleansTest"
       DataConnectionString="Data Source=.\SQL2014;Initial Catalog=Orleans;Integrated Security=True;Pooling=False;Max Pool Size=200;Asynchronous Processing=True;MultipleActiveResultSets=True" AdoInvariant="System.Data.SqlClient" />
  </Globals>
  <Defaults>
    <Networking Address="" Port="11111" />
    <ProxyingGateway Address="" Port="30000" />
  </Defaults>
</OrleansConfiguration>

现在到有趣的部分。设置Orleans.SqlUtils.StorageProvider.SqlStorageProvider
此特定的存储提供程序基于P&P组中的ElasticClient,该组使用特殊的分片数据库(例如,分片主数据库和分片数据库)

可能建议使用这种较低摩擦的提供程序(插入无耻的插件(如果可以,我写了它,如果没有,那么我不知道是谁做的:D))https://github.com/OrleansContrib/Orleans.StorageProviders.SimpleSQLServerStorage

好的,回到Orleans.SqlUtils.StorageProvider.SqlStorageProvider您还需要一些配置项:
  • ConnectionString
  • MapName
  • StateMapFactoryType

  • <Provider Type="Orleans.SqlUtils.StorageProvider.SqlStorageProvider" Name="guts"  ConnectionString = "Server=.;Initial catalog=guts;Integrated Security=SSPI;" MapName="guts" StateMapFactoryType="ClassName, assemblyname" />
    

    您将需要创建实现Orleans.SqlUtils.StorageProvider.IGrainStateMapFactory的StateMapFactory

    https://github.com/dotnet/orleans/blob/v1.1.3/src/OrleansSQLUtils/Storage/Provider/IGrainStateMapFactory.cs

    你可以使用https://github.com/dotnet/orleans/blob/v1.1.3/src/TesterInternal/StorageTests/SQLAdapter/SampleGrainStateMapFactory.cs
    供引用

    但! 似乎在1.1.3版中仍将Orleans.SqlUtils.StorageProvider.IGrainStateMapFactory标记为内部,因此您必须从源代码进行编译或从github获取最新信息。

    10-07 14:59