标签: dotconnect

大型SQL事务:PostgreSQL上的内存不足,但在SQL Server上运行

我决定将我的C#守护程序应用程序(使用dotConnect作为ADO.NET提供程序)从SQL Server 2008 R2移动到PostgreSQL 9.0.4 x64(在Windows Server 2008 R2上).因此,我稍微修改了所有查询以匹配PostgreSQL语法,并且...卡在SQL Server上相同查询(从未在低版Express版本上)从未发生的行为上.

假设数据库包含2个非常简单的表,彼此之间没有任何关系.它们看起来有点像:ID,Name,Model,ScanDate,Notes.我有一个转换过程,它通过TCP/IP读取数据,处理它,启动事务并使用vanilla INSERT将结果放入上述2个表中.这些表最初是空的; 没有BLOB列.在糟糕的一天有大约500,000个INSERT,所有INSERT都包含在一个事务中(并且不能分成多个事务,顺便说一句).没有SELECT,UPDATE或DELETE.INSERT的一个例子(ID是bigserial - 自动自动增量):

INSERT INTO logs."Incoming" ("Name", "Model", "ScanDate", "Notes")
VALUES('Ford', 'Focus', '2011-06-01 14:12:32', NULL)
Run Code Online (Sandbox Code Playgroud)

SQL Server平静地接受负载,同时保持约200 MB的合理工作集.但是,PostgreSQL在事务运行时每秒额外占用30 MB(!)并迅速耗尽系统RAM.

我已经完成了我的RTFM并试图摆弄postgresql.conf:将"work_mem"设置为最小64 kB(这略微减缓了RAM占用),将"shared_buffers"/"temp_buffers"减少到最小(没有差别),但是无济于事.将事务隔离级别降低到Read Uncommitted没有帮助.ID ID BIGSERIAL(PK)上没有索引.SqlCommand.Prepare()没什么区别.没有建立并发连接:守护程序专门使用数据库.

似乎PostgreSQL无法应对令人难以置信的简单INSERT-fest,而SQL Server可以做到这一点.也许这是PostgreSQL快照-vs-SQL Server锁定隔离差异?对我来说这是事实:vanilla SQL Server可以工作,而vangre和PostgreSQL都没有.

在基于INSERT的事务运行时,我该怎么做才能使PostgreSQL内存消耗保持不变(显然是SQL Server的情况)?

编辑:我创建了一个人工测试用例:

DDL:

CREATE TABLE sometable
(
  "ID" bigserial NOT NULL,
  "Name" character varying(255) NOT NULL,
  "Model" character varying(255) NOT NULL,
  "ScanDate" date NOT NULL,
  CONSTRAINT "PK" PRIMARY KEY ("ID")
)
WITH (
  OIDS=FALSE
);
Run Code Online (Sandbox Code Playgroud)

C#(需要Devart.Data.dll和Devart.Data.PostgreSql.dll) …

sql sql-server postgresql dotconnect

15
推荐指数
2
解决办法
9279
查看次数

CLOB与VARCHAR2还有其他选择吗?

我正在为我的应用程序使用DevArt的dotConnect和Entity Developer.我使用Entity-First功能创建了表格.

我注意到许多列类型都设置为CLOB.我只有MySQL和Microsoft SQL服务器的经验,所以我不确定是否将CLOB用于该应用程序.我做了一些阅读,发现CLOB用于大量数据.

问题是:

  1. 在大多数字段中使用CLOB,例如用户的性别(应该是varchar(1))还是全名,可行吗?将CLOB字段转换为VARCHAR2的步骤需要删除列然后重新创建它,并且在DevArt的实体资源管理器中有问题,所以我想尽可能避免使用它.编辑:我刚刚发现,如果为字符串字段设置最大长度,它将自动为VARCHAR2.

  2. Oracle中的TINYTEXT是否有任何等价物?

oracle devart oracle11g dotconnect

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

我们可以使用Skip(),Take()和OrderBy()来控制LINQ表达式顺序吗?

我正在使用LINQ to Entities来显示分页结果.但我在使用的组合问题Skip(),Take()OrderBy()调用.

一切正常,除了OrderBy()分配得太晚.之后的结果集已被削减它的执行Skip()Take().

因此,每个结果页面都按顺序排列.但是,对一页数据进行排序,而不是对整个集合进行排序,然后使用Skip()和限制这些记录Take().

如何设置这些语句的优先级?

我的例子(简化)

var query = ctx.EntitySet.Where(/* filter */).OrderByDescending(e => e.ChangedDate);
int total = query.Count();
var result = query.Skip(n).Take(x).ToList();
Run Code Online (Sandbox Code Playgroud)

一种可能(但不好)的解决方案

一种可能的解决方案是将聚簇索引应用于按列排序,但此列经常更改,这会降低插入和更新时的数据库性能.我真的不想那样做.

编辑

