-1

私はliferay 6.1を使用していて、カスタムポートレットを作成しました。その中で、次のようにデータベースからレコードを直接取得するカスタムクエリを使用しています....

public List<DashBoardBean> GetPieChartDataForCampaignbyOrganization(
            ThemeDisplay pThemeDisplay) {

        log.info("In GetPieChartDataForCampaignbyOrganization ");
        Context CtxObj;
        long pParentOrgId;
        ResultSet advResultSet = null;
        List<DashBoardBean> dashboardbeanObjList = new ArrayList<DashBoardBean>();
        try {

            CtxObj = new InitialContext();
            DataSource DsObj = (DataSource) CtxObj
                    .lookup("java:comp/env/jdbc/Liferay");
            Connection ConObj = DsObj.getConnection();
            Statement sStmtObj = ConObj.createStatement();

            advResultSet = sStmtObj
                    .executeQuery("MY CUSTOM QUERY WILL BE HERE");
            while (advResultSet.next()) {
                DashBoardBean dashboardbeanObj = new DashBoardBean();
                dashboardbeanObj
                        .setsOrganizationName(advResultSet.getString(1));
                dashboardbeanObj.setlOrganizationCount(advResultSet.getLong(2));
                dashboardbeanObjList.add(dashboardbeanObj);
            }
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            dashboardbeanObjList = null;
            e.printStackTrace();
        } catch (SQLException e) {
            dashboardbeanObjList = null;
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (PortalException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        log.info("Leave GetPieChartDataForCampaignbyOrganization ");
        return dashboardbeanObjList;
    }

上記は私の関数のコードスニペットです...同じ構造の関数が5つ以上あります... SQLクエリだけが機能が異なります...

今の問題は、ページの読み込みでこのような5つ以上の関数を呼び出さなければならないことです...そのため、ページを頻繁にリロードするために使用すると...次のようなエラーが発生します...

   org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
        at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
        at emenu.advertise.appbl.DashBoardCustomQuery.GetPieChartDataForCampaignStatus(DashBoardCustomQuery.java:112)
        at emenu.advertise.appbl.DashBordBL.GetPieChartDataForCampaignStatus(DashBordBL.java:292)
        at emenu.advertise.portlet.RestaurantPortlet.serveResource(RestaurantPortlet.java:402)
        at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:118)
        at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:71)
        at com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:111)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:72)
        at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:73)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
        at com.liferay.portlet.InvokerPortletImpl.invoke(InvokerPortletImpl.java:531)
        at com.liferay.portlet.InvokerPortletImpl.invokeResource(InvokerPortletImpl.java:626)
        at com.liferay.portlet.InvokerPortletImpl.serveResource(InvokerPortletImpl.java:436)
        at com.liferay.portal.action.LayoutAction.processPortletRequest(LayoutAction.java:1075)
        at com.liferay.portal.action.LayoutAction.processLayout(LayoutAction.java:719)
        at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:249)
        at ............................
.......java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
            at java.lang.Thread.run(Thread.java:619)
        Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
            at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1171)
            at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
            ... 131 more
        09:24:11,163 INFO  [http-bio-8080-exec-5][DashBoardCustomQuery:665] Leave GetHighestClickRestaurantName 
        09:24:11,163 INFO  [http-bio-8080-exec-5][DashBoardCustomQuery:304] Leave GetLineChartDataForHighestClickedByRestaurant 
        09:24:11,164 INFO  [http-bio-8080-exec-5][DashBordBL:166] Leave GetLineChartDataByRestaurant From DashBordBl

私は何か間違ったことをしたことを知っています...しかし、どこにあるのかわかりません...おそらく、サーバーからSQL接続が失われたため///接続を閉じていないためです...助けてください。 ..そして、どこが間違っているかを修正してください...他の関数からデータを取得するために使用した方法で、関数の例を1つ示しました...

4

1 に答える 1

-1

クエリの実行後に接続オブジェクトを閉じたことがないため、解決策を見つけました.catchブロックを試した後、次のように機能します...

finally {
             try {
                 if(CtxObj!=null)   {
                     CtxObj.close();
                    }
                    if(sStmtObj!=null){
                        sStmtObj.close();
                    }
                    if(ConObj!=null){
                        ConObj.close();
                    }
            } catch (NamingException e) {
                // TODO Auto-generated catch block
                log.info(e);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                log.info(e);
            }
        }
于 2013-03-08T13:38:16.147 に答える