文档章节

java.sql.SQLException: connection holder is null

learn_more
 learn_more
发布于 2016/07/29 11:57
字数 738
阅读 368
收藏 0

 

调试的时候经常会出现这个问题,原因是事务时间已经达到系统设置的最长值,系统以为超时,切断这个连接,从而调用事务时发生了错误。

这个不仅仅是调试时会发生,再系统中也有发生,比如一个很耗时的流程,因为过程非常耗时,这个耗时操作恰好是在service的事务中发生,事务打开连接必然打开,所以他就会暂用连接的大量时间,导致系统耗时过长(达到连接时长的最大值)而连接断开。

或许你会想到调整这个耗时时长:

spring-mybatis.xml

<!-- 清除无用连接的等待时间 --> 

<property name="removeAbandonedTimeout" value="600"/>

 

另外,对于一些数据库连接耗时很长的操作,我们可以通过 Mybatis 单独设置这个时间,select update insert delete

timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。

 

缺陷,由于大部分系统使用声明式事务(Spring的AOP),而非注解式事务(@Transaction),导致所有的非数据库的业务逻辑都用在了事务上,因为事务是加在 Service上,Service就是所有的业务代码集合,所以,很多非数据库操作的逻辑都加了事务,其实完全没有必要。如果我们使用注解式事务,那么一些逻辑操作是可控的。

    <tx:advice id="txAdvice" transaction-manager="transactionManager">

        <tx:attributes>

            <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

            <tx:method name="set*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

        </tx:attributes>

    </tx:advice>

 

连接时间太长导致资源浪费,而且超时是一个很友好的设置,如果没有超时设置,无限制等待,虽然可以解决耗时问题,但是如果遇到系统错误,那就会一直等待,暂用资源。

比如这段代码

// 客户端代码

try{

    process() 

    notifyServer()

}catch(Exception e ){

   // do nothing 

}

假设这样的处境,服务端想要知道客户端的坐标,发送一个长连接给客户端,客户端就会执行如上的代码,先去 process 获取当前坐标,然后通知服务器。如果,客户端在获取坐标的时候出现了Exception,比如 GPS信号弱,网络不通等,那么客户端抛出异常被捕获,客户端还是顺利的执行了代码,却没有通知服务端,我们这里发生了异常。那么这个时候服务端一直等待客户端的响应,没有超时设置的话,一直占用这个连接,如果有超时的话,达到这个时间,连接就断开了。

 

© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
C 语言随机数生成器的实现分析

本文作者:伯乐在线 -卢亮 。未经作者许可,禁止转载! 欢迎加入伯乐在线 专栏作者。 本文是为了记录和澄清一个由来已久的关于C语言随机数生成器的误解。 目前所看到的所有公开的关于C随机数...

伯乐在线
2016/12/21
0
0
提升网站访问速度的 SQL 查询优化技巧

原文出处:Delicious Brains 译文出处:开源中国 你一定知道,一个快速访问的网站能让用户喜欢,可以帮助网站从Google 上提高排名,可以帮助网站增加转化率。如果你看过网站性能优化方面的文...

Delicious Brains
2017/12/09
0
0
每天一个 Linux 命令(58): telnet 命令

原文出处:peida telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户...

peida
2017/02/05
0
0
.Net委托类型解析

原文出处:hystar 不像Windows API中使用C语言风格的函数指针这种不安全的方式进行回调。.Net中此功能使用使用更为安全和面向对象的委托(delegate)来完成。委托是一个类型安全的对象,它指向...

hystar
2016/06/18
0
0
每天一个 Linux 命令(57): ss 命令

原文出处:peida ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信...

peida
2017/02/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

layui table 加载数据后默认选中第一行的radio

$(".layui-table-view[lay-id='table表格的Id'] .layui-table-body tr[data-index=0] .layui-form-radio").click(); data-index=0 表示第一行数据。 将上面这句话写在done回调函数里面。 , ......

SummerGao
13分钟前
1
0
mongoDB 慢查询日志 locks 解读

因为在使用 mongoDB 的时候有性能问题,有比较慢的情况,然后我们可以看慢查询的日志,然后不是很明白,所以记录一下 日志可能是这样的形式: 然后在 mongoDB 的文档中: 这里锁的类型 type...

woshixin
23分钟前
1
0
当金融科技遇上云原生,蚂蚁金服是怎么做安全架构的?

蚂蚁金服在过去十五年重塑支付改变生活,为全球超过十二亿人提供服务,这些背后离不开技术的支撑。在 2019 杭州云栖大会上,蚂蚁金服将十五年来的技术沉淀,以及面向未来的金融技术创新和参会...

SOFAStack
26分钟前
2
0
mssql用cp实现数据表按年月归档备份

工作上用到了mssql,为了实现数据表按年月归档备份,特意写了个python的demo测试了一下,效率不错,归档备份规则、归档记录采用的是sqlite3数据库,可以实现任意表的归档操作,只需要在配置表...

禾木同荚
28分钟前
1
0
1.UML类图及类图关系

类、接口和类图 类 类(Class)是指具有相同属性、方法和关系的对象的抽象,它封装了数据和行为,是面向对象程序设计(OOP)的基础,具有封装性、继承性和多态性等三大特性。 (1) 类名(Nam...

Eappo_Geng
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部