JDBC 交互式连接
Posted
技术标签:
【中文标题】JDBC 交互式连接【英文标题】:JDBC Interactive Connection 【发布时间】:2015-02-11 06:24:00 【问题描述】:我相信我不是第一个遇到这个问题的人,所以我在这里。 问题在于我们在网站上显示的 Birt(一种报告工具)报告。
以下是我们详细研究的两个 mysql 配置变量:
wait_timeout
interactive_timeout
基本上将wait_timeout
和interactive_timeout
设置为默认值8 小时会导致我们的数据库服务器在生产环境中出现可用连接不足或速度问题。我们的应用程序在非交互式客户端 (Apache/php) 上运行。
交互超时不会影响任何 Web 应用程序 连接。高interactive_timeout 但低wait_timeout 是 正常,是最佳做法。
基于上述观察,我们尝试在 MySQL 服务器上设置 wait_timeout = 60 和 interactive_timeout = 3600 并添加额外参数以在发布 Birt 报告时通过以下连接 URL 强制执行 INTERACTIVE_CLIENT 连接。 Birt 使用mysql-java-connector 连接MySql:
jdbc:mysql://10.178.192.135:3306/ChapmanB_vkjUZSr?interactiveClient=true&useCompression=true&autoReconnect=true&initialTimeout=3600&maxReconnects=10
但我们仍然在 MySql 日志中收到连接中止错误。看起来interactiveClient=true
参数无效并且仍在创建非交互式连接。当我们增加wait_timeout
值时,我们不会在更长的时间内得到错误。基于wait_timeout = 60
MySQL 会在指定时间自动关闭空闲连接,当 Birt 尝试重用该连接时,由于连接失败,第一次尝试时报告不起作用。在页面刷新时,它会创建新的连接并且报告工作正常。
在这个关头我们很无奈,因为我们对Java和JDBC连接器不太了解,但是我们遇到了上面Birt试图使用关闭连接的错误。
【问题讨论】:
您的 birt 查看器在哪个应用服务器上运行?既然你提到了 Apache,我认为它是 Tomcat,但你能确认一下 我们正在运行|使用|在 Apache [LAMP] 服务器上运行的应用程序中显示 Birt 报告。 您是否考虑过在报告中使用连接池?它只需要对您的 BIRT rpt-design 进行一些小的更改,它可能会一劳永逸地解决这些连接问题。用 Tomcat、Jboss 和 Glassfish 建立一个连接池很容易,我认为它与 Lamp 非常相似。 如果您在谈论 Birt iServer 的连接池配置,那么我们已将其设置为默认值并尝试禁用它,但 Birt 似乎仍在使用关闭的连接。我们的 Birt iServer 运行在使用 Tomcat 的单独服务器上。我们显示在单独服务器上运行的基于 LAMP 的应用程序的报告,并在 html 代码中调用报告,其中报告 URL 是 Birt iServer。 不幸的是,我不太了解 iServer,但是使用 Eclipse BIRT,我们需要在报告设计的数据源中明确指定一个连接池(数据源的属性“JNDI url”)。在我看来,使用连接池在生产环境中非常重要,我很有信心它会解决这些问题。 【参考方案1】:它应该帮助别人。我也很欣赏@Dominique 对连接池的建议。
我们观察到当我们使用mysql-java-connector时,Birt管理控制台中的本机连接池设置无效。只有 BirtActuate 自己知道为什么会这样。
这一切都花了一段时间才解决,我们尝试通过使用here给出的解决方案在 Tomcat 配置文件中创建 JNDI 数据源和连接池来解决这个问题
另一点值得阅读的是关于mysqli_real_connect() 函数和标志MYSQLI_CLIENT_INTERACTIVE
允许 interactive_timeout 秒(而不是 wait_timeout 秒) 关闭连接前的不活动
【讨论】:
以上是关于JDBC 交互式连接的主要内容,如果未能解决你的问题,请参考以下文章
新年迈出Java后台服务器与数据库交互第一步&2022最新通用Java8&jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作