SQL连接vs Java代码?
我有一个这样的问题SQL连接vs Java代码?,java,sql,hibernate,jooq,Java,Sql,Hibernate,Jooq,我有一个这样的问题 Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser, ValidLocation, ValidDepartment where ValidUser.LocationCode *= ValidLocation.LocationCode and ValidUser.DepartmentCode *= ValidDepartment.Depar
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
表已经有了所有数据李>
听说过观点吗?看看它们,你会惊讶的。
除此之外,你不可能说出你应该做什么,也没有“最好的”,你提供的信息太少,甚至无法对你的具体需求做出有根据的猜测。
但是,我不会在查询中硬编码数据库ID之类的东西,这些东西最终会出现在任何程序中,太容易在(不远的)将来引起问题。好的,您可能不会喜欢这个答案,但最好的方法是不要将
有效的
缓存起来
在我看来,最好的解决方案是使用jOOQ
(如果您更喜欢DSL)或Hibernate(如果您更喜欢或映射)并每次查询数据库,并且始终使用DAO模式
jOOQ
和Hibernate的家伙几乎肯定比你更擅长SQL。我们在大型企业项目中使用了jOOQ和Hibernate,它们的性能都非常出色。尤其是使用良好的连接池,如BoneCP
。如果在安装程序运行且运行良好后,仍然认为可能存在性能问题,则始终可以在之后添加缓存(如EhCache
)
最后,我对你的软件做了很多假设,也就是
*=
的外部连接表示法,显然您使用的是SQL Server,所以这是一个非常好的数据库
即使您的应用程序内存中已经有很多“有效”数据,也有可能您的数据库在缓冲区缓存中已经有相同的数据,因此数据库不需要为查询中的各种连接再次访问磁盘
事实上,根据数据的性质,数据库甚至可能会评估不需要某些联接()
具体答复:
在您的特定情况下,看起来您确实可以自己剥离大部分查询,并使用应用程序“有效”缓存中的搜索条件仅查询文件夹
表。我是说它看起来是这样的,因为我不完全理解这些连接背后的业务逻辑,也不完全理解它们是否都在建模1:1关系,或者删除它们是否会改变查询的语义
因此,从技术上讲,您可以删除连接,但是如果您想保持安全,只需在迁移到jOOQ或Hibernate时保持原样即可
备选案文3:
当然,当您将“有效”内容加载到内存中时,您甚至可以删除此查询并获取以前查询中已有的
Folder.name
属性,而不是篡改此查询。您的问题并不完全清楚。“使用Java”是什么意思?我的意思是说,关于Java代码,因为有效表已经缓存了数据,所以这些表的Java类的实例已经包含了该表的所有数据,所以将有效表添加到where条件中,我可以首先从文件夹表中获取所有记录,然后在Java for循环中,我可以满足条件并创建一个列表。您在使用什么作为缓存机制?如果您只是将整个有效的表加载到内存中,我几乎可以向您保证这是一个糟糕的解决方案。对于任何问题。有效的表只有很少的记录,比如只有10-20条记录。你怎么知道?你们有什么机制来执行这一点?hanks,但我不能删除有效的表概念作为应用程序的基础,将来我们可以删除,但不是现在,我没有说删除它。我说“不要将数据存储在内存中,需要时从数据库中获取”,或者,如果数据是静态和不可变的,不要将其存储在数据库中。