Browse Source

[ci fw-only Go/atreugo Go/aah Go/beego Go/chi Go/echo Go/go-std Go/iris Go/gin Go/goji GO/fasthttp] Fix max db conns in iris, atreugo, go-std; add atreugo-gojay, atreugo-easyjson, atreugo-sjson (#4574)

chunariov 6 years ago
parent
commit
f7802d57e0

+ 15 - 0
frameworks/Go/atreugo/atreugo-easyjson-prefork.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db pgx -json_encoder easyjson -prefork

+ 15 - 0
frameworks/Go/atreugo/atreugo-easyjson.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db pgx -json_encoder easyjson

+ 15 - 0
frameworks/Go/atreugo/atreugo-gojay-prefork.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db pgx -json_encoder gojay -prefork

+ 15 - 0
frameworks/Go/atreugo/atreugo-gojay.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db pgx -json_encoder gojay

+ 15 - 0
frameworks/Go/atreugo/atreugo-sjson-prefork.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db pgx -json_encoder sjson -prefork

+ 15 - 0
frameworks/Go/atreugo/atreugo-sjson.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db pgx -json_encoder sjson

+ 126 - 0
frameworks/Go/atreugo/benchmark_config.json

@@ -47,6 +47,132 @@
       "notes": "",
       "notes": "",
       "versus": "go"
       "versus": "go"
     },
     },
