LuaのウェブフレームワークLapisでDBに接続してクエリを実行してみました。
現在利用できるDBはPostgreSQLのみです。
postgresモジュール
OpenRestyにpostgresモジュールを組み込みます。
1 2 3 |
$ ./configure --with-luajit --with-http_postgres_module $ make $ sudo make install |
データベース作成
1 |
$ createdb test -E UTF8 |
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE users ( id serial primary key, name varchar(255) NOT NULL, email varchar(255) NOT NULL, create_at timestamp default now(), update_at timestamp default now() ); insert into users (name,email) values('鈴木一郎', 'ichiro@domain.jp'); insert into users (name,email) values('山田太郎', 'taro@domain.jp'); insert into users (name,email) values('河野花子', 'hanako@domain.jp'); |
データベース接続設定
config.moonというファイルを作ります。[user],[password]などは環境にあわせて書き換えてください。
config.moon
1 2 3 4 |
import config from require "lapis.config" config "development", -> postgresql_url "postgres://[user]:[password]@[host]/[dbname]" |
更にnginx.confのserverセクションに以下を追加します。
1 2 3 |
upstream database { postgres_server ${{pg POSTGRESQL_URL}}; } |
web.moonにDB検索用のコードを追加します。
web.moon
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
lapis = require "lapis" console = require "lapis.console" db = require "lapis.db" lapis.serve class extends lapis.Application "/": => "Welcome to Lapisss #{require "lapis.version"}" "/list": => res = db.query "SELECT * FROM users" "ok!" "/console": console.make! |
lapis serverを起動して、http://localhost:8080/listにアクセスすると以下のエラーが表示されます。
1 |
/usr/local/share/lua/5.1/lapis/nginx/postgres.lua:40: found RDS format version 1129268257, but we can only handle version 3 |
このエラーは、nginx.confの設定漏れで、serverセクションに以下を追加すれば解決します。
1 2 3 4 5 |
location = /query { internal; postgres_pass database; postgres_query $echo_request_body; } |
クエリの実行
web.moonのクエリの結果は以下のようなテーブルに格納されています。lapisのコンソールで確認すると以下の通りのテーブルとなっています。
ベンチマーク
abベンチをとってみました。使っているDBが異なりますが、PHPのフレームワークPhalconやFuel(Phalcom、Fuleのベンチマークはこちら)に比べかなり高速です。
キャッシュなし
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
$ ab -n 1000 http://localhost:8080/list This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: ngx_openresty/1.2.8.6 Server Hostname: localhost Server Port: 8080 Document Path: /list Document Length: 93 bytes Concurrency Level: 1 Time taken for tests: 4.601 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 244000 bytes HTML transferred: 93000 bytes Requests per second: 217.34 [#/sec] (mean) Time per request: 4.601 [ms] (mean) Time per request: 4.601 [ms] (mean, across all concurrent requests) Transfer rate: 51.79 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 4 4 1.5 4 18 Waiting: 4 4 1.5 4 18 Total: 4 5 1.5 4 18 Percentage of the requests served within a certain time (ms) 50% 4 66% 4 75% 4 80% 4 90% 5 95% 5 98% 6 99% 16 100% 18 (longest request) |
キャッシュあり
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
$ ab -n 1000 http://localhost:8080/list This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: ngx_openresty/1.2.8.6 Server Hostname: localhost Server Port: 8080 Document Path: /list Document Length: 93 bytes Concurrency Level: 1 Time taken for tests: 0.966 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 244000 bytes HTML transferred: 93000 bytes Requests per second: 1035.66 [#/sec] (mean) Time per request: 0.966 [ms] (mean) Time per request: 0.966 [ms] (mean, across all concurrent requests) Transfer rate: 246.78 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 0 Processing: 0 1 0.4 1 9 Waiting: 0 1 0.4 1 9 Total: 0 1 0.5 1 9 Percentage of the requests served within a certain time (ms) 50% 1 66% 1 75% 1 80% 1 90% 1 95% 2 98% 2 99% 2 100% 9 (longest request) |