gpt4 book ai didi

mysql - tomcat 7.0.42池化,hibernate 4.2,mysql坚如磐石的自动重新连接解决方​​案

转载 作者:IT王子 更新时间:2023-10-29 00:31:26 25 4
gpt4 key购买 nike

我已经阅读了很多有关从 hibernate session 自动重新连接到mysql的问题的帖子。其他人提到增加了mysql wait_timeout(不是我的最爱),使用autoReconnect = true(不推荐),测试连接e.t.c。我目前正在尝试一些选择,但是我想问问是否有人使用tomcat的连接池(不是 hibernate 的c3po)拥有坚如磐石的解决方案。我正在查看最防弹的jndi设置,即使它们并不是调整的最佳性能也是如此。

非常感谢你,

问候

最佳答案

很好的问题。我曾经为这个问题而苦恼。对于stackoverflow而言,最常见的答案是“几乎取决于每个问题……”。我不想这么说,但是没有什么比调整您的连接池更重要的了。这确实是一个供需游戏,其中连接请求是需求,供应是MySQL可用的连接数。这实际上取决于您的主要关注点是防止过时的连接从池中返回,还是您的关注点在于确保MySQL不会因空闲连接而过载,因为您没有足够快地杀死它们。大多数人躺在中间的某个地方。

如果您真的了解为什么有人会选择任何一种连接池配置,那么请相信我,您将停止搜索“Rocket Solid”设置,因为您会知道这就像在商店搜索业务计划一样;它完全取决于您获得了多少个连接请求以及您愿意提供多少个持久性连接。下面我举例说明为什么要使用某些设置。我引用了在Context.xml文件的“上下文”标记的“资源”标记中必须更改的变量。在底部可以看到完整的示例配置。

低流量

在这种情况下,您对应用程序的请求很少,因此连接池中的所有连接很有可能会过时,并且应用程序通过陈旧连接的第一个请求将导致错误。 (根据您使用的MySQL驱动程序的不同,错误可能解释了最后一个成功接收到的数据包超出了数据库的wait_timeout设置)。因此,您的连接池策略是防止返回无效连接。以下两个选项对于低流量站点几乎没有副作用。

  • 等待更长时间才能终止连接-您可以通过在MySQL配置中更改wait_timeout的值来做到这一点。在MYSQL工作台中,您可以在Admnin>配置文件>网络下轻松找到该设置。对于流量很大的站点,通常不建议这样做,因为它可能导致池中总是充满
    很多空闲连接。但是请记住,这是低流量
    设想。
  • 测试每个连接-您可以通过设置testOnBorrow = truevalidationQuery= "SELECT 1"来完成此操作。性能如何?在这种情况下,您的流量很低。测试从池返回的每个连接都不是问题。这意味着将向您在单个连接上执行的每个MySQL事务添加一个附加查询。在人流量少的网站上,这真的是您担心的事情吗?您的主要关注是因为未使用连接而使连接在池中失效的问题。

  • 中等流量
  • 定期检查所有连接-如果您不想每次使用时都测试每个连接,或者不想延长等待超时时间,
    然后您可以使用默认值定期测试所有连接或
    您选择的自定义查询。例如,设置validationQuery = "SELECT 1"testWhileIdle = "true"timeBetweenEvictionRunsMillis = "3600"或您想要的任何间隔。对于非常低的流量,这是
    绝对需要更多的工作。想一想。如果你有30
    池中的连接只有1个小时被调用,那么您可以使用以前的testOnBorrow方法轻松检查每个请求上的所有4个连接,而对性能的影响很小。但是,如果改为使用“每小时检查所有一次”的方法,则仅在30个请求时发出30次检查所有连接的请求
    使用了4个。

  • 高流量
  • 终止空闲连接-这种情况使每个人都说您不应该延长wait_timeout,而您
    不应该测试每个连接。它不是在每种情况下都理想的模型。当您的流量很大时
    池中的每个连接都将被利用,您的实际问题
    将会增加可用连接的数量,而
    实际上缩短了wait_time的长度,因此您不会结束
    数据库上有很多空闲连接。这是一个小伙子谈论他如何在繁忙的站点上每天有多达10,000个空闲连接的示例,因此他想降低wait_timeout Lowering the wait_timeout for busy site

  • 示例Context.xml配置
    <Context>   

    <Resource name="jdbc/TestDB"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    testWhileIdle="true"
    testOnBorrow="true"
    testOnReturn="false"
    validationQuery="SELECT 1"
    validationInterval="30000"
    timeBetweenEvictionRunsMillis="30000"
    maxActive="100"
    minIdle="10"
    maxWait="10000"
    initialSize="10"
    removeAbandonedTimeout="60"
    removeAbandoned="true"
    logAbandoned="true"
    minEvictableIdleTimeMillis="30000"
    jmxEnabled="true"
    jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
    org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
    username="root"
    password="password"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/mysql"/>
    </Context>

    示例web.xml配置
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <description>MySQL Test App</description>
    <resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/TestDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    </resource-ref>
    </web-app>

    有关调整 Tomcat Pool的Tomcat池属性的文档

    关于mysql - tomcat 7.0.42池化,hibernate 4.2,mysql坚如磐石的自动重新连接解决方​​案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078777/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com