+    "easyjson": {
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
+    },
+    "easyjson-prefork": {
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
+    },
+    "gojay": {
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
+    },
+    "sjson": {
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
+    },
+    "sjson-prefork": {
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
+    },
+    "gojay-prefork": {
+      "json_url": "/json",
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
+    },
     "quicktemplate": {
     "quicktemplate": {
       "fortune_url": "/fortune-quick",
       "fortune_url": "/fortune-quick",
       "port": 8080,
       "port": 8080,

+ 6 - 4
frameworks/Go/atreugo/src/go.mod

@@ -2,19 +2,21 @@ module atreugo/src
 
 
 require (
 require (
 	github.com/cockroachdb/apd v1.1.0 // indirect
 	github.com/cockroachdb/apd v1.1.0 // indirect
+	github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0
 	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
 	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
 	github.com/jackc/pgx v3.3.0+incompatible
 	github.com/jackc/pgx v3.3.0+incompatible
-	github.com/json-iterator/go v1.1.6 // indirect
-	github.com/klauspost/compress v1.4.1 // indirect
-	github.com/klauspost/cpuid v1.2.0 // indirect
 	github.com/kr/pretty v0.1.0 // indirect
 	github.com/kr/pretty v0.1.0 // indirect
 	github.com/lib/pq v1.0.0 // indirect
 	github.com/lib/pq v1.0.0 // indirect
-	github.com/mailru/easyjson v0.0.0-20190221075403-6243d8e04c3f
+	github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe
 	github.com/pkg/errors v0.8.1 // indirect
 	github.com/pkg/errors v0.8.1 // indirect
 	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/savsgio/atreugo/v7 v7.1.1
 	github.com/savsgio/atreugo/v7 v7.1.1
 	github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect
 	github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect
 	github.com/stretchr/testify v1.3.0 // indirect
 	github.com/stretchr/testify v1.3.0 // indirect
+	github.com/tidwall/gjson v1.2.1 // indirect
+	github.com/tidwall/match v1.0.1 // indirect
+	github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51 // indirect
+	github.com/tidwall/sjson v1.0.4
 	github.com/valyala/quicktemplate v1.0.2
 	github.com/valyala/quicktemplate v1.0.2
 	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
 	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
 )
 )

+ 15 - 8
frameworks/Go/atreugo/src/go.sum

@@ -4,19 +4,18 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/fasthttp/router v0.3.3 h1:pbXxvJqqb4PeNIIS//DwOtimK9hYchl33eoVgeIMNM8=
 github.com/fasthttp/router v0.3.3 h1:pbXxvJqqb4PeNIIS//DwOtimK9hYchl33eoVgeIMNM8=
 github.com/fasthttp/router v0.3.3/go.mod h1:lCf2TfRIzs3lgcFUGQah09Wu5BiEHcBPl3vm9QiXNTo=
 github.com/fasthttp/router v0.3.3/go.mod h1:lCf2TfRIzs3lgcFUGQah09Wu5BiEHcBPl3vm9QiXNTo=
+github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0 h1:RkFZ/6Hc9fBqO3eSAmlLdBfQc4sEHSOg4P/zQRhJQcE=
+github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0/go.mod h1:H8Wgri1Asi1VevY3ySdpIK5+KCpqzToVswNq8g2xZj4=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
 github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=
 github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=
 github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
 github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
+github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
 github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/klauspost/compress v1.4.0 h1:8nsMz3tWa9SWWPL60G1V6CUsf4lLjWLTNEtibhe8gh8=
 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E=
-github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e h1:+lIPJOWl+jSiJOc70QXJ07+2eg2Jy2EC7Mi11BWujeM=
 github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE=
-github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -24,8 +23,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
 github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/mailru/easyjson v0.0.0-20190221075403-6243d8e04c3f h1:B6PQkurxGG1rqEX96oE14gbj8bqvYC5dtks9r5uGmlE=
-github.com/mailru/easyjson v0.0.0-20190221075403-6243d8e04c3f/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w=
+github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
@@ -47,6 +46,14 @@ github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9Nz
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/tidwall/gjson v1.2.1 h1:j0efZLrZUvNerEf6xqoi0NjWMK5YlLrR7Guo/dxY174=
+github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA=
+github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
+github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
+github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51 h1:BP2bjP495BBPaBcS5rmqviTfrOkN5rO5ceKAMRZCRFc=
+github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tidwall/sjson v1.0.4 h1:UcdIRXff12Lpnu3OLtZvnc03g4vH2suXDXhBwBqmzYg=
+github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasthttp v0.0.0-20180905170723-c6fd90e432cc/go.mod h1:+g/po7GqyG5E+1CNgquiIxJnsXEi5vwFn5weFujbO78=
 github.com/valyala/fasthttp v0.0.0-20180905170723-c6fd90e432cc/go.mod h1:+g/po7GqyG5E+1CNgquiIxJnsXEi5vwFn5weFujbO78=

+ 4 - 4
frameworks/Go/atreugo/src/handlers/handlers.go

@@ -25,12 +25,15 @@ func queriesParam(ctx *atreugo.RequestCtx) int {
 func JSONHandler(ctx *atreugo.RequestCtx) error {
 func JSONHandler(ctx *atreugo.RequestCtx) error {
 	message := MessagePool.Get().(*Message)
 	message := MessagePool.Get().(*Message)
 	message.Message = "Hello, World!"
 	message.Message = "Hello, World!"
+
 	ctx.SetContentType("application/json")
 	ctx.SetContentType("application/json")
+
 	messageBytes, err := json.Marshal(message)
 	messageBytes, err := json.Marshal(message)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
 	_, err = ctx.Write(messageBytes)
 	_, err = ctx.Write(messageBytes)
+
 	MessagePool.Put(message)
 	MessagePool.Put(message)
 	return err
 	return err
 }
 }
@@ -45,6 +48,7 @@ func DBHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		}
 		}
 
 
 		ctx.SetContentType("application/json")
 		ctx.SetContentType("application/json")
+
 		worldBytes, err := json.Marshal(world)
 		worldBytes, err := json.Marshal(world)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
@@ -52,7 +56,6 @@ func DBHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		_, err = ctx.Write(worldBytes)
 		_, err = ctx.Write(worldBytes)
 
 
 		storage.WorldPool.Put(world)
 		storage.WorldPool.Put(world)
-
 		return err
 		return err
 	}
 	}
 }
 }
@@ -62,7 +65,6 @@ func QueriesHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
 		queries := queriesParam(ctx)
 
 
-		// worlds := make([]storage.World, queries)
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 
 
 		var err error
 		var err error
@@ -178,10 +180,8 @@ func UpdateHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
 		queries := queriesParam(ctx)
 		var err error
 		var err error
 
 
-		// worlds := make([]storage.World, queries)
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 
 
