日期:2014-05-17  浏览次数:20831 次

tomcat连接池,重复多次调用方法出错: Connection is closed
配置了一个tomcat连接池,

然后多次重复调用下面方法getStaticEntiy() ,部分能获取数据,部分报错误:java.sql.SQLException: Connection is closed

大家帮忙看看,是什么原因导致的?看看有什么优化方法 ?谢了!!

--获取连接池--
Java code
public class DBPool
{
    private static DataSource    pool;
    static
    {
        Context env = null;
        try
        {
            env = (Context) new InitialContext().lookup("java:comp/env");
            pool = (DataSource) env.lookup("jdbc/DBpool");
            if(pool == null)
                System.err.println("'DBpool' is an unknown DataSource");
        }
        catch (NamingException ne)
        {
            ne.printStackTrace();
        }
    }

    public static DataSource getPool()
    {
        return pool;
    }
}



--getStaticEntity() 方法:--
Java code

public byte[] getStaticEntiy(String pmname, int scalesize, float x, float y)
    {
        byte[] bContent = null;
        try
        {
            conn = DBPool.getPool().getConnection();    //获取连接池中的链接

            bContent = scaledao.getStaticEntiy(pmname, scalesize, x, y, conn);    //这是一般的从数据库读取流数据的方法    
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(conn!=null){
                try
                {
                    conn.close();                   //释放链接
                }
                catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
        
        return bContent;
    }





------解决方案--------------------
conn = DBPool.getPool().getConnection(); //获取连接池中的链接

-----------------------------------------------------
在这个论坛上我也说过很多次了,如果没有很高的面向对象程序设计水平,请不要把数据库连接对象:
Connection, PreparedStatement, ResultSet 等设为成员变量!因为设成成员变量在多个请求同时访
问时会产生严重的问题(大量的数据库连接无法释放),特别是在设计不是很好的情况下。

因此建议将这些对象置为局部变量。