公司为政府开发项目,主框架选择springboot,orm框架使用jfinal。数据库为国产达梦数据库
写统计类服务时,通常sql运行时间会比较久,超过10s的sql一定会报SocketTimeoutException异常
尝试使用原生jdbc创建连接,运行sql毫无问题。
遂检查连接池设置。
jfinal使用druid连接池
网上搜索关键字可得是socketTimeOut参数设置的有问题,但是给出的解决方案是在jdbcurl上添加socketTimeOut参数,照做之后发现没有用。
无奈之下只好去看druid连接池的源码。
jfnail采用的是DruidPlugin的方式,并不直接生成DataSource,我们只能在DruidPlugin.start方法中看到DataSource的初始化
进入DruidDataSource,找到init方法,重要找到了“罪魁祸首”
DruidDataSource在socketTimeout未定义的情况下,会将其设置为10s,(原生jdbc是0,即不超时)
那么办法就简单了
DruidPlugin start之后,拿到DataSource对象,设置超时时间即可。
至此圆满解决。
还记得我之前说的在jdbcurl中设置参数为什么没用吗?
注意到initFromUrlOrProperties这个方法,
在url中设置参数的方法,仅适用于mysql,达梦数据库是不支持的
包括DruidPlugin对象的setConnectionProperties方法,在连接dm数据库的时候也是不生效的
标签:SocketTimeoutException,数据库,DruidPlugin,连接池,jfinal,达梦 From: https://www.cnblogs.com/petrichor-m/p/17775251.html