本地无错误,发布到服务器上报如下错误:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure Last packet sent to the server was 0 ms ago.)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at com.ycdx.zwzc.utils.BaseDao.getCon(BaseDao.java:163)
at com.ycdx.zwzc.utils.BaseDao.add(BaseDao.java:55)
at com.ycdx.zwzc.impl.ServiceTypeImpl.queryAllServiceType(ServiceTypeImpl.java:19)
at com.ycdx.zwzc.action.RequestAction.prepare(RequestAction.java:287)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:134)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:203)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:281)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:357)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1671)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureLast packet sent to the server was 0 ms ago.
at sun.reflect.GeneratedConstructorAccessor32.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2120)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:723)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
at sun.reflect.GeneratedConstructorAccessor24.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at org.apache.tomcat.dbcp.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
at org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
... 36 moreGOOGLE,百度若干,有说8小时连接超时的,我的链接肯定不会超时,有说把localhost改为127.0.0.1,也无效,求助大家!

解决方案 »

  1.   

    也说有可能是连接未关闭造成的,我的数据库操作是这么写的:import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;public class BaseDao {
    private static Connection con;
    private static PreparedStatement ps;
    private static ResultSet rs;
    private static final String DriverClassName = "com.mysql.jdbc.Driver";
    static {
    try {
    Class.forName(DriverClassName);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    } /**
     *封装数据库的查操作
     * 
     * @param c
     *            反射类的对象
     * @param sql
     *            操作的查询SQL语句
     * @param parameters
     *            参数集,调用时无则写null
     * @return list 集合
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws SQLException
     * @throws InstantiationException
     * @throws NamingException 
     */
    @SuppressWarnings("unchecked")
    public static List add(Class c, String sql, List<String> parameters)
    throws IllegalArgumentException, IllegalAccessException,
    InvocationTargetException, InstantiationException, NamingException {
    List<Object> list = new ArrayList<Object>();
    Object o = null;
    try {
    con = getCon();
    ps = con.prepareStatement(sql);
    setParameter(parameters);
    rs = ps.executeQuery();
    // 得到列信息ResultSetMetaDate对象
    ResultSetMetaData rsmd = rs.getMetaData(); // 创建一个String的数组,用来保存所有的列名
    // rsmd.getColumnCount()为当前结果集中的列的总数,所以定义为长度
    String[] cName = new String[rsmd.getColumnCount()];
    for (int i = 0; i < cName.length; i++) {
    cName[i] = rsmd.getColumnName(i + 1);
    } // 得到反射类中的所有的方法
    Method[] methods = c.getMethods(); while (rs.next()) {
    // 如果结果集得到了数据,则实例一个对象
    o = c.newInstance();
    for (int i = 0; i < cName.length; i++) {
    for (Method m : methods) {
    // 把从结果集中得到列名前面加上"set",并把第一位设置为大写,加上后面的,成为一个set的名称,
    // 然后用反射得到的方法名与之比较,相同的话则激活此方法
    if (m.getName().equals(
    "set" + cName[i].substring(0, 1).toUpperCase()
    + cName[i].substring(1))) {
    // 激活得到方法,并设置值
    //System.out.println(rs.getObject(i + 1));
    m.invoke(o, rs.getObject(i + 1));
    }
    }
    }
    // 添加到list集合中
    list.add(o);
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }finally{
    closeRs(rs);
    closePs(ps);
    closeCon(con);
    }


    return list;
    } /**
     * 封装数据库的增,删,改操作
     * 
     * @param sql
     *            操作的SQL语句
     * @param parameters
     *            参数集
     * @return 影响行数
     */
    public static int update(String sql, List<String> parameters) {
    int result = 0;
    try {
    con = getCon();
    ps = con.prepareStatement(sql);
    setParameter(parameters);
    //System.out.println(ps.toString());
    result = ps.executeUpdate();
    } catch (SQLException e) {
    e.printStackTrace();
    } catch (NamingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } finally {
    closeRs(rs);
    closePs(ps);
    closeCon(con);
    }
    return result;
    } /**
     * 设置参数
     * 
     * @param parameters
     *            参数集
     * @throws SQLException
     *             抛出SQL异常
     */
    private static void setParameter(List<String> parameters)
    throws SQLException {
    if (parameters != null && parameters.size() > 0) {
    for (int i = 0; i < parameters.size(); i++) {
    //System.out.println(parameters.get(i));
    ps.setString(i + 1, parameters.get(i));
    }
    }
    } /**
     * 得到Connection连接
     * 
     * @return Connection连接
     * @throws SQLException
     * @throws NamingException 
     */
    public static Connection getCon() throws SQLException, NamingException {
    InitialContext ctx = new InitialContext();
    Context envContext = (Context) ctx.lookup("java:comp/env");
    DataSource ds = (DataSource) envContext.lookup("jdbc/zwzc"); 
    con = ds.getConnection();
    return con;
    } /**
     * 关闭程序中的Connectin 连接
     * 
     * @param con
     *            Connection对象
     */
    public static void closeCon(Connection con) {
    if (con != null) {
    try {
    con.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    } /**
     * 关闭程序中PreparedStatement对象
     * 
     * @param ps
     *            PreparedStatement对象
     */
    public static void closePs(PreparedStatement ps) {
    if (ps != null) {
    try {
    ps.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    } /**
     * 关闭程序中ResultSet 对象
     * 
     * @param rs
     *            ResultSet对象
     */
    public static void closeRs(ResultSet rs) {
    if (rs != null) {
    try {
    rs.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }我的tomcat下context.xml文件是这么写的:<Resource name="jdbc/zwzc" 
      auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver" 
      maxActive="20" 
      maxIdle="20" 
      maxWait="10000" 
      username="root" 
      password="t2000vip"  
      url="jdbc:mysql://127.0.0.1:3306/support" 
      validationQuery="SELECT '1'"/>
      

  2.   

    tomcat连接池,在TOMCAT\LIB放入了mysql-connector-5.1.7.jar
      

  3.   

    url是这样写的吧
    url="jdbc:mysql://127.0.0.1:3306;DatabaseName=support" 
      

  4.   

    连接池里的URL配置和listener里面的不一致,必须同为机器名或者同为IP地址发,是这样不?
      

  5.   

    请教listener在哪里设置?我查了一下,tomcat的server.xml中listener,但是其属性只有className,并没有设置机器名的地方,请指教
      

  6.   

    dbcp的连接池啊。增加些配置参数吧,比如: remove_abandoned=true;remove_abandoned_timeout=300;log_abandoned=true;test_on_borrow=true;
      

  7.   

    TOMCAT和MYSQL在一台机子上,而且是内网应用,感觉网络应该不是问题