-		// for _, world := range worlds {
 		for i := 0; i < queries; i++ {
 		for i := 0; i < queries; i++ {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
 				log.Println(err)
 				log.Println(err)

+ 0 - 3
frameworks/Go/atreugo/src/handlers/handlers_easyjson.go

@@ -48,7 +48,6 @@ func QueriesHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
 		queries := queriesParam(ctx)
 
 
-		// worlds := make([]storage.World, queries)
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 
 
 		var err error
 		var err error
@@ -78,10 +77,8 @@ func UpdateHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
 		queries := queriesParam(ctx)
 		var err error
 		var err error
 
 
-		// worlds := make([]storage.World, queries)
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
 
 
-		// for _, world := range worlds {
 		for i := 0; i < queries; i++ {
 		for i := 0; i < queries; i++ {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
 				log.Println(err)
 				log.Println(err)

+ 92 - 0
frameworks/Go/atreugo/src/handlers/handlers_gojay.go

@@ -0,0 +1,92 @@
+package handlers
+
+import (
+	"log"
+
+	"github.com/francoispqt/gojay"
+
+	"atreugo/src/storage"
+
+	"github.com/savsgio/atreugo/v7"
+)
+
+// JSONHandlerGoJay . Test 1: JSON serialization
+func JSONHandlerGoJay(ctx *atreugo.RequestCtx) error {
+	message := MessagePool.Get().(*Message)
+	message.Message = "Hello, World!"
+
+	ctx.SetContentType("application/json")
+	err := gojay.NewEncoder(ctx).Encode(message)
+
+	MessagePool.Put(message)
+	return err
+}
+
+// DBHandlerGoJay . Test 2: Single database query
+func DBHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+	return func(ctx *atreugo.RequestCtx) error {
+		world := storage.WorldPool.Get().(*storage.World)
+
+		if err := db.GetOneRandomWorld(world); err != nil {
+			return err
+		}
+
+		ctx.SetContentType("application/json")
+		err := gojay.NewEncoder(ctx).Encode(world)
+
+		storage.WorldPool.Put(world)
+		return err
+	}
+}
+
+// QueriesHandlerGoJay . Test 3: Multiple database queries
+func QueriesHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+	return func(ctx *atreugo.RequestCtx) error {
+		queries := queriesParam(ctx)
+
+		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+
+		var err error
+		for i := 0; i < queries; i++ {
+			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
+				log.Println(err)
+			}
+		}
+
+		ctx.SetContentType("application/json")
+		err = gojay.NewEncoder(ctx).EncodeArray(storage.Worlds(worlds))
+
+		worlds = worlds[:0]
+		storage.WorldsPool.Put(worlds)
+
+		return err
+	}
+}
+
+// UpdateHandlerGoJay . Test 5: Database updates
+func UpdateHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+	return func(ctx *atreugo.RequestCtx) error {
+		queries := queriesParam(ctx)
+		var err error
+
+		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+
+		for i := 0; i < queries; i++ {
+			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
+				log.Println(err)
+			}
+		}
+
+		if err = db.UpdateWorlds(worlds); err != nil {
+			return err
+		}
+
+		ctx.SetContentType("application/json")
+		err = gojay.NewEncoder(ctx).EncodeArray(storage.Worlds(worlds))
+
+		worlds = worlds[:0]
+		storage.WorldsPool.Put(worlds)
+
+		return err
+	}
+}

+ 101 - 0
frameworks/Go/atreugo/src/handlers/handlers_sjson.go

