我有这样的查询
Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser,
ValidLocation, ValidDepartment where ValidUser.LocationCode *= ValidLocation.LocationCode
and ValidUser.DepartmentCode *= ValidDepartment.DepartmentCode and Folder.IssueUser =
ValidUser.UserId and ValidFolder.FolderType = Folder.FolderType and
ValidFolderGroup.FolderGroupCode = ValidFolder.FolderGroupCode and
ValidFolderGroup.GroupTypeCode = 13 and (ValidUser.UserId='User' OR
ValidUser.ManagerId='User') and ValidFolderGroup.GroupTypeCode = 13 and
Folder.IssueUser = 'User'
现在,所有以Valid
开头的表都是缓存表,因此这些表已包含数据。
假设某人使用 JOOQ 或 Hibernate 哪一个将是最佳选择
Hibernate
或JOOQ
时,它已经拥有表的Java类,而Valid
表已经拥有了所有数据? 答案 0 :(得分:4)
好的,你可能不会喜欢这个答案,但最好的办法就是不要让Valid
"缓存"。
我认为最好的解决方案是使用jOOQ
(如果您更喜欢DSL)或Hibernate(如果您更喜欢OR映射)并每次查询数据库,并始终使用DAO模式。
jOOQ
和Hibernate的人几乎肯定比你更擅长SQL。我们在非常大的企业项目中使用了jOOQ
和Hibernate,并且它们都表现出色。特别是像BoneCP
这样的良好连接池。如果在您运行设置并运行良好但仍然认为可能存在性能问题后,您可以随后添加缓存(如EhCache
)。
最终,我对您的软件做了很多假设,即
答案 1 :(得分:2)
现代数据库非常擅长优化查询并为您选择最佳执行计划。鉴于使用*=
的外部联接表示法,您显然使用的是SQL Server,因此这是一个非常好的数据库。
即使您的应用程序内存中已经有很多" Valid" 数据,很可能您的数据库在缓冲区缓存中也已经有相同的数据,因此对于查询中的各种连接,数据库不需要再次访问磁盘。
实际上,根据数据的性质,数据库甚至可能会评估您的某些联接是不必要的(if you have the right meta data, like constraints)。
在您的特定情况下,看起来就好像您确实可以自己删除大部分查询并使用应用程序的Folder表>"有效" 缓存。我说看起来像,因为我不完全理解这些联接背后的业务逻辑,以及他们是否都建立了1:1关系,或者是否删除它们将改变查询的语义。
因此,从技术上讲,您可以删除联接,但如果您想保持安全,那么只需保持原样,就像迁移到jOOQ或Hibernate一样。
当然,在您加载"有效&#34时,您甚至可以删除此查询并获取先前查询中已有的Folder.name
属性,而不是篡改此查询。 ; 内容到内存中。
答案 2 :(得分:1)
有没有听说过意见?看看他们,你会感到惊讶
除此之外,不可能说你应该做什么,没有最好的"并且您提供的信息太少,甚至无法对您的具体要求做出有根据的猜测
但是,我不会在最终在任何程序中的查询中对数据库ID之类的内容进行硬编码,这很容易在(近)未来出现问题。