ddbc
ddbc copied to clipboard
ConnectionPoolDataSourceImpl Returns Dead Connections to Connection Pool
Summary
Once database connections fail, due to a database being restarted or going down, these invalid connections always return to the connection pool, preventing a DB connection from being re-established when the DB comes back online.
Steps to Reproduce
- Start a local PostgreSQL database using default settings, e.g. blank username/password and database named "postgres".
- Run the following program.
import std.stdio;
import core.thread : Thread;
import core.time : seconds;
import ddbc.drivers.pgsqlddbc;
import ddbc.core : DataSource, Driver, Connection, PreparedStatement;
import ddbc.common : ConnectionPoolDataSourceImpl, DataSourceImpl;
void main() {
writeln("Edit source/app.d to start your project.");
Driver driver = new PGSQLDriver();
string url = PGSQLDriver.generateUrl("localhost", 5432, "postgres");
string[string] params = PGSQLDriver.setUserAndPassword("", "");
// DataSource dataSource = new DataSourceImpl(driver, url, params);
DataSource dataSource = new ConnectionPoolDataSourceImpl(driver, url, params);
while (true) {
writeln("Testing connection...");
try {
Connection connection = dataSource.getConnection();
scope (exit) connection.close();
PreparedStatement statement = connection.prepareStatement("SELECT 1");
statement.executeQuery();
} catch (Exception e) {
writeln(e);
}
Thread.sleep(2.seconds);
}
}
- Observe the program running with output "Testing connection...".
- Shut down the database.
- Observe the program running, printing exceptions like:
ddbc.core.SQLException@../../../.dub/packages/ddbc/0.5.9/ddbc/source/ddbc/drivers/pgsqlddbc.d(787): Error while executing prepared statement SELECT 1
- Restart the database.
Expected Result
The DB connection will be re-established, and the program should again print "Testing connection...".
Actual Result
The program continues to print exceptions and never recovers.
Additional Notes
If DataSourceImpl
is used instead of ConnectionPoolDataSourceImpl
, the program recovers as expected.