初学spring,写了个程序,业务处理采用spring   的   IOC   模式,控制显示层,只是采用普通的servlet和jsp 报如下错误。 2007-10-9   10:59:22   org.logicalcobwebs.proxool.ConnectionResetter   reset 
警告:   #1   -   Problem   calling   connection.getAutoCommit() 
java.sql.SQLException:   [Microsoft][SQLServer   2000   Driver   for   JDBC]Object   has   been   closed. 
at   com.microsoft.jdbc.base.BaseExceptions.createException(Unknown   Source) 
at   com.microsoft.jdbc.base.BaseExceptions.getException(Unknown   Source) 
at   com.microsoft.jdbc.base.BaseConnection.validateClosedState(Unknown   Source) 
at   com.microsoft.jdbc.base.BaseConnection.getAutoCommit(Unknown   Source) 
at   org.logicalcobwebs.proxool.ConnectionResetter.reset(ConnectionResetter.java:219) 
at   org.logicalcobwebs.proxool.ConnectionPool.resetConnection(ConnectionPool.java:905) 
at   org.logicalcobwebs.proxool.AbstractProxyConnection.close(AbstractProxyConnection.java:218) 
at   org.logicalcobwebs.proxool.ProxyConnection.invoke(ProxyConnection.java:55) 
at   org.logicalcobwebs.cglib.proxy.Proxy$ProxyImpl$$EnhancerByCGLIB$$6b6a96a6.close( <generated >) 
at   org.apache.commons.dbcp.DelegatingConnection.close(DelegatingConnection.java:151) 
at   org.apache.commons.dbcp.PoolableConnection.reallyClose(PoolableConnection.java:95) 
at   org.apache.commons.dbcp.PoolableConnectionFactory.destroyObject(PoolableConnectionFactory.java:301) 
at   org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:800) 
at   org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95) 
at   org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540) 
at   org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113) 
at   org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) 
at   org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:329) 
at   org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:405) 
at   org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:448) 
at   cn.ehoo.sale8.db.DaoUtils.queryObject(DaoUtils.java:146) 
at   cn.ehoo.sale8.web.services.imp.CommodityServicesImp.getCommodityInfo(CommodityServicesImp.java:500) 
at   cn.ehoo.sale8.web.servlet.IndexServlet.doPost(IndexServlet.java:240) 
at   cn.ehoo.sale8.web.servlet.IndexServlet.doGet(IndexServlet.java:22) 
at   javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 
at   javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
at   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
at   org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691) 
at   org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469) 
at   org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403) 
at   org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) 
at   org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:691) 
at   org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:661) 
at   org.apache.jsp.commodity1_jsp._jspService(commodity1_jsp.java:76) 
at   org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) 
at   javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
at   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328) 
at   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315) 
at   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 
at   javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
at   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
at   org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691) 
at   org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469) 
at   org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403) 
at   org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) 
at   org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:195) 
at   org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:159) 
at   org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141) 
at   org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90) 
at   org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:406) 
at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
at   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
at   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210) 
at   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) 
at   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at   org.jstripe.tomcat.probe.Tomcat55AgentValve.invoke(Tomcat55AgentValve.java:20) 
at   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
at   org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:542) 
at   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
at   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
at   org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834) 
at   org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640) 
at   org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286) 
at   java.lang.Thread.run(Thread.java:595) 
代码如下 
import   javax.servlet.*; 
import   javax.servlet.http.*; 
import   org.springframework.context.ApplicationContext; 
import   org.springframework.context.support.ClassPathXmlApplicationContext; 
public   class   BaseServlet   extends   HttpServlet   { 
        private   static   final   String   CONTENT_TYPE   =   "text/html;   charset=GBK"; 
        //private     XmlBeanFactory   factory; 
        private     ApplicationContext   context; 
        //Initialize   global   variables 
        public   void   init()   throws   ServletException   { 
        } 
        /** 
        private     void   init1() 
        { 
                Resource   res   =   new   ClassPathResource("Application-Context1.xml"); 
                factory   =   new   XmlBeanFactory(res); 
        }         public     Object   getBean(String   beanName) 
        { 
                if(factory   ==   null) 
                        init1(); 
                return   factory.getBean(beanName); 
        }**/         private     void   init1() 
        { 
                context   =   new   ClassPathXmlApplicationContext("Application-Context1.xml"); 
        }         public     Object   getBean(String   beanName) 
        { 
                if(context   ==   null) 
                        init1(); 
                return   context.getBean(beanName); 
        } 
        //Clean   up   resources 
        public   void   destroy()   { 
        } 

解决方案 »

