小编ibu*_*ubi的帖子

SQL Server 序列线程安全吗?

标题太宽泛了,但我找不到更具体的,请随时更换更好的。

我有一个使用序列而不是身份的表。我有三个同时插入表的生产者应用程序,一个消费者应用程序从未处理状态的表中选择,然后处理它们,最后更新已处理的行。

消费者应用程序有一个规则,它不处理 id(标识列值)小于最后自己处理的 id 的行。

问题是,虽然我从未假设会发生,但我的消费者应用程序在运行时会落入此规则。(为其他目的制定的规则)。形象化;

问题

每个应用程序都会向数据库发送新数据,在正常情况下,每个应用程序都应该由消费者选择并处理(轮询),但是有时(在工作期间内)我的表中总是有未处理的数据。

这里我的insert sp长什么样子,是生产者常用的;

CREATE PROCEDURE spInsData
    @Data VARCHAR(MAX)
AS
BEGIN
    SET @Id = NEXT VALUE FOR dbo.sequenceId

    INSERT INTO dbo.MyTable(Id, Data, Status)
    VALUES (@Id, @Data, 0)
END
Run Code Online (Sandbox Code Playgroud)

所以我在想,生产者2和生产者3调用存储过程的时候,他们首先拿到的是序列值。然后,当涉及到插入时,不知何故,生产者 3 的插入发生得比生产者 2 快。然后消费者在较小的 id 之前处理较大的 id,因此永远不会处理 id 26。

我希望我清楚这个问题。可能是我解释的问题还是其他问题?如果是关于序列,我可以为每个消费者锁定整个过程 - 获取序列并插入吗?

sql-server sequence producer-consumer

5
推荐指数
1
解决办法
1896
查看次数

与多个消费者一起消费BlockingCollection

