开发者社区 问答 正文

mybatis升级为3.5.7,使用游标报关闭的语句/连接

进行一次升级, 对应版本为:mybatis:3.5.7 druid:1.2.6 mybatis-spring:2.0.6 spring系列:5.0.2.RELEASE 使用的数据库为oracle 升级后使用游标的地方报关闭的语句,关闭的连接 image.png

我对比新旧版本:

新版本 image.png

旧版本 image.png

发现新版本连接是没有复用的,感觉是开了PSCache后,执行完再次连接时连接不上。我把PSCache关掉就不会报这个, image.png

但感觉不太好。想请教下各位大佬,有没有其他的解决方案,拜谢

展开
收起
游客rdamtmu7av5fe 2021-09-27 10:28:19 958 分享 版权
阿里云 AI 助理回答

遇到升级后游标关闭或连接管理的问题,通常与数据库连接池配置、MyBatis的设置以及Spring框架的事务管理有关。您提到的PSCache(PreparedStatement Cache)是MyBatis用于缓存预编译的SQL语句以提高性能的一个特性。当开启时,确实可能因为连接管理不当导致问题。以下是一些建议来解决您的问题,同时尽量保持性能优化:

  1. 调整Druid连接池配置:

    • 确保Druid连接池的配置支持了有效的连接复用。检查initialSizeminIdlemaxActive等参数,确保有足够的初始化连接和最小空闲连接数。
    • 设置合适的maxWait时间,避免在连接池耗尽时无限等待。
    • 考虑启用Druid的测试查询功能,确保返回给应用的连接是可用的。
  2. MyBatis配置优化:

    • 如果关闭PSCache解决了问题,但又想保留其带来的性能提升,可以尝试调整mybatis.configuration.cache-enabled=true并细粒度地控制哪些映射文件或语句使用缓存。通过<cache/>标签或在Mapper接口的方法上使用@CacheNamespace注解来控制。
    • 检查是否正确设置了mybatis.configuration.useCursorFetch=true,这有助于处理大量结果集时的内存消耗问题,虽然它与直接的连接问题关系不大,但对性能有影响。
  3. Spring事务管理:

    • 确认Spring的事务管理配置正确无误,特别是事务的传播行为和隔离级别是否符合预期。不恰当的事务配置可能导致连接长时间未释放。
    • 使用@Transactional注解时,注意事务的边界,确保资源在事务结束时被正确关闭。
  4. 数据库驱动兼容性:

    • 确认使用的Oracle JDBC驱动版本与新升级的框架版本兼容。有时驱动版本不匹配也会引起这类问题。
  5. 日志分析:

    • 开启详细日志记录,包括Druid连接池的日志、MyBatis执行日志以及Spring事务管理相关的日志,这些可以帮助定位具体是在哪里发生连接关闭失败的问题。
  6. 逐步排查:

    • 如果条件允许,可以尝试逐步回退部分升级,比如先单独升级MyBatis,观察是否有问题,再逐步引入其他组件的升级,这样可以更精确地定位问题所在。

如果以上建议仍不能解决问题,建议提供更详细的错误信息或日志,以便进行更深入的分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答