zoukankan      html  css  js  c++  java
  • Tomcat 报SocketException 断开的管道错误

    简介

    如果连接数据库的时间太长,数据库通常会回收这个连接(断开连接)。MySQL一般是8小时,Oracle可能是10分钟。

    为了提升性能,通常会使用数据库连接池技术,连接池会长时间持有连接,如果这时数据库断开了连接,而连接池并不知道,就会导致错误。
    使用Tomcat JDBC连接池,加上以下配置可以避免这个问题

    处理方案(c3p0)

    因为笔者数据库环境是mysqloracle均有且配置的数据库连接池是c3p0,因此在dataSourcebean配置中添加如下配置

    <!-- mysql -->
    <property name="preferredTestQuery" value="select 1" />
    
    <!-- oracle -->
    <property name="preferredTestQuery" value="select 1 from dual" />
    

    参考JDBC连接池的testQuery/validationQuery设置

    处理方案(druid)

    关键参数

        <!-- 用于验证数据库连接是否可用的SQL语句。MySQL,SQLServer用select 1,Oracle数据库用select 1 from dual。 -->
        <property name="validationQuery" value="${jdbc.pool.validationQuery}" />
        <!-- 是否测试空闲的数据库连接 -->
        <property name="testWhileIdle" value="true" />
    

    Tomcat JDBCSpring中的完整配置:

    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 最大连接数量 -->
        <property name="maxActive" value="100" />
        <!-- 最大空闲连接数量 -->
        <property name="maxIdle" value="100" />
        <!-- 初始化连接数量 -->
        <property name="initialSize" value="10" />
        <!-- 最小空闲连接数量 -->
        <property name="minIdle" value="10" />
        <!-- 是否自动提交。通常需设置为false -->
        <property name="defaultAutoCommit" value="false" />
        <!-- 用于验证数据库连接是否可用的SQL语句。MySQL,SQLServer用select 1,Oracle数据库用select 1 from dual。 -->
        <property name="validationQuery" value="${jdbc.pool.validationQuery}" />
        <!-- 是否测试空闲的数据库连接 -->
        <property name="testWhileIdle" value="true" />
        <!-- 检查连接是否可用的间隔时间。单位毫秒。默认5秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="5000" />
        <!-- 连接最少保存时间。单位毫秒。默认60秒 -->
        <property name="minEvictableIdleTimeMillis" value="60000" />
        <!-- 从连接池获取连接时,测试连接是否可用。对性能有一定影响,一般不用开启。 -->
        <!-- <property name="testOnBorrow" value="true" /> -->
        <!-- 将连接还给连接池时,测试连接是否可用。对性能有一定影响,一般不用开启。 -->
        <!-- <property name="testOnReturn" value="true" /> -->
    </bean>
    

    参考文章

    java.net.SocketException: 断开的管道 (Write failed) 错误,数据库隔一段时间就断开的问题
    Tomcat JDBC数据库连接池断开重连

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/ifme/p/13745731.html
Copyright © 2011-2022 走看看