谨慎使用Hibernate中的本机SQL

我真的很喜欢Hibernate,但我也不知道同时具备强大功能和欺骗性的工具。 我可以写一本书,讲述仅与Hibernate相关的生产和货物崇拜编程中的意外情况。 与用户相比,与工具相比,这更多的是问题,但请不要让它过于保修。

所以,这是一个最近的例子。

问题

我们需要一个后台作业,该作业列出目录中的所有文件,并将每个文件的条目插入表中。

天真的解决方案

该作业以前是用Bash编写的,并且可以从表中直接读取SQL。 所以,盲人,让我们写一些直接的SQL!

for (String fileName : folder.list()) {SQLQuery sql = session.getDelegate().createSQLQuery("insert into dir_contents values (?)");sql.setString(0, fileName);sql.executeUpdate();
}

它行得通吗? 当然可以。

现在,如果文件夹中有10,000个文件怎么办? 如果您还有一个不太优雅的域模型 ,在一个上下文中有太多的实体类,数千个实例和两级缓存,该怎么办?

突然,这项琐碎的工作需要10分钟才能执行,所有时间使2或3个CPU保持100%繁忙。

什么,只要一堆插入物?

简易修复

问题在于它是休眠状态。 它不仅是一个愚蠢的JDBC包装器,而且还有很多事情要做。 它试图使缓存和会话状态保持最新。 如果运行裸露的SQL更新,则不知道要更新的表,它所依赖的表以及它如何影响一切,以防万一它几乎刷新了所有内容

如果您在如此拥挤的环境中执行此操作10,000次,则总和会增加。

这是修复它的一种方法-而不是使用刷新运行10,000个更新,而是在一个块中执行所有操作并刷新一次。

session.doWork(new Work() {public void execute(Connection connection) throws SQLException {PreparedStatement ps = connection.prepareStatement("insert into dir_contents values (?)");for (String fileName : folder.list()) {ps.setString(1, fileName);ps.executeUpdate();}}
});

其他解决方案

惊喜,惊喜:

  • 一定要使用休眠模式。 创建一个代表DirContents的真实实体,并像其他所有东西一样使用它。 然后,Hibernate知道何时刷新哪些缓存,如何批处理更新等等。
  • 不要使用休眠模式。 使用普通的旧JDBC, MyBatis或其他适合您的堆栈或已经存在的堆栈。

带走

即使此示例不是最佳用例,本机SQL也应有的地位。 无论如何,关键是:如果将本地SQL与Hibernate一起使用,请注意会话状态和缓存。

翻译自: https://www.javacodegeeks.com/2014/03/careful-with-native-sql-in-hibernate.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js 编辑数组

删除数组第一个元素使用var length arr.shift(); 删除arr的第一个元素后, 返回值是删除后的数组长度 删除数组最后一个元素使用var length arr.pop(); 删除arr的最后一个元素后, 返回值是删除后数组的长度 在数组开头添加元素使用var length arr.unshif…

tensorboard运行

终端中进入存放even文件的文件夹的上一步,然后,输入tensorboard --logdir存放even文件的文件夹 转载于:https://www.cnblogs.com/wzwi/p/10931397.html

DevExpress WPF v18.2新版亮点(五)

买 DevExpress Universal Subscription 免费赠 万元汉化资源包1套! 限量15套!先到先得,送完即止!立即抢购>> 行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式…

JavaFX技巧3:使用回调接口

作为UI框架开发人员,提供自定义控件外观和行为的方法是我工作的一部分。 在许多情况下,这是通过允许框架用户在控件上注册工厂来完成的。 过去,我会为此创建一个工厂接口,并在框架内提供一个或多个默认实现。 这些事情在JavaFX中…

爱课程c语言函数2的作业答案,C语言程序设计

Q:本门课程面向的授课群体是什么?没有任何基础能学习本课程吗?A:本门课程的基本内容是面向零基础的学生。进阶内容是面向有一定编程基础或者大学计算机基础的学生,但是进阶内容不做为课程考试内容。Q:本课程…

旧文章搬运完毕

花了一天时间,把原来百度空间里200多篇文章里的70篇重要文章(除去扯淡的)搬了出来。 希望这些资料对初学者能够有点用,以后有时间还是继续多写一些有用的内容出来。转载于:https://www.cnblogs.com/achillis/p/10183787.html

voinc vue实现级联选择

需求&#xff1a; vonic中实现级联选择 <!DOCTYPE html> <html> <head><title>下拉框</title><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><link rel…

爬虫521错误(又是一次和可爱的前端vs的故事)

