SQLite3の.sqlite3ファイル操作中の挙動メモ

最近ゲームサーバーのランキングデータを、

簡単に扱えるSQLite3を使って運用した際に、びっくりした挙動もメモ。

即席で作ったのでベタソース2枚のみw

構成

  • SQLite3のsqlite3ファイルをマスター用とスレーブ(読み取り専用)用の2つ用意し、
  • Redisをキャッシュ&集計処理用として利用をしていて。

下記のようなアクセスが秒間で数十あり。


// redisから現在のスコア取得 $currentScore = $redis->hGet('score', $_user); // SQliteで現在順位を取得 $pdo = new PDO('sqlite:db.sqlite3', "", ""); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("SELECT * FROM rankTable order by abs( ? - score) limit 1"); $stmt->execute([$currentScore]); $searchRank = $stmt->fetch();

毎回ソートとする集計はさすがに重いので、

下記のようなバッチソースをcronで一定間隔で集計。


// sqlite3ファイル上書きコピー if( copy($MasterDbFile, $ReadDbFile) ){ echo "db 上書きOK"; }else{ alertPush("sqlitecopy エラー"); }

このsqlite3ファイル、、毎回copyで上書きしている、、、!!!!
なのに、ReadDbFileのsqlite3ファイルへの接続は、、、

なんと生きているんす、、!!!

普通にselectで検索できちゃってます。。!

コピー中にアクセスしてもエラーにならない、、ロック処理みたいのがはたらいるのかな。。特に意識せずにやってけど、、

実際数十万のスコアデータランキングを格安(月額1000円未満の1台)サーバーでやって一度もエラーになっていませんでした(今のところ)wすごい

adbを使って、androidのエミュレータ内のsqlite3やプリファレンスをチェックする

アンドロイド開発で、sqliteのデータや、
プリファレンスの中身を見たい時のチェック方法メモ。

まずadbが使える状況で、

$ adb devices

で、利用できるデバイス一覧が表示されます。

$ adb devices
List of devices attached 
37c70c34320b3d7 device

利用したいデバイスを下記コマンドで指定し、shell。

$ adb -s emulator-5554 shell

するとエミュレータ内で色々コマンドが実行できるようになる。

#ls
#pwd
#cd
#cat
・・・等々

本題のsqlite3やプリファレンスのデータを見るにはまず、そのファイルの場所にいきます。

◆プリファレンスの場所は下記、

#cat /data/data/対象のアプリのパッケージ名/shared_prefs/プリファレンス名.xml

実はxml形式だったのね。

◆sqlite3のデータの場所は下記、

#sqlite3 /data/data/対象のアプリのパッケージ名/databases/データベース名.db 
あとは好きなようにsqlite3のコマンドで、.tableしたりselectしたりできます。