2

私は冬眠してそれを使用しようとしているのが初めてなので、学習目的で、基準APIを使用している場所とHQLを使用している場所があります。

アプリケーションは正常に動作していますが、問題は 5 ~ 6 回実行した後、JDBC 接続が開かれなくなり、そこでアプリケーションがハングします。

ログには...JDBC接続を開いています...それだけです。

私はいくつかのドキュメントを読みましたが、これはセッションを開いた後に解放しないためだと言っています。

これは私が実行している機能です。

    public List<Place> getAllPlaces() {

        Session session = getSession();
        Criteria cr = session.createCriteria(Place.class);
        List ls= cr.list();

        session.close();

        return ls;

    }


    public List<User> getAllUser() {

        Session session = getSession();
        Criteria cr = session.createCriteria(User.class);
        List ls= cr.list();

        session.close();

        return ls;
    }

    public List<Carpooler> getAllCarpooler() {

        Session session = getSession();
        Criteria cr = session.createCriteria(Carpooler.class);
        List ls= cr.list();

        session.close();

        return ls;

    }

    public List<SourceToDestinationDetails> getAllSourceToDestinationDetailsbyCarpooler(
            Carpooler carpooler) {

        Session session = getSession();
        Criteria cr = session.createCriteria(SourceToDestinationDetails.class);
        cr.add(Expression.eq("listOfSourceToDestinationDetails",carpooler));
        List ls= cr.list();

        session.close();

        return ls;
    }

    public List<Carpooler> getExactMatchCarpooler(String from, String to) {

        log.debug("Request received for fetching Exact match Carpooler.");

        List<Carpooler> listOfFinalCarpooler = new ArrayList<Carpooler>();

        List list = null;
        try{
            list = getHibernateTemplate().findByNamedQueryAndNamedParam("findExactMatchingCarpooler", new String[]{"source","destination"}, new String[]{from,to});

            if(list!=null){
                log.debug("Fetched Exact match carpooler list is :"+list.toString());

                for (int j = 0; j < list.size(); j++) {
                    Object[] l = (Object[])list.get(j);

                        Carpooler c = (Carpooler)l[0];
                        SourceToDestinationDetails std = (SourceToDestinationDetails)l[1];

                        Carpooler c1 = new Carpooler();
                        c1.setCarpoolerCreationDate(c.getCarpoolerCreationDate());
                        c1.setCarpoolerId(c.getCarpoolerId());
                        c1.setDrivingLicenceNumber(c.getDrivingLicenceNumber());
                        c1.setUser(c.getUser());
                        c1.setListOfVehicleDetails(c.getListOfVehicleDetails());
                        c1.setUserType(c.getUserType());

                        List<SourceToDestinationDetails> listOfSourceToDestinationDetails =new ArrayList<SourceToDestinationDetails>();
                        listOfSourceToDestinationDetails.add(std);

                        c1.setListOfSourceToDestinationDetails(listOfSourceToDestinationDetails);

                        listOfFinalCarpooler.add(c1);

//                      log.debug("Carpooler is :"+c.getCarpoolerId());
//                      log.debug("SourceToDestinationDetails is :"+std.getSourceToDestinationId());
                }


            }else{
                log.debug("List is null");
            }



        log.debug("Returning back from fetching Exact match Carpooler");

            return listOfFinalCarpooler;
        }catch(Exception e){
            log.error("Exception Occurred while fetching Exact Match Result :"+e.getMessage());
        }
    return null;    
}

ログ

2012-12-28 10:32:33,529 DEBUG http-8080-4 [DashboardController.getLoginPage1] - Fetching list of all user, to display count on home page.
2012-12-28 10:32:33,529 DEBUG http-8080-4 [SessionFactoryUtils.doGetSession] - Opening Hibernate Session
2012-12-28 10:32:33,530 DEBUG http-8080-4 [SessionImpl.<init>] - opened session at timestamp: 13566709535
2012-12-28 10:32:33,531 DEBUG http-8080-4 [AbstractBatcher.logOpenPreparedStatement] - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2012-12-28 10:32:33,531 DEBUG http-8080-4 [ConnectionManager.openConnection] - opening JDBC connection

誰かが私が間違っているところを教えてくれますか?

4

1 に答える 1

1

HibernateDaoSupport.getSession()メソッドを使用してセッションを取得しようとしています。

API によると、

これは HibernateTemplate コードから呼び出されることを意図したものではなく、単純な Hibernate コードで呼び出されることを意図していることに注意してください。スレッドにバインドされたセッションに依存するか、releaseSession(org.hibernate.Session) と組み合わせて使用​​します。

そのため、以下のようにHibernateDaoSupport.releaseSession(org.hibernate.Session)メソッドを使用して、 の代わりに開いているセッションを閉じますsession.close()

releaseSession(session);
于 2012-12-30T04:16:27.280 に答える