起因: 今天突然想重构一下代理池,并且想扩充一下代理,所以就想着爬点代理IP,然后就有了下面的故事 一上来先进行了一顿操作: def get_xxdaili(url):headers {User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safar…

c语言编译器怎样退出全屏,BOOX 应用软件怎样退出全屏模式?

​相信很多用BOOX阅读器的小伙伴都知道BOOX的系统是安卓系统&#xff0c;相对于Kindle的原生Linux系统&#xff0c;BOOX的安卓系统的开放性会更强&#xff0c;可以自由下载一些第三方应用软件。天弟知道很多小伙伴们喜欢在一些第三方应用软件上面看书的习惯&#xff0c;比如像多…

Java 8 Friday:不再需要ORM

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…

Pwn相关工具安装

$apt-get update $apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential $pip install --upgrade pip $sudo pip install pwntools sudo apt-get install nasm,gcc,gdb,binutils,hexedit #32位libc库 sudo apt-get install lib…

c 语言输出指针的值,C 语言指针

C 语言指针在本教程中&#xff0c;您将学习指针。什么是指针&#xff0c;如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。指针是 C和C 编程的强大功能。在学习指针之前&#xff0c;让我们学习一下C语言编程中的地址。C 语言地址如果程序中有变量var&#xff0c…

Rabbitmq - 配置

目录 RabbitMQ 配置简介环境变量配置文件运行时参数和策略RabbitMQ 配置 简介 默认配置&#xff0c;已经可以有效地运行RabbitMQ&#xff0c;并且在大多数情况下不需要更改配置。不过为了在生产环境中稳定、高效的运行&#xff0c;RabbitMQ提供了三种方式来定制化服务 环境变量…

Java EE CDI限定词:快速浏览

在上下文和依赖注入&#xff08;CDI&#xff09;中&#xff0c; 限定符是类型安全和松散耦合的主体。 为什么&#xff1f; 没有CDI&#xff0c;我们将以类似于下面的方式注入Java EE组件 注意&#xff1a;这实际上不会编译&#xff0c;只是假设的代码片段 例子1 例子2 上述…

Windows 系统光盘刻录教程-光盘怎样刻录?刻录数据光盘用轨道一次写入还是光盘一次写入?...

刻录光盘需要 DVD-RW 的光驱&#xff0c;并且光盘需要 DVD-R 的光盘用于刻录。刻录工具可以使用 https://cn.ultraiso.net/ 来进行刻录。选择软件目录 中 工具 &#xff0c;选择 刻录光盘映像 即可进行配置&#xff1a; 此时涉及到了光盘写入的方式的选择问题&#xff0c;在网上…

webpack编译时No PostCSS Config的解决方法

1. {loader:"postcss-loader",options: { // 如果没有options这个选项将会报错 No PostCSS Config foundplugins: (loader) > [require(autoprefixer)(), //CSS浏览器兼容]}}2.在项目根目录新建 postcss.config.js文件&#xff0c;并对 postcss进行配置…

c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)

我们发现&#xff0c;无论是静态链接库还是动态链接库&#xff0c;最后都有lib文件&#xff0c;那么两者区别是什么呢&#xff1f;其实&#xff0c;两个是完全不一样的东西。静态库对应的lib文件叫静态库&#xff0c;动态库对应的lib文件叫导入库。实际上静态库本身就包含了实际…

NTC3950-10K温度传感器

一、计算公式 补充&#xff1a; B3950 R10K T225度 查RT表&#xff0c;25度对应的是10K 电路&#xff1a;   热敏电阻与上拉电阻R813分压&#xff0c;获取温度与Vo电压的关系&#xff0c;在根据Vo折算出与MCU ADC的数值。 再将ADC代出Rt&#xff0c;即得到ADC与T的关系公式。…

使不安全变得更加安全

总览 如果直接使用Unsafe&#xff0c;则可能会导致JVM崩溃。 当您访问尚未映射的内存页面并且在Unix上的结果是SIGSEG&#xff08;如果您访问页面0&#xff09;或SIGBUS&#xff08;如果您访问另一个未映射的页面&#xff09;时&#xff0c;就会发生这种情况。 使用MethodHand…

二分搜索树的基本实现

基本操作的动画演示 插入&#xff08;略&#xff09; 搜索&#xff08;略&#xff09; 删除节点 代码 package com.yunche.datastructure;import java.util.LinkedList; import java.util.Queue;/*** ClassName: BST* Description: 二叉搜索树&#xff1a;每个节点的左子树的值…