关于TongWeb数据源兼容mysql驱动的注意事项

问题现象:

TongWeb数据源在采用mysql驱动的国产数据库时,因数据库慢报超时为数据源配置参数的 validation-query-timeout值5秒,而不是期望的maxwait、connectiontimeout值。

bash 复制代码
The last packet successfully received from the server was 5,017 milliseconds ago.  The last packet sent successfully to the server was 5,011 milliseconds ago.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	........
	at com.tongweb.hulk.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:66)
	at com.tongweb.hulk.pool.HulkProxyPreparedStatement.executeQuery(HulkProxyPreparedStatement.java)
	at com.ruimin.ifs.rql.executor.RqlPreparedExecutor.executeQueryPage(RqlPreparedExecutor.java:118)
	... 23 more
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
	at java.net.SocketInputStream.read(SocketInputStream.java:171)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)

解释说明:

TongWeb7.0的hulk数据源的连接验证机制是采用validation-query-timeout的值做connection.setNetworkTimeout(Executors, validation-query-timeout) 网络超时校验,而不是执行的SQL, 校验连接完成后会将NetworkTimeout值恢复为原默认值。而mysql驱动在实现setNetworkTimeout方法时是通过异步方式设置的超时时间,所以有可能导致恢复默认值失败。于是TongWeb7.0对mysql做了处理: 若是mysql驱动则不采用setNetworkTimeout方法。

java 复制代码
//TongWeb数据源代码判断
private void createNetworkTimeoutExecutor(final DataSource dataSource, final String dsClassName, final String jdbcUrl)
   {
// Temporary hack for MySQL issue: http://bugs.mysql.com/bug.php?id=75615   
//源码注释中有对mysql驱动bug的说明。只要class, url里有mysql关键字,则按同步处理。
      if ((dsClassName != null && dsClassName.contains("Mysql")) ||
          (jdbcUrl != null && jdbcUrl.contains("mysql")) ||
          (dataSource != null && dataSource.getClass().getName().contains("Mysql"))) {
         netTimeoutExecutor = new SynchronousExecutor();
      }

但是由于基于mysql驱动的国产数据库厂商对driverclass, url做了处理,无mysql关键字,导致TongWeb数据源无法判断,从而引起问题。

解决方法:

先确认国产数据库提供的JDBC驱动是不是基于mysql的。若是的话TongWeb7.0进行以下配置解决:

****方式一:****在TongWeb数据源的url中增加mysql关键字,如:

jdbc:XXXXXXX://localhost:3306/nbmsdb?virtualmysql=true

****方式二:****升级为TongWeb7.0.4.9_M6,增加了对mysql驱动兼容的配置。

附:

验证mysql类 JDBC驱动setNetworkTimeout异步导致不准的测试方法如下:

相关推荐
聪明的笨猪猪2 分钟前
Java JVM “内存(1)”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
程序员清风17 分钟前
快手二面:乐观锁是怎么用它来处理多线程问题的?
java·后端·面试
一线大码32 分钟前
SpringBoot 优雅实现接口的多实现类方式
java·spring boot·后端
花伤情犹在37 分钟前
Java Stream 高级应用:优雅地扁平化(FlatMap)递归树形结构数据
java·stream·function·flatmap
yaoxin5211231 小时前
212. Java 函数式编程风格 - Java 编程风格转换:命令式 vs 函数式(以循环为例)
java·开发语言
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记
滑水滑成滑头1 小时前
**发散创新:多智能体系统的探索与实践**随着人工智能技术的飞速发展,多智能体系统作为当今研究的热点领域,正受到越来越多关注
java·网络·人工智能·python
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 总结 热部署 常用配置 笔记44
java·spring boot·笔记
十年小站1 小时前
一、新建一个SpringBoot3项目
java·spring boot
2401_841495641 小时前
【数据结构】最长的最短路径的求解
java·数据结构·c++·python·算法·最短路径·图搜索