문제

사람이 페이지를로드 할 때마다 텍스트 파일에 몇 가지 통계를 작성하고 싶습니다. 그러나 잠시 동안 나는 '이미 사용중인 파일을 열 수 없다' '유형의 오류가 발생합니다. 이 오류를 100% 복제 할 수는 없습니다. 매우 불규칙합니다. 내 코드입니다

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month

    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim objStreamWriter As StreamWriter
    objStreamWriter = File.AppendText(FILENAME)
    objStreamWriter.WriteLine(ad_id & ";" & ad_date)
    objStreamWriter.Close()
End Sub

내 질문은, 파일을 어떻게 잠그고 잠금 해제하여 불규칙한 오류가 발생하지 않습니까?

감사

도움이 되었습니까?

해결책

짧은 임의의 간격 후에는 예외를 처리하고 파일에 쓰기를 다시 작성할 수있는 처리를 작성해야합니다.

너무 많은 경합을 받으면 데이터베이스의 테이블에 로그인하고 파일로 내보내는 프로세스를 작성하는 것이 더 합리적 일 수 있습니다 (여전히 필요한 경우).

다른 팁

두 개 이상의 요청이 거의 동시에 웹 서버에 도달하면 모두 동일한 파일을 열려고합니다. 각 요청에 대해 고유 한 파일 이름을 만들어야합니다.

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month
    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim index As Integer

    Using fs As New IO.FileStream(FILENAME, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.ReadWrite), _
          tl As New TextWriterTraceListener(fs)

        index = Trace.Listeners.Add(tl)
        Trace.WriteLine(ad_id & ";" & ad_date)
        Trace.Listeners(index).Flush()
        Trace.Flush()
    End Using
    Trace.Listeners.RemoveAt(index)
End Sub

여기에 세 가지 중요한 사항 :

  1. io.fileshare.ReadWrite 사용을 한 번에 파일의 여러 작가를 허용합니다.
  2. 예외가 발생하더라도 스트림이 즉시 닫히는지 확인하기위한 사용 명령문. 이것은 충돌을 최소화합니다
  3. TextWriterTraceListener는 요청한 파일을 열 수없는 경우 Temp 파일을 작성하여 메시지를 잃지 않도록합니다.

다음을 사용하여 짧은 정보에 문제가 없었습니다. file.appendalltext (Path, Info);

자물쇠를 일으키는 댓글과 관련하여 반사기에서 Joel이 설명한 동일한 옵션을 사용합니다. 트레이스 작가를 사용하지 않으므로 부하 / 큰 컨텐츠의 경우 문제를 일으키는 경우 임시 파일로 출력하지 않습니다.

정보가 크면 별도의 파일을 원합니다. 높은 부하의 경우 Joel의 제안과 함께 이동하여 Temp 파일을 만들 것입니다. Temp 파일은 파일에서 예외를 포착하여 동일한 파일을 사용하여 고유 한 파일을 사용하여 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top