我们遇到数据库死锁的一个经典原因是两个事务以不同的顺序插入和更新表.
例如,事务A在表A中插入,然后在表B中插入.
事务B插入表B后跟A.
这种情况总是存在数据库死锁的风险(假设您没有使用可序列化的隔离级别).
我的问题是:
您在设计中遵循哪种模式,以确保所有事务都以相同的顺序插入和更新.我正在阅读的一本书 - 建议您可以按表格的名称对语句进行排序.你有没有做过类似或不同的事情 - 这会强制所有插入和更新的顺序相同?
删除记录怎么样?删除需要从子表开始,更新和插入需要从父表开始.你如何确保这不会陷入僵局?
我在这个问题上找到了几个讨论主题 - 但没有任何内容在一个主题下对所有三种机制进行了比较.
所以这是我的问题......
我需要审核数据库更改 - 插入\ updates \删除到业务对象.
我可以想到三种方法来做到这一点
1)DB触发器
2)Hibernate拦截器
3)Spring AOP
(这个问题特定于Spring\Hibernate\RDBMS-我猜这对java\c#或hibernate \nhibernate-是中立的 - 但如果你的答案依赖于C++或Java或者hibernate的具体实现 - 请注明)
选择其中一种策略有哪些优缺点?
我不是要求实现细节.-这是一个设计讨论.
我希望我们可以将其作为社区维基的一部分
我有一个Java\Spring\Hibernate应用程序 - 完整的域类,基本上是Hibernate POJO
我认为可以在Grails中编写一些功能.
我希望重用我在主Java应用程序中创建的域类
这样做的最佳方法是什么?
我应该编写扩展Java类的新域类吗?这听起来很俗气或者我可以在Java域类中生成'控制器吗?
什么是周围的Grails\Groovy中重用的Java域对象的最佳实践,我相信一定有其他Grails中写一些作品\常规
如果你知道一个关于这种集成的教程,那就太棒了!
PS:我是grails-groovy的新手,所以可能会错过明显的.谢谢 !!!
我有一个使用spring和hibernate和struts的Web应用程序(它在Tomcat上运行)
通话顺序是这样的......
Struts动作调用spring服务bean,后者又调用Spring DAO bean.DAO实现是一个Hibernate实现.
问题是 我的所有春豆都会在同一个线程中运行吗?我可以在ThreadLocal中存储一些内容并将其放入另一个bean中吗?
我很确定这在无状态会话Bean中不起作用.EJB容器可以(或将)为每次调用会话bean生成一个新线程
弹簧容器会这样做吗?即在同一个线程中运行所有bean?
当我尝试JUnit测试时 - 我通过测试用例中的Thread.currentThread().getId()和两个bean获得相同的id - 这使我相信只有一个线程在运行
或者这种行为是不可预测的?或者在Tomcat服务器上运行时会改变吗?
澄清 我不希望在两个线程之间交换数据.我想将数据放在ThreadLocal中,并能够从调用堆栈中的所有bean中检索它.仅当所有bean都在同一个线程中时,这才有效
我们的应用程序有一个服务层和一个DAO层,写成Spring bean.
在测试服务层时 - 我不想依赖于真正的数据库,因此我通过为DAO层创建"Mock"Impl来嘲笑它
因此,当我测试服务层时,我将服务层bean链接到模拟DAO bean并且在生产中将服务层链接到"真正的"DAO bean
这是一个好主意吗 ?关于如何模拟数据库层的任何替代建议?
澄清:这个问题是关于测试服务层而不是DAO层.在测试服务层时 - 我假设DAO层已经过测试或不需要测试.主要的是 - 我们如何测试服务层 - 而不依赖于DAO实现 - 因此我在模拟DAO层
Tomcat 5.5.x和6.0.x.
Grails 1.6.x
Java 1.6.x
OS CentOS 5.x(64位)
内存为384M的VPS服务器
JAVA_OPTS:尝试了许多组合 - 包括以下内容
export JAVA_OPTS =' - Xms128M -Xmx512M -XX:MaxPermSize = 1024m'
export JAVA_OPTS =' - server -Xms128M -Xmx128M -XX:MaxPermSize = 256M'
(根据http://www.grails.org/Deployment的建议)
我创建了一个空白的Grails应用程序,即只需通过命令grails create-app然后对它进行WARed
我在VPS服务器上运行Tomcat
当我简单地启动Tomcat服务器时,没有部署应用程序,可用内存大约为236M,使用的内存大约为156M
当我部署我的"空白"应用程序时,内存消耗达到360M,最后一旦占用所有可用内存,Tomcat实例就会被终止
如您所见,我的应用程序尽可能轻松.
不知道为什么内存消耗量一样高.
我实际上正在对一个真正的应用程序进行故障排除,但已经缩小到这个更容易分享和解释的场景.
更新 我在Windows上的本地Tomcat 5.5.x上测试了相同的"空白"应用程序,它工作正常
Java进程的内存消耗从32 M到107M.但它没有崩溃,它仍然在可接受的限度内
所以寻找答案仍在继续......我想知道我的Linux机箱是否有问题.不知道虽然......
更新2 另请参阅此http://www.grails.org/Grails+Test+On+Virtual+Server
它证实了我的信念,即我的简单空白应用程序应该适用于我的配置.
目前,我们在一个Tomcat中运行多个应用程序
我宁愿将每个应用程序作为具有嵌入式Tomcat的单个应用程序运行
有没有人看到任何不利因素?
我猜我的每个实例需要内存会下降 - 所以我的整体内存消耗基本上保持不变.
我错过了什么吗?
我有一个简单的CRUD操作需要进行单元测试.这些测试用例适用于DAO层 - 因此所有测试都针对数据库,因此无法进行模拟.
所以我有一个测试用例,用于创建另一个用于更新,另一个用于读取.
我应该对JUnit类中的数据进行硬编码还是将其外部化?
Read TestCase显然需要数据库中的数据.我应该依赖于创建测试用例来设置数据还是使用SQL语句?
什么是最好的做法?
如果你能指出我讨论这个的互联网资源 - 这将是伟大的.
您如何区分设计决策与实施决策?
举一个具体的例子:我们正在开发一些将我们的应用程序与另一个应用程序集成的Web服务.我问的问题之一是 - 我们是否希望通过异步或同步在两个应用程序之间进行集成?
有人建议它是一个实现问题而不是设计.
我的请求是 - 如果我改变了一些东西而你不需要知道我改变了什么或为什么改变它 - 它的实施决定.
但是,如果我改变某些东西 - 这会改变你如何使用我的服务 - 这是一个设计决定.
如果我将我的实现改为同步的异步 - 我猜它会影响服务的消耗方式 - 因此 - 它是一个设计决策而不是实现
例如,无论我选择XML用于存储还是数据库 - 只要它不影响其他应用程序 - 它仍然是一种实现选择而不是设计
你同意吗?不同意?想法?
我有一个Hashmap,它有X个元素,
我需要将这个地图移动到另一个地图
这就是我的代码的样子
Map originMap = initialize();
Map destMap = new Hashmap ();
int originMapSize = originMap.size();
Set<Map.Entry<K, V>> entries = originMap.entrySet();
for (Map.Entry<K, Y> mapEntry : entries) {
K key = mapEntry.getKey();
V value = mapEntry.getValue();
destMap.put (key,value);
}
// Shouldnt this be equal to originMapSize ????
int destMapSize = destMap.size();
Run Code Online (Sandbox Code Playgroud)
我观察的是 - originMapSize不等于destMapSize
看来,当我们将元素放在destMap中时,一些元素被覆盖了
我们已经覆盖了hashCode和equals方法 - 这是一个可疑的实现.
但是,如果originMap允许添加元素,为什么destinationMap不会添加新元素并覆盖现有元素呢?
java ×5
tomcat ×3
database ×2
grails ×2
junit ×2
spring ×2
unit-testing ×2
architecture ×1
audit ×1
collections ×1
deadlock ×1
groovy ×1
hashmap ×1
hibernate ×1
java-ee ×1
mocking ×1
spring-aop ×1
thread-local ×1
web-services ×1