数据库触发器是个坏主意吗?
根据我的经验,它们是邪恶的,因为它们可能导致令人惊讶的副作用,并且难以调试(特别是当一个触发器触发另一个触发器时).通常开发人员甚至不会考虑是否存在触发因素.
另一方面,似乎你必须FOO
在数据库中创建一个新的逻辑,然后在数据库中创建一个新的最简单的地方是FOO表上的插入触发器.
我们唯一一次使用触发器就是设置简单的东西ModifiedDate
.
我怎么assertThat
样null
?
例如
assertThat(attr.getValue(), is(""));
Run Code Online (Sandbox Code Playgroud)
但我得到一个错误,说我不能null
进去is(null)
.
使用andReturn(T value)
vs andStubReturn(T value)
for EasyMock有什么区别?
在什么情况下你会使用andStubReturn()
哪里andReturn()
无法达到相同的结果?
我们一直在使用松散耦合和依赖注入开发代码.
许多"服务"样式类都有一个构造函数和一个实现接口的方法.每个单独的课程都很容易理解.
但是,由于耦合的松散性,查看一个类不会告诉你它周围的类或它在更大的图片中的位置.
使用Eclipse跳转到协作者并不容易,因为你必须通过接口.如果接口是Runnable
,那么找到实际插入的类是没有帮助的.真的有必要回到DI容器定义并尝试从那里解决问题.
以下是依赖注入服务类的一行代码: -
// myExpiryCutoffDateService was injected,
Date cutoff = myExpiryCutoffDateService.get();
Run Code Online (Sandbox Code Playgroud)
这里的耦合尽可能宽松.到期日以字面意思以任何方式实施.
这是一个更加耦合的应用程序中的样子.
ExpiryDateService = new ExpiryDateService();
Date cutoff = getCutoffDate( databaseConnection, paymentInstrument );
Run Code Online (Sandbox Code Playgroud)
从紧密耦合的版本,我可以推断截止日期是通过使用数据库连接的支付工具以某种方式确定的.
我发现第一种风格的代码比第二种风格的代码更难理解.
您可能会争辩说,在阅读本课程时,我不需要知道截止日期是如何计算出来的.这是真的,但是如果我正在缩小某个bug或者在增强需要插入的地方工作,那么这是有用的信息.
还有其他人遇到过这个问题吗?你有什么解决方案?这只是要调整的东西吗?是否有任何工具可以显示类连接在一起的方式?我应该让这些课程更大或更多吗?
(故意将这个问题与容器无关,因为我对任何答案感兴趣).
Firebase允许以事务方式更新资源.据我了解,客户端这样做就是向服务器发送请求"如果旧值是X,则使新值为Y".如果存在争用,则服务器可以拒绝来自客户端的多个更新,直到接受一个更新.
现在,如果我想原子地更新多个资源怎么办?
如果接受第一个更新会发生什么,然后在接受第二个更新之前断开客户端连接.有没有办法在原子事务中包含多个更新?如果没有,是否有这个问题的惯用解决方案?
假设你有一些像这样的代码(在一个成熟的语言中,因为这个问题无关紧要):
constant float PI = 3.14;
float getPi()
{
return PI;
}
Run Code Online (Sandbox Code Playgroud)
你会这样测试它:
testPiIs3point14()
{
// Test using literal in test case
AssertEquals( getPi(), 3.14 );
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
testPiIs3Point14()
{
// Test using constant from implementation in test case
AssertEquals( getPi(), PI );
}
Run Code Online (Sandbox Code Playgroud)
换句话说,您是否在测试用例中使用被测系统中的常量?或者这被视为实施细节?
最近我们一直在为现有的Java应用程序添加自动化测试.
我们有什么
这些测试中的大部分都是集成测试,可能会覆盖一堆调用,如: -
然后,我们验证servlet是否使用正确的XML进行响应,并且数据库中存在正确的行(我们的开发Oracle实例).然后删除这些行.
我们还有一些较小的单元测试,用于检查单个方法调用.
这些测试都是我们夜间(或adhoc)构建的一部分.
问题
这似乎很好,因为我们正在检查系统的边界:一端是servlet请求/响应,另一端是数据库.如果这些工作正常,那么我们就可以自由地重构或混淆其中的任何东西,并且有信心被测试的servlet继续工作.
我们可能会遇到哪些问题?
我看不出如何在单个类上添加更多单元测试会有所帮助.难道这不会让重构变得更难,因为我们更有可能需要抛弃并重新编写测试吗?
我想知道这是不是一个好设计.我有许多需要地址信息的表格(例如街道,邮政编码/邮编,国家,传真,电子邮件).有时相同的地址将重复多次.例如,可以针对供应商存储地址,然后针对发送给他们的每个采购订单存储地址.然后,供应商可以更改其地址,并且任何后续采购订单都应具有新地址.它比这更复杂,但这是一个示例要求.
选项1将所有地址列作为属性放在各个表上.在创建时将详细信息从供应商复制到PO.可能存储多个副本
选项2创建单独的地址表.从供应商和采购订单表到地址表有一个外键.只允许在地址表上插入和删除,因为更新可能会比您想要的更改.然后我会有一些计划任务,删除地址表中不再被任何东西引用的任何行,因此未留下未使用的行.也许对地址表中的所有非pk列也有一个唯一的约束来阻止重复.
我倾向于选择2.有更好的方法吗?
编辑:我必须保留采购订单上的地址,就像发送时一样.此外,我建议它有点复杂,因为可能有一个传递地址和一个帐单地址(还有一堆其他表有地址信息).
过了一会儿,我会根据日期删除旧的采购订单.在此之后,我打算垃圾收集任何地址记录,这些记录不再被任何引用(否则感觉就像我在创建泄漏).
已经很好地讨论了对象关系映射,包括在这里.我有一些方法的经验,陷阱和妥协.真正的分辨率似乎需要更改OO或关系模型本身.
如果使用功能语言,是否会出现同样的问题?在我看来,这两种范式应该比OO和RDBMS更好地融合在一起.在RDBMS中进行思考的想法似乎与功能方法似乎承诺的自动并行性相匹配.
有没有人有任何有趣的意见或见解?这个行业的状况如何?
如何在PL/SQL中声明一个会话变量 - 一个只在会话期间持续存在的会话变量,而不必将其存储在数据库本身中?