Tag: 数据访问

只读DB访问的事务?

关于使用事务从数据库中读取似乎有很不同的意见。 引用来自DeveloperWorks的文章交易策略:模型和策略概述 : 如果你只是读数据,为什么你需要一个交易? 答案是你没有。 启动事务以执行只读操作会增加处理线程的开销,并可能导致数据库上的共享读取locking(取决于您使用的数据库types以及隔离级别设置为什么)。 相反的观点是从Hibernate文档非事务性数据访问和自动提交模式引用如下 我们的build议是,不要在应用程序中使用自动提交模式,只有在有明显的性能好处或未来的代码更改不太可能时,才应用只读事务。 无论您是读取还是写入数据,始终都希望定期使用ACID事务来对您的数据访问操作进行分组。 EclipseLink邮件列表在这里也有类似的争论。 那么真相在哪里呢? 是否阅读最佳做法的交易? 如果两者都是可行的解决scheme,使用交易的标准是什么? 据我所见,只有当隔离级别高于“读取提交”时才会有所作为。 它是否正确? 有什么经验和build议?

我怎样才能从C#类生成数据库表?

有没有人知道一种方法来自动生成给定类的数据库表? 我不是在寻找一个完整的持久层 – 我已经有了一个我正在使用的数据访问解决scheme,但是我突然间必须存储大量类的大量信息,而且我不想创build所有这些表手工。 例如,给以下class级: class Foo { private string property1; public string Property1 { get { return property1; } set { property1 = value; } } private int property2; public int Property2 { get { return property2; } set { property2 = value; } } } 我期望以下SQL: CREATE TABLE Foo ( Property1 VARCHAR(500), Property2 […]

怎么了O(1)?

在讨论涉及散列和searchtypes的algorithm时,我一直注意到O(1)的一些非常奇怪的用法,通常是在使用由语言系统提供的字典types的情况下,或者使用使用数组的字典或散列数组types指数表示法 基本上,O(1)是指以一个固定的时间和(通常)固定的空间为界。 一些相当基本的操作是O(1),虽然使用中间语言和特殊的虚拟机往往扭曲在这里思考的人(例如,如何摊销垃圾收集器和其他dynamic的过程,否则会O(1)活动)。 但是忽略了延迟的分期,垃圾收集等等,我还是不明白,除非是在非常特殊的条件下,假设某些涉及某种search的技术可以是O(1)。 虽然我之前已经注意到了这个问题,但是在Pandincus问题中出现了一个例子,“在C#.NET中使用O(1)时间获取项目的'正确'集合? 。 正如我在那里提到的那样,我所知道的唯一的集合提供了O(1)访问作为保证边界,它是一个固定边界数组,具有整数索引值。 假定数组是通过映射到使用O(1)操作来定位具有该索引的单元的随机存取存储器来实现的。 对于涉及某种search以确定不同types索引(或具有整数索引的稀疏数组)的匹配单元的位置的集合,生活并不那么容易。 特别是,如果有碰撞和拥塞是可能的,访问不完全是O(1)。 如果集合是灵活的,则必须认识并分摊扩展拥塞缓解(例如,高的碰撞发生率或树不平衡)的基础结构(例如树或散列表)的成本。 我永远不会想到把这些灵活和dynamic的结构说成是O(1)。 然而,我认为他们提出的O(1)解决scheme没有任何必须保持​​的条件,以确保(1)访问得到保证(以及有恒定的可以忽略的小)。 问题:所有这些准备工作都是一个问题。 O(1)的休闲是什么?为什么盲目接受? 即使接近于常数,即使O(1)可能会不理想地大,是否认识到呢? 或者是(1)简单地将计算复杂性概念挪用于非正式使用? 我感到困惑。 更新:答案和评论指出了我自己定义O(1)的地方,而且我已经修复了这个问题。 我仍然在寻找好的答案,有些评论线索比他们的答案更有趣,在一些情况下。

我可以在存储过程中使用可选的OUTPUT参数吗?

我有一个存储过程有一堆input和输出参数,因为它是插入值到多个表。 在某些情况下,存储的proc只能插入到一个表(取决于input参数)。 这是一个嘲弄的场景来说明。 表/数据对象: 人 Id Name Address 名称 Id FirstName LastName 地址 Id Country City 说我有一个插入一个人的存储过程。 如果地址不存在,我不会将其添加到数据库中的Address表中。 因此,当我生成的代码来调用存储过程,我不想打扰添加Address参数。 对于INPUT参数,这是可以的,因为SQL Server允许我提供默认值。 但是对于OUTPUT参数我该怎么做在存储过程,使其可选,所以我没有收到错误… 过程或函数'Person_InsertPerson'需要参数'@AddressId',它没有提供。

用rails在一个调用中保存多个对象

我有一个方法在轨道上做这样的事情: a = Foo.new("bar") a.save b = Foo.new("baz") b.save … x = Foo.new("123", :parent_id => a.id) x.save … z = Foo.new("zxy", :parent_id => b.id) z.save 问题是这需要越来越多的实体,我添加。 我怀疑这是因为它必须击中每个logging的数据库。 既然他们是嵌套的,我知道在父母得救之前我不能拯救孩子,但是我想立刻拯救所有的父母,然后是所有的孩子。 这将是很好的做一些事情,如: a = Foo.new("bar") b = Foo.new("baz") … saveall(a,b,…) x = Foo.new("123", :parent_id => a.id) … z = Foo.new("zxy", :parent_id => b.id) saveall(x,…,z) 这将只有两个数据库命中。 有没有一种简单的方法来做到这一点在轨道上,还是我坚持做一个一次?