jfinal框架下,连接国产达梦数据库,抛出SocketTimeoutException异常

发布时间 2023-10-20 09:21:40作者: Erdrian

公司为政府开发项目,主框架选择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数据库的时候也是不生效的