-
Notifications
You must be signed in to change notification settings - Fork 0
golang Database programing
foolmacky edited this page Sep 11, 2021
·
10 revisions
- database/sqlパッケージにはpooling機能が実装されていて、意識しなくても利用される
- なので1つのデータベース上で、2つの連続したステートメントを実行すると、2つのコネクションをオープンし、別々に実行する可能性がある。
- コネクションに制限はないが、アイドル状態のコネクションを制御することは可能。長い時間アイドル状態になり、エラーが発生する場合はdb.SetMaxIdleConns(0)を試してみる。
- データベースのコネクションを開いたり閉じたりすると、リソース枯渇の原因となる可能性がある。
- Failing to read all rows or user rows.Close() reserves connections from the pool.
- Using Query() for a statement that doesn't return rows will reserve a connection from the pool.
- Failing to be aware of how prepared statements work can lead to a lot of extra database activity.
- 単一の接続で実行されていると思っていても、実際には複数の接続で実行されている場合がある。
- コネクションを変更すると、そのコネクションはpoolに戻り、他のコードの状態に悪影響を及ぼす可能性がある。
- begin, commitを直接発行してはいけない。
- コネクションでエラーが発生すると、Goは新しいコネクションのオープンを最大10回リトライする。
- 大きなUnit64で上位ビットが設定されている場合、ステートメントのパラメータとして渡せない。uint64を使う場合、最初は小さな数値でエラーが発生しないかもしれないが、時間が立つにつれて数値が増えていくと、エラーが発生する。
- どうしてもNULLがリターンされる場合は、NULL許可のbool, string, int, floatの型を使う。
- database/sqlでのほぼすべての操作では、最後の返り値としてエラーが返却される。それらのエラーをチェックし、無視しない。
- 各Databaseの特定のエラーは、定義されているエラーの番号の定数を使って判定する。
- Configuring sql.DB for Better Performance http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html
- https://www.alexedwards.net/blog/configuring-sqldb
- Goのsql.DBがコネクションプールを管理する仕組み https://please-sleep.cou929.nu/go-sql-db-connection-pool.html
- golang tutorial https://golang.shop/ http://go-database-sql.org
- database/sql interface https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/05.1.html
- Goのドライバは、単一のクエリによる複数の結果セットをサポートしていないので、複数の結果セットを返却するようなストアドプロシージャはうまく動作しない。
- 明示的には複数ステートメントサポートをしていない。
DELETE FROM tbl1; DELETE FROM tbl2
- Mysqlドライバでは、ストアドが実行できない。MySQLがコネクションが複数ステートメントモードに設定されることを期待するため。
- 通常はドライバーパッケージを直接使わないで、database/sqlで定義された型のみを使う。そうすることで、特定のドライバに依存しないようになる。