If you're building a database-backed Golang application using PostgreSQL, you might come across one or both of the following errors:
pq: sorry, too many clients already
pq: remaining connection slots are reserved for non-replication superuser connections
Both of these errors are signs that you've tried opening more database connections than your PostgreSQL server can handle.
It's tempting to go into your PostgreSQL server configuration and increase the number of connections your server will accept. But that will only lead to performance problems, especially if you're running your PostgreSQL server on a smaller instance with less memory and CPU.
More likely than the database not accepting connections being the culprit is the possibility of your Golang code leaking database connections.
Wherever you open a query connection, you're responsible for deferring a
Close() call on the resulting row set:
rows, err := db.Query("SELECT * FROM cars;")
It's a good bet that somewhere, you're not closing a connection you've opened. Over time, this could result in your database connection pool being consumed by idle connections. Auditing your code for queries where you're not closing the connection afterward will help ensure your application can still connect to its database.
Depending on the size of your application, this process could take awhile. But it's a surefire way to get things moving in the right direction.