[ERROR][org.hibernate.engine.jdbc.spi.SqlExceptionHelper]Lock wait timeout

当使用Hibernate操作数据库时遇到'Lock wait timeout'错误,可能是由于事务未提交导致的锁问题。解决方案包括重启数据库、查看并结束锁定事务,以及在MySQL 5.1版本下根据IP杀死相关线程。

hibernate数据库在进行多条数据插入数据库时报上述错误。查了很多解决方案,原因是代码中有事务没提交,导致锁,最后总结如下:

sql = "select pks.orgId,so.name,sum(ifnull(pks.result01,0)+ifnull(pks.result02,0)+ifnull(pks.result03,0)+ifnull(pks.result04,0)+ifnull(pks.result05,0)+ifnull(pks.result06,0)+ifnull(pks.result07,0)+ifnull(pks.result08,0)+ifnull(pks.result09,0)+ifnull(pks.result10,0)+ifnull(pks.result11,0)+ifnull(pks.result12,0)+ifnull(pks.result13,0)+ifnull(pks.result14,0)+ifnull(pks.result15,0)+ifnull(pks.result16,0)+ifnull(pks.result17,0)+ifnull(pks.result18,0)+ifnull(pks.result19,0)+ifnull(pks.result20,0)) as px,count(pks.orgId) as py,sum(ifnull(pks.result01,0)+ifnull(pks.result02,0)+ifnull(pks.result03,0)+ifnull(pks.result04,0)+ifnull(pks.result05,0)+ifnull(pks.result06,0)+ifnull(pks.result07,0)+ifnull(pks.result08,0)+ifnull(pks.result09,0)+ifnull(pks.result10,0)+ifnull(pks.result11,0)+ifnull(pks.result12,0)+ifnull(pks.result13,0)+ifnull(pks.result14,0)+ifnull(pks.result15,0)+ifnull(pks.result16,0)+ifnull(pks.result17,0)+ifnull(pks.result18,0)+ifnull(pks.result19,0)+ifnull(pks.result20,0))/count(pks.orgId) as pz,pks.surveytype "
       + " from pip_kpi_satisfaction pks,sys_organization so "
       + " where pks.orgid=so.id and pks.surveyyear='"+year+"' "
       + " group by pks.orgId,so.name,pks.surveytype";
   List<Object[]> lsTotal = totalStatisticDao.findBySql(sql);
   for(Object[] obj:lsTotal)
   {
    TTotalStatistic t = new TTotalStatistic();
    t.setYear(year);
    t.setOrgId(Long.parseLong(obj[0].toString()));
    t.setOrgName(obj[1].toString());
    t.setTotalScore(Double.parseDouble(obj[2].toString()));
    t.setIndCount(Integer.parseInt(obj[3].toString()));
    t.setAverageScore(Double.parseDouble(obj[4].toString()));
    t.setSurveytype(Integer.parseInt(obj[5].toString()));
    //t.setWeightScore(Double.parseDouble(obj[4].toString()));
    totalStatisticDao.save(t);
   }  

方案一:重新启动服务器数据库,或者用备份数据库(简单粗暴,不想追根的朋友可以试一试,但是基于寻求问题本质的思想,建议了解方案二)

方案二:1、首先查看数据库当前所有线程情况mysql> show full processlist;

            2、再去查看innodb的事务表INNODB_TRX,mysql> SELECT * FROM information_schema.INNODB_TRX\G;看一下里面是否有正在锁定的事务线程,如果有正在锁定的事务,将此表的ID与1中的对比,如果在1中此线程为sleep,说明此线程没有commit,卡住了。

            3、mysql> kill xxx; 此处xxx为刚才事务线程的ID;

            此时再去执行我们的sql语句就ok了。

方案三:方案二适用于mysql版本5.5以上,博主版本5.1,苦逼的发现并没有innodb_trx这张表,所以又有了方案三

1、首先查看数据库当前所有的线程情况mysql>show full processlist;

2、查看本机ip,将这张表所有和你本机IP相同的进程全部kill掉。

解决 `ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper` 日志乱码问题的方法如下: ### 修改 IDEA 配置 - **设置 IDE 编码**:打开 `File` -> `Settings`(Windows/Linux)或 `IntelliJ IDEA` -> `Preferences`(Mac),在搜索框输入 `File Encodings`,将 `IDE Encoding`、`Project Encoding` 和 `Default encoding for properties files` 都设置为 `UTF-8`,保证 IDE 整体以统一的 UTF - 8 编码处理文件,避免因编码不一致导致乱码 [^4]。 - **设置控制台编码**:在 `Help` -> `Edit Custom VM Options` 中添加 `-Dfile.encoding=UTF-8`,然后重启 IDE,让 IDE 的 JVM 以 UTF - 8 编码输出内容,解决因 JVM 编码与系统或其他组件编码不一致产生的乱码问题 [^1]。 ### 修改项目运行配置 点击编辑配置,若界面中没有 VM 选项,通过 `alt + v` 或者修改选项添加 VM 选项的方式添加 `-Dfile.encoding=UTF-8` 。若 Windows 系统默认编码为 GBK,也可尝试添加 `-Dfile.encoding=GBK` ,使 JVM 输出编码与系统控制台编码统一,从而解决乱码问题 [^2]。 ### 修改 Tomcat 配置(若使用 Tomcat 服务器) - **修改 `catalina.sh` 或 `catalina.bat`**:在 Tomcat 的 `bin` 目录下找到 `catalina.sh`(Linux/Mac)或 `catalina.bat`(Windows)文件。在文件中找到 `JAVA_OPTS` 或 `CATALINA_OPTS` 行,添加 `-Dfile.encoding=UTF-8` 。示例(以 `catalina.bat` 为例): ```batch set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 ``` - **修改 `logging.properties`**:在 Tomcat 的 `conf` 目录下找到 `logging.properties` 文件,将 `java.util.logging.ConsoleHandler.encoding` 的值改为 `UTF-8`: ```plaintext java.util.logging.ConsoleHandler.encoding = UTF-8 ``` ### 修改项目配置文件 确保项目的 `pom.xml`(Maven 项目)或 `build.gradle`(Gradle 项目)中指定了正确的编码。例如,在 `pom.xml` 中添加: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ``` ### 检查系统默认编码 检查当前操作系统默认的文件编码方式,确保其与项目和 IDE 的编码设置一致 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值