@@ -0,0 +1,101 @@
+package handlers
+
+import (
+	"atreugo/src/storage"
+	"log"
+
+	"github.com/savsgio/atreugo/v7"
+)
+
+// JSONHandlerSJson . Test 1: JSON serialization
+func JSONHandlerSJson(ctx *atreugo.RequestCtx) error {
+	message := MessagePool.Get().(*Message)
+	message.Message = "Hello, World!"
+
+	ctx.SetContentType("application/json")
+	data, err := message.MarshalSJSON()
+	if err == nil {
+		_, err = ctx.Write(data)
+	}
+
+	MessagePool.Put(message)
+	return err
+}
+
+// DBHandlerSJson . Test 2: Single database query
+func DBHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+	return func(ctx *atreugo.RequestCtx) error {
+		world := storage.WorldPool.Get().(*storage.World)
+
+		if err := db.GetOneRandomWorld(world); err != nil {
+			return err
+		}
+
+		ctx.SetContentType("application/json")
+		data, err := world.MarshalSJSON()
+		if err == nil {
+			_, err = ctx.Write(data)
+		}
+
+		storage.WorldPool.Put(world)
+		return err
+	}
+}
+
+// QueriesHandlerSJson . Test 3: Multiple database queries
+func QueriesHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+	return func(ctx *atreugo.RequestCtx) error {
+		queries := queriesParam(ctx)
+
+		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+
+		var err error
+		for i := 0; i < queries; i++ {
+			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
+				log.Println(err)
+			}
+		}
+
+		ctx.SetContentType("application/json")
+		data, err := storage.Worlds(worlds).MarshalSJSON()
+		if err == nil {
+			_, err = ctx.Write(data)
+		}
+
+		worlds = worlds[:0]
+		storage.WorldsPool.Put(worlds)
+
+		return err
+	}
+}
+
+// UpdateHandlerSJson . Test 5: Database updates
+func UpdateHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+	return func(ctx *atreugo.RequestCtx) error {
+		queries := queriesParam(ctx)
+		var err error
+
+		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+
+		for i := 0; i < queries; i++ {
+			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
+				log.Println(err)
+			}
+		}
+
+		if err = db.UpdateWorlds(worlds); err != nil {
+			return err
+		}
+
+		ctx.SetContentType("application/json")
+		data, err := storage.Worlds(worlds).MarshalSJSON()
+		if err == nil {
+			_, err = ctx.Write(data)
+		}
+
+		worlds = worlds[:0]
+		storage.WorldsPool.Put(worlds)
+
+		return err
+	}
+}

+ 22 - 1
frameworks/Go/atreugo/src/handlers/message.go

@@ -1,12 +1,33 @@
 package handlers
 package handlers
 
 
-import "sync"
+import (
+	"sync"
+
+	"github.com/francoispqt/gojay"
+	"github.com/tidwall/sjson"
+)
 
 
 // Message struct
 // Message struct
 type Message struct {
 type Message struct {
 	Message string `json:"message"`
 	Message string `json:"message"`
 }
 }
 
 
+// MarshalJSONObject encodes the message as JSON
+func (m *Message) MarshalJSONObject(dec *gojay.Encoder) {
+	dec.AddStringKey("message", m.Message)
+}
+
+// IsNil returns true if the object is nil
+func (m *Message) IsNil() bool {
+	return m == nil
+}
+
+// MarshalSJSON marshals the object as json
+func (m Message) MarshalSJSON() ([]byte, error) {
+	return sjson.SetBytesOptions([]byte(`{"message": ""}`), "message", m.Message, &sjson.Options{Optimistic: true})
+	// &sjson.Options{Optimistic: true}
+}
+
 // MessagePool *sync.Pool
 // MessagePool *sync.Pool
 var MessagePool *sync.Pool
 var MessagePool *sync.Pool
 
 

+ 43 - 7
frameworks/Go/atreugo/src/main.go

