-
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の特定のエラーは、定義されているエラーの番号の定数を使って判定する。