当前位置: 首页 > news >正文

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

问题现象:

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

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 outat 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方法。

//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异步导致不准的测试方法如下:

相关文章:

  • CSS专题之层叠上下文
  • 【前端】SPA v.s. MPA
  • vue3 基本语法 父子关系
  • 设计模式——装饰器设计模式(结构型)
  • HiveSQL语法全解析与实战指南
  • 【大模型部署】mac m1本地部署 ChatGLM3-6B 超详细教程
  • 跟单业务和量化交易业务所涉及到的设计模式
  • 性能优化 - 理论篇:性能优化的七类技术手段
  • C++旅行预算规划 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件
  • 题解:洛谷 P12672 「LAOI-8」近期我们注意到有网站混淆视听
  • Wireshark 使用教程:让抓包不再神秘
  • DeepSeek-R1-0528,官方的端午节特别献礼
  • Go语言中的布尔类型详解
  • 【算法】贪心算法
  • 深拷贝和浅拷贝
  • C++ list数据删除、list数据访问、list反转链表、list数据排序
  • C++23 已弃用特性
  • C++ 建造者模式:简单易懂的设计模式解析
  • 【Linux 学习计划】-- 进程地址空间
  • dw做网站视频教程/各行业关键词
  • 婚纱类网站素材/湖南网站设计外包费用
  • 本地电脑做网站服务器/做一个网站要多少钱
  • 翻译网站怎么做/保定seo排名外包
  • 内蒙古建设工程造价信息网解释/seo服务
  • 如何制作网站详细教程/快速收录工具