C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: SQLiteの同時アクセスでエラー


(過去ログ 123 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■73346 / inTopicNo.1)  SQLiteの同時アクセスでエラー
  
□投稿者/ のせんす (1回)-(2014/09/15(Mon) 16:41:45)

分類:[VB.NET/VB2005 以降] 

SQLiteで、ネットワ2ークディスクにある、郵便番号KEN_ALL.dbの総行数を取得するものです
データは12万件程度あります。1台のパソコンから実行すると、1回目所用時間5秒程度、2回目

1秒程度です、
2台のパソコンで、このプログラムを実行して同時にアクセスすると、場合によって症状は異なりま

す。
2台とも5秒程度で良好
2回目は、2台とも1秒程度
1台は、15秒程度処理時間がかかる。もう一台は、5秒程度
2台とも15秒程度
二台ともダンマリとなって、強制終了しなくてはならない。
この様に症状はさまざまです。

排他制御の関係かと
Connection.ConnectionString = "Version=3;Data Source=" & db_now_path & ";New=False;Compress=True;isolation_level=Exclusive"
としてみたり、Differed、Immediate、Exclusiveと全部指定してみましたが、
どれも大差ありませんでした。

データの件数の少ないものでは、二人で同時実行しても発生しません。

Imports System
Imports System.Management
Imports System.Text
Imports System.Windows.Forms
Imports System.Data
Imports System.Data.SQLite
Imports System.IO
Public Class Form1
Public db_now_path As String
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
db_now_path = "\\LANDISK\disk\郵便番号KEN_ALL.db"
table_row() '総行数取得
End Sub
Function table_row() '総行数取得
Dim Transact As SQLiteTransaction 'トランザクションクラス
Dim Connection As New SQLiteConnection
Dim Command As SQLiteCommand
Dim DataReader As SQLiteDataReader
Connection.ConnectionString = "Version=3;Data Source=" & db_now_path ' &

";New=False;Compress=True;"
Connection.Open()
Transact = Connection.BeginTransaction 'トランザクションスタート
Command = Connection.CreateCommand 'コマンド作成
Command.CommandText = "select count(*) from table1" '総行数取得
Command.ExecuteNonQuery() 'SQLを実行
DataReader = Command.ExecuteReader
table_row = DataReader.Item(0).ToString '総行数取得
Transact.Commit() 'データをコミット
DataReader.Close()
Command.Dispose()
Connection.Close()
Connection.Dispose()
MsgBox(table_row)
Exit Function
End Function
End Class

引用返信 編集キー/
■73355 / inTopicNo.2)  Re[1]: SQLiteの同時アクセスでエラー
□投稿者/ のせんす (2回)-(2014/09/16(Tue) 13:59:51)
この症状について、追記します。

2台のパソコンで、同時アクセスしなくても、同じ症状が発生します。
片側のパソコンで一度でも、データベースにアクセスした後は、この症状が発生します。

引用返信 編集キー/
■73362 / inTopicNo.3)  Re[2]: SQLiteの同時アクセスでエラー
□投稿者/ jin (1回)-(2014/09/17(Wed) 09:56:52)
いくつか突っ込みどころがありそうですが、
データ更新を行わないのに、どうしてトランザクションを開始しているのでしょうか?
本当は、件数取得以外に何か処理を入れていませんか?
そこで例外が発生しているにもかかわらずきちんと処理がされていなくて、
DB関連のオブジェクトが閉じていない、なんてことはないでしょうか?

引用返信 編集キー/
■73371 / inTopicNo.4)  Re[3]: SQLiteの同時アクセスでエラー
□投稿者/ のせんす (3回)-(2014/09/17(Wed) 15:37:14)
No73362 (jin さん) に返信
ご回答有り難う御座います。
トランザクションは、必要ありませんね。外しました。
件数取得以外には、何も行っていません。
System.Data.SQLite.dllが、おかしいのかと思い、参照をやりなおしたりもしました。
状況はかわりません。
デバッグ実行時に、
System.Data.SQLite.dll' が読み込まれました。PDB ファイルを開けないか、ファイルが見つかりません。
が出ていました。意味を調査中ですが、今のところ良くわかりません。
Visual Studio Express 2013なので、Visual Studio 2008のレギュラー版で再度テストしてみようかと
考えているところです。