@@ -6,11 +6,11 @@ import (
 	"net"
 	"net"
 	"runtime"
 	"runtime"
 
 
+	"github.com/savsgio/atreugo/v7"
+
 	"atreugo/src/handlers"
 	"atreugo/src/handlers"
 	"atreugo/src/storage"
 	"atreugo/src/storage"
 	"atreugo/src/templates"
 	"atreugo/src/templates"
-
-	"github.com/savsgio/atreugo/v7"
 )
 )
 
 
 func initPools() {
 func initPools() {
@@ -27,6 +27,7 @@ func main() {
 	bindHost := flag.String("bind", ":8080", "set bind host")
 	bindHost := flag.String("bind", ":8080", "set bind host")
 	prefork := flag.Bool("prefork", false, "use prefork")
 	prefork := flag.Bool("prefork", false, "use prefork")
 	child := flag.Bool("child", false, "is child proc")
 	child := flag.Bool("child", false, "is child proc")
+	jsonEncoder := flag.String("json_encoder", "none", "json encoder: none|easyjson|gojay|sjson")
 	dbDriver := flag.String("db", "none", "db connection driver [values: pgx || none]")
 	dbDriver := flag.String("db", "none", "db connection driver [values: pgx || none]")
 	dbConnectionString := flag.String("db_connection_string",
 	dbConnectionString := flag.String("db_connection_string",
 		"host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world sslmode=disable",
 		"host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world sslmode=disable",
@@ -34,10 +35,44 @@ func main() {
 	flag.Parse()
 	flag.Parse()
 
 
 	// init database with appropriate driver
 	// init database with appropriate driver
-	db, err := storage.InitDB(*dbDriver, *dbConnectionString)
+	db, err := storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU()*4)
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
+	if *child {
+		db, err = storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU())
+		if err != nil {
+			log.Fatal(err)
+		}
+	}
+
+	// init json encoders
+	var jsonHandler func(ctx *atreugo.RequestCtx) error
+	var dbHandler func(ctx *atreugo.RequestCtx) error
+	var queriesHandler func(ctx *atreugo.RequestCtx) error
+	var updateHandler func(ctx *atreugo.RequestCtx) error
+	switch *jsonEncoder {
+	case "easyjson":
+		jsonHandler = handlers.JSONHandlerEasyJSON
+		dbHandler = handlers.DBHandlerEasyJSON(db)
+		queriesHandler = handlers.QueriesHandlerEasyJSON(db)
+		updateHandler = handlers.UpdateHandlerEasyJSON(db)
+	case "gojay":
+		jsonHandler = handlers.JSONHandlerGoJay
+		dbHandler = handlers.DBHandlerGoJay(db)
+		queriesHandler = handlers.QueriesHandlerGoJay(db)
+		updateHandler = handlers.UpdateHandlerGoJay(db)
+	case "sjson":
+		jsonHandler = handlers.JSONHandlerSJson
+		dbHandler = handlers.DBHandlerSJson(db)
+		queriesHandler = handlers.QueriesHandlerSJson(db)
+		updateHandler = handlers.UpdateHandlerSJson(db)
+	default:
+		jsonHandler = handlers.JSONHandler
+		dbHandler = handlers.DBHandler(db)
+		queriesHandler = handlers.QueriesHandler(db)
+		updateHandler = handlers.UpdateHandler(db)
+	}
 
 
 	// init atreugo server
 	// init atreugo server
 	server := atreugo.New(&atreugo.Config{
 	server := atreugo.New(&atreugo.Config{
@@ -46,15 +81,16 @@ func main() {
 
 
 	// init handlers
 	// init handlers
 	server.Path("GET", "/plaintext", handlers.PlaintextHandler)
 	server.Path("GET", "/plaintext", handlers.PlaintextHandler)
-	server.Path("GET", "/json", handlers.JSONHandlerEasyJSON)
+	server.Path("GET", "/json", jsonHandler)
 	if db != nil {
 	if db != nil {
 		defer db.Close()
 		defer db.Close()
 		server.Path("GET", "/fortune", handlers.FortuneHandlerPool(db))
 		server.Path("GET", "/fortune", handlers.FortuneHandlerPool(db))
 		server.Path("GET", "/fortune-quick", handlers.FortuneQuickHandlerPool(db))
 		server.Path("GET", "/fortune-quick", handlers.FortuneQuickHandlerPool(db))
-		server.Path("GET", "/db", handlers.DBHandlerEasyJSON(db))
-		server.Path("GET", "/queries", handlers.QueriesHandlerEasyJSON(db))
-		server.Path("GET", "/update", handlers.UpdateHandlerEasyJSON(db))
+		server.Path("GET", "/db", dbHandler)
+		server.Path("GET", "/queries", queriesHandler)
+		server.Path("GET", "/update", updateHandler)
 	}
 	}
+
 	// check for prefork
 	// check for prefork
 	var listener net.Listener
 	var listener net.Listener
 	if *prefork {
 	if *prefork {

BIN
frameworks/Go/atreugo/src/src


+ 2 - 5
frameworks/Go/atreugo/src/storage/db.go

@@ -3,7 +3,6 @@ package storage
 import (
 import (
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
-	"runtime"
 
 
 	"atreugo/src/templates"
 	"atreugo/src/templates"
 )
 )
@@ -29,14 +28,12 @@ type DB interface {
 }
 }
 
 
 // InitDB with appropriate driver
 // InitDB with appropriate driver
-func InitDB(dbDriver, dbConnectionString string) (DB, error) {
+func InitDB(dbDriver, dbConnectionString string, maxConnectionCount int) (DB, error) {
 	var err error
 	var err error
 	var db DB
 	var db DB
 
 
 	if dbDriver == "pgx" {
 	if dbDriver == "pgx" {
-		db, err = NewPgxDB(
-			dbConnectionString,
-			runtime.NumCPU())
+		db, err = NewPgxDB(dbConnectionString, maxConnectionCount)
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Error opening postgresql database with pgx driver: %s", err)
 			return nil, fmt.Errorf("Error opening postgresql database with pgx driver: %s", err)
 		}
 		}

+ 47 - 1
frameworks/Go/atreugo/src/storage/world.go

@@ -1,6 +1,11 @@
 package storage
 package storage
 
 
-import "sync"
+import (
+	"sync"
+
+	"github.com/francoispqt/gojay"
+	"github.com/tidwall/sjson"
+)
 
 
 //easyjson:json
 //easyjson:json
 type World struct {
 type World struct {
@@ -8,9 +13,50 @@ type World struct {
 	RandomNumber int `json:"randomnumber"`
 	RandomNumber int `json:"randomnumber"`
 }
 }
 
 
+// MarshalJSONObject encodes the world as JSON
+func (w *World) MarshalJSONObject(dec *gojay.Encoder) {
+	dec.AddIntKey("id", w.ID)
+	dec.AddIntKey("randomnumber", w.RandomNumber)
+
+}
+
+// IsNil returns true if the object is nil
+func (w *World) IsNil() bool {
+	return w == nil
+}
+
+// MarshalSJSON marshals the object as json
+func (w World) MarshalSJSON() ([]byte, error) {
+	data, _ := sjson.SetBytesOptions([]byte(`{"id": 0, "randomNumber": 0}`), "id", w.ID, &sjson.Options{Optimistic: true})
+	return sjson.SetBytesOptions(data, "randomNumber", w.RandomNumber, &sjson.Options{Optimistic: true, ReplaceInPlace: true})
+}
+
 //easyjson:json
 //easyjson:json
 type Worlds []World
 type Worlds []World
 
 
+// MarshalJSONArray marshals the list of worlds
+func (ws Worlds) MarshalJSONArray(enc *gojay.Encoder) {
+	for _, w := range ws {
+		enc.AddObject(&w)
+	}
+}
+
+// IsNil returns true if the object is nil
+func (ws Worlds) IsNil() bool {
+	return ws == nil
+}
+
+// MarshalSJSON marshals the object as json
+func (ws Worlds) MarshalSJSON() ([]byte, error) {
+	jsonResult := []byte(`[]`)
+
+	for _, w := range ws {
+		jsonResult, _ = sjson.SetBytesOptions(jsonResult, "-1", &w, &sjson.Options{Optimistic: true, ReplaceInPlace: true})
+	}
+
+	return jsonResult, nil
+}
+
 // WorldPool *sync.Pool
 // WorldPool *sync.Pool
 var WorldPool *sync.Pool
 var WorldPool *sync.Pool
 
 

+ 7 - 1
frameworks/Go/go-std/src/main.go

@@ -42,10 +42,16 @@ func main() {
 	}
 	}
 
 
 	// init database with appropriate driver
 	// init database with appropriate driver
-	db, err := storage.InitDB(*dbDriver, *dbConnectionString)
+	db, err := storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU()*4)
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
+	if *child {
+		db, err = storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU())
+		if err != nil {
+			log.Fatal(err)
+		}
+	}
 
 
 	// init handlers
 	// init handlers
 	http.HandleFunc("/plaintext", handlers.PlaintextHandler)
 	http.HandleFunc("/plaintext", handlers.PlaintextHandler)

+ 5 - 14
frameworks/Go/go-std/src/storage/db.go

@@ -3,7 +3,6 @@ package storage
 import (
 import (
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
-	"runtime"
 
 
 	"go-std/src/templates"
 	"go-std/src/templates"
 )
 )
@@ -26,7 +25,6 @@ const (
 
 
 // DB is interface for
 // DB is interface for
 type DB interface {
 type DB interface {
-	// GetOneRandomWorld() (World, error)
 	GetOneRandomWorld(*World) error
 	GetOneRandomWorld(*World) error
 	UpdateWorlds([]World) error
 	UpdateWorlds([]World) error
 	GetFortunes() ([]templates.Fortune, error)
 	GetFortunes() ([]templates.Fortune, error)
@@ -35,35 +33,28 @@ type DB interface {
 }
 }
 
 
 // InitDB with appropriate driver
 // InitDB with appropriate driver
-func InitDB(dbDriver, dbConnectionString string) (DB, error) {
+func InitDB(dbDriver, dbConnectionString string, maxConnectionCount int) (DB, error) {
 	var err error
 	var err error
 	var db DB
 	var db DB
 
 
 	if dbDriver == "pgx" {
 	if dbDriver == "pgx" {
-		db, err = NewPgxDB(
-			dbConnectionString,
-			runtime.NumCPU())
+		db, err = NewPgxDB(dbConnectionString, maxConnectionCount)
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Error opening postgresql database with pgx driver: %s", err)
 			return nil, fmt.Errorf("Error opening postgresql database with pgx driver: %s", err)
 		}
 		}
 	} else if dbDriver == "mysql" {
 	} else if dbDriver == "mysql" {
-		db, err = NewMySQLDB(
-			dbConnectionString,
-			runtime.NumCPU())
+		db, err = NewMySQLDB(dbConnectionString, maxConnectionCount)
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Error opening mysql database: %s", err)
 			return nil, fmt.Errorf("Error opening mysql database: %s", err)
 		}
 		}
 	} else if dbDriver == "mgo" {
 	} else if dbDriver == "mgo" {
-		db, err = NewMongoDB(
-			dbConnectionString,
-			runtime.NumCPU())
+		db, err = NewMongoDB(dbConnectionString, maxConnectionCount)
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Error opening mongo database with mgo driver: %s", err)
 			return nil, fmt.Errorf("Error opening mongo database with mgo driver: %s", err)
 		}
 		}
 		// } else if dbDriver == "pq" {
 		// } else if dbDriver == "pq" {
 		// 	db, err = NewPqDB(
 		// 	db, err = NewPqDB(
-		// 		dbConnectionString,
-		// 		runtime.NumCPU())
+		// 		dbConnectionString, maxConnectionCount)
 		// 	if err != nil {
 		// 	if err != nil {
 		// 		return nil, fmt.Errorf("Error opening postgresql database with pq driver: %s", err)
 		// 		return nil, fmt.Errorf("Error opening postgresql database with pq driver: %s", err)
 		// 	}
 		// 	}

+ 0 - 65
frameworks/Go/go-std/src/storage/mysql.go

@@ -150,68 +150,3 @@ func NewMySQLDB(dbConnectionString string, maxConnectionsInPool int) (DB, error)
 	}
 	}
 	return &mysql, nil
 	return &mysql, nil
 }
 }
-
-// func dbInterpolateHandler(w http.ResponseWriter, r *http.Request) {
-// 	var world World
-// 	err := db.QueryRow(worldSelect, rand.Intn(worldRowCount)+1).Scan(&world.Id, &world.RandomNumber)
-// 	if err != nil {
-// 		log.Fatalf("Error scanning world row: %s", err.Error())
-// 	}
-
-// 	w.Header().Set("Server", "Go")
-// 	w.Header().Set("Content-Type", "application/json")
-// 	json.NewEncoder(w).Encode(&world)
-// }
-
-// func queriesInterpolateHandler(w http.ResponseWriter, r *http.Request) {
-// 	n := getQueriesParam(r)
-
-// 	world := make([]World, n)
-// 	for i := 0; i < n; i++ {
-// 		err := db.QueryRow(worldSelect, rand.Intn(worldRowCount)+1).Scan(&world[i].Id, &world[i].RandomNumber)
-// 		if err != nil {
-// 			log.Fatalf("Error scanning world row: %v", err)
-// 		}
-// 	}
-
-// 	w.Header().Set("Server", "Go")
-// 	w.Header().Set("Content-Type", "application/json")
-// 	json.NewEncoder(w).Encode(world)
-// }
-
-// func fortuneInterpolateHandler(w http.ResponseWriter, r *http.Request) {
-// 	rows, err := db.Query(fortuneSelect)
-// 	if err != nil {
-// 		log.Fatalf("Error preparing statement: %v", err)
-// 	}
-
-// 	fortunes := fetchFortunes(rows)
-// 	fortunes = append(fortunes, &Fortune{Message: "Additional fortune added at request time."})
-
-// 	sort.Sort(ByMessage{fortunes})
-// 	w.Header().Set("Server", "Go")
-// 	w.Header().Set("Content-Type", "text/html; charset=utf-8")
-// 	if err := tmpl.Execute(w, fortunes); err != nil {
-// 		http.Error(w, err.Error(), http.StatusInternalServerError)
-// 	}
-// }
-
-// func updateInterpolateHandler(w http.ResponseWriter, r *http.Request) {
-// 	n := getQueriesParam(r)
-
-// 	world := make([]World, n)
-// 	for i := 0; i < n; i++ {
-// 		if err := db.QueryRow(worldSelect, rand.Intn(worldRowCount)+1).Scan(&world[i].Id, &world[i].RandomNumber); err != nil {
-// 			log.Fatalf("Error scanning world row: %v", err)
-// 		}
-// 		world[i].RandomNumber = uint16(rand.Intn(worldRowCount) + 1)
-// 		if _, err := db.Exec(worldUpdate, world[i].RandomNumber, world[i].Id); err != nil {
-// 			log.Fatalf("Error updating world row: %v", err)
-// 		}
-// 	}
-
-// 	w.Header().Set("Server", "Go")
-// 	w.Header().Set("Content-Type", "application/json")
-// 	encoder := json.NewEncoder(w)
-// 	encoder.Encode(world)
-// }

+ 8 - 2
frameworks/Go/iris/src/main.go

@@ -38,11 +38,17 @@ func main() {
 	app.Use(recover.New())
 	app.Use(recover.New())
 
 
 	// init database with appropriate driver
 	// init database with appropriate driver
-	db, err := storage.InitDB(*dbDriver, *dbConnectionString)
+	db, err := storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU()*4)
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
-
+	if *child {
+		db, err = storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU())
+		if err != nil {
+			log.Fatal(err)
+		}
+	}
+	
 	// add handlers
 	// add handlers
 	app.Handle("GET", "/json", jsonHandler)
 	app.Handle("GET", "/json", jsonHandler)
 	app.Handle("GET", "/plaintext", plaintextHandler)
 	app.Handle("GET", "/plaintext", plaintextHandler)

+ 3 - 8
frameworks/Go/iris/src/storage/db.go

@@ -4,7 +4,6 @@ import (
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
 	"iris/src/templates"
 	"iris/src/templates"
-	"runtime"
 )
 )
 
 
 const (
 const (
@@ -26,20 +25,16 @@ type DB interface {
 }
 }
 
 
 // InitDB with appropriate driver
 // InitDB with appropriate driver
-func InitDB(dbDriver, dbConnectionString string) (DB, error) {
+func InitDB(dbDriver, dbConnectionString string, maxConnectionCount int) (DB, error) {
 	var err error
 	var err error
 	var db DB
 	var db DB
 	if dbDriver == "pq" {
 	if dbDriver == "pq" {
-		db, err = NewPqDB(
-			dbConnectionString,
-			runtime.NumCPU())
+		db, err = NewPqDB(dbConnectionString, maxConnectionCount)
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Error opening pq database: %s", err)
 			return nil, fmt.Errorf("Error opening pq database: %s", err)
 		}
 		}
 	} else if dbDriver == "pgx" {
 	} else if dbDriver == "pgx" {
-		db, err = NewPgxDB(
-			dbConnectionString,
-			runtime.NumCPU())
+		db, err = NewPgxDB(dbConnectionString, maxConnectionCount)
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Error opening pgx database: %s", err)
 			return nil, fmt.Errorf("Error opening pgx database: %s", err)
 		}
 		}