2013-03-25 2 views
0

저는 꽤 새로운 C#과 MVC입니다. 그리고 저는 이제 DB4o로 놀아 왔습니다. 나는 사용자가 제공 한 URL을 통해 영화를 긁어 모으는 연습 사이트를 만들었습니다. 필름은 db4o 데이터베이스에 저장됩니다. 그러나 이제는 사이트를 시작할 때마다 Db4objects.Db4o.Ext.DatabaseClosedException이 발생하는 것 같습니다.
throw됩니다. 나는 현재 연결을 닫지 않고 DB에 너무 많은 호출을하고 있다는 느낌이 들었다.Db4objects.Db4o.Ext.DatabaseClosedException throw됩니다

여기 내 컨트롤러가 있는데, 나는이 문제가 원인이라고 생각합니다. (가) 방법을 만들

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Mvc; 
    using MvcMovieDatabase.Models; 
    using Db4objects.Db4o; 
    using Db4objects.Db4o.Linq; 


    using System.IO;namespace MvcMovieDatabase.Controllers 
    { 
     public class HomeController : Controller 
     { 
      static string YapFileName = Path.Combine(  
      Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), 
          "moviesDB.yap"); 

    IObjectContainer db4o = Db4oEmbedded.OpenFile(YapFileName); 

    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     ViewBag.Message = "Your app description page."; 

     return View(); 
    } 

    public ActionResult Contact() 
    { 
     ViewBag.Message = "Your contact page."; 

     return View(); 
    } 

    [HttpGet] 
    public ActionResult Create() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(string movieURL) 
    { 
     Movie newMovie = new Movie(); 
     MovieDirectory dir = new MovieDirectory(); 

     newMovie = dir.GetMovieData(movieURL); 

     db4o.Store(newMovie); 

     db4o.Close(); 

     return RedirectToAction("Index"); 
    } 

    public ActionResult DB4o() 
    { 

     IEnumerable<Movie> allFilms = from movie in db4o.Query<Movie>() 
             select movie; 

     db4o.Close(); 

     return View(allFilms); 
    } 


    } 
} 

는 문자열을 사용하여 데이터를 잡기 위해 필요한 코드를 실행합니다. db4o 메소드는 db에서 저장된 데이터를 얻기 위해 쿼리를 실행합니다. 나는 그 문제를 발견 할 수 있는지를보기 위해 닫히고 스트림을 열어 보았지만 db40 메서드의 뷰 내에서이 코드 조각에 대해 동일한 예외를 던지기 시작했습니다.

@model IEnumerable<MvcMovieDatabase.Models.Movie> 

@{ 
     ViewBag.Title = "DB4o"; 
    } 

    <h2>DB4o</h2> 

    @foreach (var item in Model) 
    { 
     foreach (var cast in item.MovieCastList) 
     { 
      <p><img src="@cast.CastImage" /></p> 
      <p>@cast.CastRealName | <span>@cast.CastFilmName</span></p> 
     } 
    } 

그러나 이것은 아마도 내 간섭에 의한 것일 수 있습니다. 이 문제에 도움을 주셔서 감사합니다.

답변

1

문제는 각 작성 후에 연결을 닫는 것으로 보입니다. db4o ObjectContainers는 응용 프로그램이 실행될 때마다 열려 있도록 유지됩니다. 자세한 내용은 this link을보십시오. 당신은 여전히 ​​열고 각 업데이트 후 연결을 종료하고자하는 경우

은, 당신은) (당신은 한 번 개체 컨테이너를 열고있다

IObjectContainer db4o = Db4oEmbedded.OpenFile(YapFileName); 

만들기 방법의 시작 부분에 다음 줄을 배치해야하지만 각 거래 후에 그것을 닫는다.

희망이 도움이됩니다.

0

Gonzalo가 설명했듯이 응용 프로그램에서 db4o 세션을 닫지 않아야합니다. 고립 된 거래를 사용하려면 OpenSession을 다음과 같이 사용하십시오 :

IEnumerable allFilms = null; 
using (var session = db4o.Ext().OpenSession()) 
{ 
    // query 
    allFilms = from movie in session.Query() 
       select movie; 

    // do object activation here or rely on default activation level 
    foreach (var movie in allFilms) 
    { 
     session.Activate(movie, int.MaxValue); 
    } 
} 

return View(allFilms); 
관련 문제