我有一个程序如下

 class Program
    {
        public static int TaskCount { get; set; }
        public static BlockingCollection<string> queue = new BlockingCollection<string>(new ConcurrentQueue<string>());
        static void Main(string[] args)
        {
            TaskCount = 3;
            Task.Factory.StartNew(() => Producer());

            for (int i = 0; i < TaskCount; i++)
                Task.Factory.StartNew(() => Consumer());
            Console.ReadKey();
        }

        private static void Producer()
        {
            using (StreamWriter sw = File.AppendText(@"C:\pcadder.txt"))
            {
                for (int i = 0; i < 15; i++)
                {
                    queue.Add("Item: " + (i+1).ToString());
                    var message = string.Format("{2}.Item added: Item {0} at {1}", (i+1).ToString(), …
Run Code Online (Sandbox Code Playgroud)

c# multithreading producer-consumer task-parallel-library

4
推荐指数
1
解决办法
1025
查看次数

如何将通用配置应用于ef核心中的所有实体

我的应用程序中具有从基本实体派生的实体,该基本实体使用ef核心代码优先方法。

基类

public abstract class BaseEntity<T> : IEntity<T>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public T Id { get; set; }

    object IEntity.Id { get { return Id; } set { } }

    private DateTime? createdOn;
    [DataType(DataType.DateTime)]
    public DateTime CreatedOn { get => createdOn ?? DateTime.Now; set => createdOn = value; }

    [DataType(DataType.DateTime)]
    public DateTime? ModifiedOn { get; set; }

    public bool IsDeleted { get; set; }
    // Auto increment for all entities.
    public int OrderId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和一个实体

public …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework-core

4
推荐指数
1
解决办法
1110
查看次数

将对象序列化为 json 会产生双引号

我有一个http可调用的wcf服务方法;

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, 
           BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/CheckHMAC/{hMac}")]
public string CheckId(string Id)
{
    Result result = new Result() { OTP = 1, IsSuccessful = false, CustomerId = "" };
    return JsonConvert.SerializeObject(result);
}
Run Code Online (Sandbox Code Playgroud)

该方法产生如下输出:

"{\"IsSuccessful\":false,\"OTP\":1,\"CustomerId\":\"\"}"

使用此方法的客户端抱怨此格式,因为它无效,我已经用另一个客户端测试了它,是的,它似乎无效。到目前为止,我从未遇到过这样的问题,输出应该很容易反序列化,为什么 json 对象用双引号引起来?如何获取有效的 json 字符串?

{"IsSuccessful":false,"OTP":1,"CustomerId":""}

wcf serialization json

3
推荐指数
1
解决办法
2097
查看次数

无法将类型'Newtonsoft.Json.Linq.JObject'转换为复杂类型

我有json如下,

{
  "H": "Macellum",
  "M": "Receive",
  "A": [
    {
      "CustomerId": "172600",
      "OrderId": "69931",
      "OrderStatus": "E0",
      "Buy": "A"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

和复杂的类型

public class OrderStats
{
    public string CustomerId { get; set; }
    public string OrderId { get; set; }
    public string OrderStatus { get; set; }
    public string Buy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试铸造如下,

dynamic obj = JsonConvert.DeserializeObject<dynamic>(message);
OrderStats info = (OrderStats)obj.A[0]; //exception
OrderStats info = obj.A[0] as OrderStats; //info is null
Run Code Online (Sandbox Code Playgroud)

但错误如下

无法将类型'Newtonsoft.Json.Linq.JObject'转换为OrderStatus

c# json casting json.net

3
推荐指数
2
解决办法
1万
查看次数

SqlDependency 与 SQLCLR 调用 WebService

我有一个桌面应用程序,应该在任何表更改时收到通知。因此,我只找到了两个非常适合我的情况的解决方案:SqlDependencySQLCLR。(我想知道 .NET 堆栈中是否有更好的)我已经构建了两个结构并使它们工作。我只能比较从 SQL Server 到客户端的 s̲i̲n̲gl̲e̲ 响应的持续时间。

SqlDependency

持续时间:从 100 毫秒到 4 秒

在此处输入图片说明

SQLCLR

持续时间:从 10ms 到 150ms

在此处输入图片说明

我希望这个结构能够处理高速率通知*,我已经阅读了一些 SO 和博客文章(例如:here),并且我的同事也警告说,在大量请求时 SqlDependency 可能会出错。在这里,MS 提供了一些我没有得到的东西,这可能是我问题的另一种解决方案。

*:不是所有时间,而是一个季节;在 1-2 个服务器上每秒 50-200 个请求。

基于高通知率和性能,我应该继续使用这两个中的哪一个,还是有其他选择?

sql-server sqlclr sqldependency database-trigger signalr

2
推荐指数
1
解决办法
658
查看次数

如何在任何异常情况下保持 ActionBlock 运行

我有一个ActionBlock简单地处理来自无限循环的消息。在里面ActionBlock我做了一个http post。当发生任何与网络相关的错误时,该方法会抛出异常并且该块会出现故障/停止。这不是我想要的行为。即使发生异常,我也希望处理运行。(继续打Process方法)来模拟我的程序;

private static ExecutionDataflowBlockOptions processBlockOptions
{
    get
    {
        return new ExecutionDataflowBlockOptions
        {
            MaxDegreeOfParallelism = 1
        };
    }
}

static async Start()
{
    processQueue = new 
        ActionBlock<QueueMessage>(
            async (item) =>
            {
                await Process(item);
            },
            processBlockOptions); 

    while (!Stopped)
    {
       //Read from DB and do logic with item
       QueueMessage item= new QueueMessage();
       await processQueue.SendAsync(item);                              
    }
}    

private async static Task<int> Process(QueueMessage item)
{
    try
    {
        await item.HttpPost(order);
    }
    catch (Exception ex)
    {
        //Http endpoint might be …
Run Code Online (Sandbox Code Playgroud)

c# task task-parallel-library async-await tpl-dataflow

2
推荐指数
1
解决办法
851
查看次数

带有数据注释的asp.net核心选择验证不起作用

我花了很多时间来找出答案,但我没有。当我发布模型而未选择任何选项(实际上是选择0 - Select-option)时Required验证不起作用。

我还尝试从服务代码中删除以编程方式添加的默认选项,将其从查看代码中删除,验证也没有像这样工作。

如果我完全删除了默认选项,则视图引擎会自动从列表中选择第一个选项,并且永远不会完成验证。

如何使服务器端验证正确完成?

这是我的模特

public class AuditViewModel
{
    public Guid Id { get; set; }

    [Display(Name = "Subject")]
    [Required(ErrorMessage = "IsRequired")]
    public string Subject { get; set; }

    public string AuditType { get; set; }

    public string LocationCountry { get; set; }

    public string LocationOffice { get; set; }

    [Required(ErrorMessage = "IsRequired")]
    [Display(Name = "AuditType")]
    public int AuditTypeId { get; set; }

    public string CreatedOn { get; set; }

    public …
Run Code Online (Sandbox Code Playgroud)

validation select data-annotations razor asp.net-core-mvc

2
推荐指数
1
解决办法
1926
查看次数

如何限制特定ip的wcf服务方法

这是我的 wcf 服务方法:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/CheckID/{id}")]
    public string CheckID(string id)
    {
             /*Check reuqest where it comes from */
    }
Run Code Online (Sandbox Code Playgroud)

如果我的方法从http://particularIP.com调用/调用,我希望我的方法发送响应正常,除非响应错误请求。

我怎样才能做到这一点?

c# wcf

1
推荐指数
1
解决办法
687
查看次数

将数据类型varchar转换为sql中的varbinary仅在少数值时出错

IF(ISNUMERIC(RTRIM(LTRIM('83B1B88'))) = 0)
select CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, CONVERT(VARCHAR, '0x' + '83B1B88'), 1)))
Run Code Online (Sandbox Code Playgroud)

我不知道为什么SQL抛出错误转换数据类型为varchar到VARBINARY我得到这个例外适用于像值1B91B32,169DF90, 13077B5

谁能帮我吗 ?

sql-server

1
推荐指数
1
解决办法
3909
查看次数

带继承的asp.net核心构造函数注入

在我的asp.net核心应用程序中,我具有依赖项类,这些依赖项类注入了几乎所有服务。因此,我想构建一个基础服务类来获取对属性的这些依赖关系,并且我的服务继承该基础服务类。

public abstract class BaseService
{
    protected Foo Foo { get; set; }
    protected Bar Bar { get; set; }

    public BaseService(Foo foo, Bar bar)
    {
        Foo = foo;
        Bar = bar;
    }
}
public class Service : BaseService
{
    public Service(IOtherDependency otherDependency) { }

    public void Method()
    {
        var value = Bar.value;
        Foo.Do(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,对于给定的代码,它警告我使用提供的参数调用基本构造函数,但是它们是将在运行时注入的参数,我不希望这样做。如果添加无参数构造函数,它将不会调用我需要的参数化构造函数。

我不想在继承的服务中调用或定义任何在基本服务(FooBar)中注入的类,该怎么办?

顺便说一句Foo,如果Bar类的寿命很重要,则将类作为单例注入到容器中。

c# inheritance dependency-injection asp.net-core

1
推荐指数
3
解决办法
3535
查看次数