  1.   

    cn.ehoo.sale8.db.DaoUtils.queryObject(DaoUtils.java:146)  问题出在这检查下你代码吧
      

  2.   


    public class DaoUtils {    private JdbcTemplate jt;
       public DaoUtils() {   }   public void setJt(JdbcTemplate jt) {
           this.jt = jt;
       }   public JdbcTemplate getJt(){       return jt;
        }
       /**
        *为调用其它JdbcTemplate函数提供接口
        */   public JdbcTemplate getJdbcTemplate(){       return jt;
        }
        
         /**
         *   Find Objects
         *   返回查询结果集合,注意如果联合查询中有重复列以 columnName as otherName区别,
         *   所有列类型均以String处理,不保证满足所有需求,以getJdbcTemplate()调用原始API
         */    public List<Map> queryOjects(String sql){         List ls = new LinkedList();
             SqlRowSet rs = jt.queryForRowSet(sql);
             SqlRowSetMetaData rm = rs.getMetaData();
             while(rs.next()){
                ls.add(ObjectMap(rs,rm));
             }
             return ls;
        }
        /**
         *  返回满足一条记录,尽量确保唯一,如 id = xyz
         */    public Map queryObject (String sql){
            SqlRowSet rs = jt.queryForRowSet(sql);
            SqlRowSetMetaData rm = rs.getMetaData();
            if(rs.first()){
                return ObjectMap(rs,rm);
            }
            return null;
        }    private Map ObjectMap(SqlRowSet rs,SqlRowSetMetaData rm){
            Map map = new HashMap();
            for(int i=1; i<=rm.getColumnCount();i++){
                map.put(rm.getColumnName(i),rs.getString(i));
            }
            return map;
        }    /**
         *   CRUD:update Object
         *   返回操作影响纪录数
         */
        public int updateObjects(String sql){        return getJdbcTemplate().update(sql);
        }    /**
         *  CRUD:create Object
         */
        public void insertObject(String sql){        getJdbcTemplate().execute(sql);
        }    /**
         *   CRUD: delete object
         *   返回操作影响纪录数
         */
        public int deleteObjects(String sql){        return updateObjects(sql);
        }    /**
         * 返回count,avg,sum等唯一查询int结果
         *
         */
        public int queryForInt(String sql){        return getJdbcTemplate().queryForInt(sql);
        }    public int[] batchObjects(String []sqls){
            return getJdbcTemplate().batchUpdate(sqls);
        }
    该怎么改呢?
      

  3.   

    应该不是cn.ehoo.sale8.db.DaoUtils.queryObject(DaoUtils.java:146)   的问题我在 DaoUtils中加了 下面的方法
        public Map queryMap (String sql){
            return jt.queryForMap(sql);
            
        }在servlet中只调用它,还是会出现上面的警告。 这样的警告并不是在一开始就出现的,是在多次访问页面以后,如果间隔一段时间再访问才会出现的,页面并不报错,只是后台会出现警告信息。
     
    如果下面的方法
            public     Object   getBean(String   beanName)  
            {  
                    if(context   ==   null)  
                            init1();  
                    return   context.getBean(beanName);  
            }  
    改成      
            public     Object   getBean(String   beanName)  
            {  
                    context   =   new   ClassPathXmlApplicationContext("Application-Context1.xml");                 return   context.getBean(beanName);  
            }就不会出现上面的警告,但是每次调用getBean 的时候,tomcat就会加载所有的bean,我觉得这样失去了意义。是不是还是我哪里配置的问题呢?
      

  4.   

    private     ApplicationContext   context;  改成 private  static ApplicationContext   context;  相应的方法全部改静态应该就OK了
      

  5.   

    改成 private  static ApplicationContext   context;   以后还是出现警告信息
    如果一直访问页面没问题,只是如果中间停了一会再访问就会出现警告信息
      

  6.   

    java.sql.SQLException:   [Microsoft][SQLServer   2000   Driver   for   JDBC]Object   has   been   closed.  
    这个是你的错误点,数据库都没有打开,怎么操作!!