我运行ToTraceString()了我的查询,我们实际上可以看到order by应用于结果集.不幸的是最后.:(

SELECT 
-- columns
FROM  (SELECT 
    -- columns
    FROM   (SELECT -- columns
        FROM ( SELECT 
            -- columns
            FROM table1 AS Extent1
            WHERE  EXISTS (SELECT 
                -- single constant column
                FROM table2 AS Extent2
                WHERE (Extent1.ID = …
Run Code Online (Sandbox Code Playgroud)

mysql linq linq-to-entities devart dotconnect

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

System.DateTime类型不是受支持的类型.更改为使用System.DateTimeOffset

我们正在创建WebApi 2.2服务,并且正在使用上面列出的技术.我们的后端数据存储区是MySql 5.6.我们使用dotConnect for MySql来处理数据存储.在数据库中,有一个RowVersion列,其类型为Timestamp.在EF中,我成功生成了模型,但我注意到RowVersion设置为DateTime.当我运行WebApi时,我得到以下运行时异常,因此我需要将类型更改为DateTimeOffset,因为Timestamp不可用.

在我们的应用程序中,我们将使用带有ETag的RowVersion进行并发处理.因此,我们只会在我们的应用程序中阅读RowVersion; 每当插入或更新发生时,数据库将自动更新RowVersion.

我不知道如何纠正这个问题...也许,有一些方法可以添加一个自动类型转换,因此模型中的RowVersion是一个Int64,我们通过发送Timestamp.value自动在Int64和Timestamp之间进行转换应用.我们只是阅读它,所以这似乎是合理的.

当我在EF模型中将RowVersion更改为Int64并构建应用程序时,我收到以下错误:

错误1错误2019:指定的成员映射无效.'Model.customer'类型中成员'Version'的类型'Edm.Int64 [Nullable = True,DefaultValue =]'与'Devart.Data.MySql.timestamp不兼容[Nullable = True,DefaultValue =,Precision = 0 ''类型'Model.Store.customers'中的成员'Version'.C:\ PROJECTS\ServiceMySql\ServiceMySql\Models\Model.edmx 898 17 ServiceMySql

我非常感谢您帮助弄清楚如何解决此问题.

感谢您的时间和建议,

麦克风

本帖子开头提到的例外情况:

System.ArgumentException未由用户代码处理
HResult = -2147024809 Message =类型'System.Nullable 1 configurationCallback)位于c:\ PROJECTS\XXXXServiceMySql\XXXXServiceMySql\Global.asax.cs中的XXXXServiceMySql.WebApiApplication.Application_Start():第17行 InnerException :1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' of property 'Version' in the 'XXXXServiceMySql.Models.customer' type is not a supported type. Change to use 'System.DateTimeOffset' or ignore this type by calling Ignore<XXXXServiceMySql.Models.customer>() on 'System.Web.OData.Builder.ODataModelBuilder'. Parameter name: navigationProperty Source=System.Web.OData
ParamName=navigationProperty StackTrace: at System.Web.OData.Builder.EntityTypeConfiguration.AddNavigationProperty(PropertyInfo navigationProperty, EdmMultiplicity multiplicity, …

mysql dotconnect odata asp.net-web-api entity-framework-6

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

Linq to Entities和LEFT OUTER JOIN问题与MANY:1关系

有人可以告诉我,为什么Linq to Entities会将多个关系转换为1个关系left outer join而不是inner join?因为对DB本身存在引用约束以确保在右表中有记录,所以inner join应该使用它(并且它将更快地工作)

如果关系很多,那么0..1 left outer join就是正确的.

是否有可能以某种方式编写LINQ,因此它将转换为inner join而不是left outer join.它会大大加快查询执行速度......我以前没有使用过eSQL,但在这种情况下使用它会是明智的吗?它会解决我的问题吗?

编辑

我更新了我的标签,以包含我在后台使用的技术:

  • 实体框架V1
  • Devart dotConnect for Mysql
  • MySql数据库

如果有人可以测试在Microsoft SQL服务器上是否也是如此,如果这是Devart的问题或者它是一般的L2EF功能,它也会给我一些见解......但我怀疑EF是罪魁祸首.

mysql linq-to-entities outer-join devart dotconnect

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

ORA-00936:使用dotConnect驱动程序和oracle数据库从数据库读取时缺少表达式

我使用dotConnect驱动程序连接到oracle数据库,但是当我想使用参数时,我总是得到这个错误:ORA-00936:缺少表达式

码:

using (var cmd = conn.CreateCommand())
            {
                conn.Open();
                cmd.CommandText = "SELECT stevilka_dokumenta from zmpt_dokumenti_po where status = @status"; ;
                cmd.Parameters.Add("@status", OracleDbType.VarChar, "1");

                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string stevilkaDokumenta = reader.GetString("stevilka_dokumenta");
                    }
                }
Run Code Online (Sandbox Code Playgroud)

错误在这里:

using (var reader = cmd.ExecuteReader())
Run Code Online (Sandbox Code Playgroud)

为什么我得到ORA-00936:缺少表情?我该如何声明输入参数?

c# dotconnect

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

连接池管理

我正在开发一种高负载的Web服务,它可以提供尽可能快的响应.该服务应与各种数据库保持一系列连接,以提高性能.我建议使用连接池.可能存在与DB的连接问题,因为我们通过VPN可以远程访问数据库.正如我所说,服务应尽可能保持连接.

什么是连接池管理算法?

我有一个连接字符串:代码:

User Id=inet;Password=somePassw0rd;Data Source=TEST11;Min Pool Size=5;Max Pool Size=15;Pooling=True
Run Code Online (Sandbox Code Playgroud)

然后我只需在我的代码中打开和关闭连接.而已.

一切都好.DB端有五个会话.所以我会杀死一个会话来模拟连接问题.在某些情况下,连接将由池管理器恢复,在某些情况下不会.

如果我杀死所有五个连接,他们永远不会恢复.

我怎样才能让游泳池经理感到困惑?检查DB连接之间的持续时间的任何设置?

我用过validate connection=true;它似乎对我来说很好,但是如果需要重新连接到DB则需要一些努力,因此拥有一个已经很好的连接会更有效.

我使用的组件是devArt dotConnect for Oracle.提前致谢!

.net c# oracle connection-pooling dotconnect

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

TransactionScope不在wcf服务方法内回滚,如果直接调用则回滚

我正面临着一个让我疯狂几天的问题,希望有人可以帮助我.这里是 ;

我正在使用EF4和oracle数据库,使用dotConnect从devart作为提供者的oracle.我有wcf服务方法,它调用下面的DeleteCabinet方法;

public void DeleteCabinet(string pRID)
{
    using(TransactionScope tranScope = new TransactionScope())
    {
        DBUtils.DeleteCabinetAndShelves(pRecordId);

        //throw exception to test record not deleted
        throw new Exception("xxx something has happened test xxx");

        tranScope.Complete();
    }
}
Run Code Online (Sandbox Code Playgroud)

DBUtils.DeleteCabinetAndShelves如下所示;

public void DeleteCabinetAndShelves(string pRecordId)
{
    using(var context = new EdrmEntities())
    {
        var cabinet = context.Cabinets.Include("Shelves").Single(p => p.RID == pCabinetRID);

        //mark all cabinet shelves for deletion
        if (cabinet.Shelves != null)
        {
            foreach (var tempShelf in cabinet.Shelves.ToList())
            {
                context.DeleteObject(tempShelf);
            }
        }

        //mark cabinet for deletion
        context.DeleteObject(cabinet);

        //save 
        context.SaveChanges(); …
Run Code Online (Sandbox Code Playgroud)

oracle transactionscope rollback devart dotconnect

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

postgresql与postGIS和实体框架,CHECK约束问题

我有一个postgresql数据库与postGIS,我使用实体框架与dotconnect 6.7 for postgreSQL.

使用我的数据库中的下表:

CREATE TABLE geo 
(
  the_geom geometry,
  id integer NOT NULL,
  CONSTRAINT primary_key PRIMARY KEY (id),
  CONSTRAINT enforce_srid_geometry CHECK (st_srid(the_geom) = 4326)
)
Run Code Online (Sandbox Code Playgroud)

并运行以下代码

class Program {
    static void Main(string[] args) {
        using (test_Model.test_Entities ctx = new test_Model.test_Entities()) {
            var geom = new test_Model.geo();
            geom.id = 0;
            geom.the_geom = DbGeometry.PointFromText("POINT (1 1)", 4326).AsBinary();
            ctx.geos.AddObject(geom);
            ctx.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下约束在数据库中失败

CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326)
Run Code Online (Sandbox Code Playgroud)

对数据库注册的值感到好奇,我尝试了以下两个约束

CONSTRAINT enforce_srid_the_geom CHECK(st_srid(the_geom) > 4326)
CONSTRAINT enforce_srid_the_geom CHECK(st_srid(the_geom) < 4326)
Run Code Online (Sandbox Code Playgroud)

都没有奏效.由于这些是比较的整数值,因此最后三个查询中的至少一个应该是真的. …

postgresql entity-framework devart dotconnect

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

DevArt的dotConnect for Oracle与DataDirect的ADO.NET数据提供程序

是否有人对DevArt的dotConnect for Oracle和DataDirectADO.NET数据提供程序进行了比较分析.

我们正在考虑将这些框架中提供的实体框架支持用于关键企业应用程序.我读过的一些文章建议如下:

  1. 与DataDirect相比,DevArt dotConnect快得多
  2. DataDirect许可证比DevArt许可证更昂贵

任何人都可以更多地了解技术方面,以帮助决策过程吗?

oracle ado.net entity-framework devart dotconnect

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