引用返信 編集キー/
■73377 / inTopicNo.5)  Re[4]: SQLiteの同時アクセスでエラー
□投稿者/ のせんす (4回)-(2014/09/18(Thu) 00:01:34)
Visual Studio 2005で作り替えてみました。
同時アクセスすると、15秒以上かかってみたりします。
片方づつアクセスすると、おかしくなることは無い様です。

Imports System.Data.SQLite
Public Class Form1
Public db_now_path As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Connection As New SQLiteConnection
Dim Command As SQLiteCommand
Dim msg_t As String
Connection.ConnectionString = "Version=3;Data Source=//pc100/test/住所の郵便番号_読み仮名_KEN_ALL.db;New=False;Compress=True;"
Connection.Open()
Command = Connection.CreateCommand
Command.CommandText = "select count(*) from table1" '総行数取得
Try
msg_t = CStr(Command.ExecuteScalar())
Finally
Command.Dispose()
Connection.Close()
Connection.Dispose()
End Try
MsgBox(msg_t)
End Sub
End Class
引用返信 編集キー/
■73383 / inTopicNo.6)  Re[5]: SQLiteの同時アクセスでエラー
□投稿者/ daive (31回)-(2014/09/18(Thu) 10:54:12)
2014/09/18(Thu) 11:12:34 編集(投稿者)
2014/09/18(Thu) 11:12:25 編集(投稿者)

私の場合は、SQLiteはテスト環境レベルでの使用経験しかないので、
この件は興味を持って、拝見させていただいています。

>db_now_path = "\\LANDISK\disk\郵便番号KEN_ALL.db"
から、
>Connection.ConnectionString = "Version=3;Data Source=//pc100/test/住所の郵便番号_読み仮名_KEN_ALL.db;New=False;Compress=True;"
で、IOデータか、バッファローのLANDISKの様なネットワークドライブから、
PCの共有フォルダになっているように見えるのはなぜでしょう?
⇒環境を変更したのでしょうか?

SQLiteの動作環境って、ネット検索で出てくる記事では、
1.DBのファイルは、ローカルドライブで、一つのアプリからの使用を想定している。
2.複数から使用する場合に、複数からのアップデートや、インサートを行うと、DBを壊す可能性がある。
3.LANDISKや、ネットワーク共有フォルダでの動作は、保障されているかどうかは、不明。
との理解ですが、違うのかな?

MSの記事だから、MS−SQLよりかも
SQLite の内部
http://msdn.microsoft.com/ja-jp/magazine/ff898405.aspx
の、「制限事項」の様な記述も

本家英語サイトを参照するのが良いのでしょうねぇ。
引用返信 編集キー/
■73388 / inTopicNo.7)  Re[6]: SQLiteの同時アクセスでエラー
□投稿者/ のせんす (5回)-(2014/09/18(Thu) 13:49:39)
No73383 (daive さん) に返信
ええ?!そんな。とても肝心な事ですよね。当然ネットワーク共有で使えるのを前提に考えているのですが。
それでなければ、どんな使い道があるのか私の乏しい知識では納得いかないです。(笑)
以下の物によると、危ない → 共有しない方がいい → 共有出来ないと言う結果の様な。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14128290389
引用返信 編集キー/
■73409 / inTopicNo.8)  Re[7]: SQLiteの同時アクセスでエラー
□投稿者/ のせんす (8回)-(2014/09/23(Tue) 13:41:46)
2014/09/23(Tue) 13:42:24 編集(投稿者)

みなさんご回答大変有り難う御座いました。
現状わかったことは、SQLiteは、複数からのアップデートや、インサートを行うと、DBを壊す可能性がある。
と言うことと、今回の現象は、読込のみでも、レスポンスが非常に悪くなると言うことです。
つまり、ネットワーク上にデータベースファイルを置いて、共有する事は出来そうにありません。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -