Я попытался управлять подключением самостоятельно в рамках платформы воспроизведения и реализует поставщик соединения jooq как:
public class PlayConnectionProvider implements ConnectionProvider {
private Connection connection = null;
@Override
public Connection acquire() throws DataAccessException {
if (connection == null) {
connection = DB.getConnection();
}
return connection;
}
@Override
public void release(Connection released) throws DataAccessException {
if (this.connection != released) {
throw new IllegalArgumentException("Expected " + this.connection + " but got " + released);
}
try {
if (connection.getAutoCommit() == true) {
connection.close();
connection = null;
}
} catch (SQLException e) {
Logger.error("Error closing connection " + connection, e);
}
}
}
Однако, когда я вызываю execute(), кажется, что jooq всегда будет вызывать метод gets() и создавать новое соединение вместо существующего. Я обнаружил, что новое соединение получается по умолчаниюExecuteContext в функции execute():
public final Connection connection() {
ConnectionProvider provider = this.connectionProvider != null?this.connectionProvider:this.configuration.connectionProvider();
if(this.connection == null && provider != null) {
this.connection(provider, provider.acquire());
}
return this.connection;
}
Есть ли способ настроить соединение для execute()?
Вы правы, jOOQ всегда вызывает метод acquire()
в начале каждого вызова execute()
. Но он также вызывает release()
в конце его, и вы, похоже, сами перезагружаете свое кэшированное соединение
if (connection.getAutoCommit() == true) {
connection.close();
connection = null;
}
... потому что Play DB.getConnection()
возвращает соединение с DB.getConnection()
автоматическим фиксацией
Обратите внимание: если вы кешируете соединение таким образом, ConnectionProvider
больше не будет потокобезопасным, и, следовательно, все его объекты не будут потокобезопасными (включая Configuration
и DSLContext
). Одним из способов обеспечения безопасности этого потока было бы сохранение соединения в ThreadLocal
внутри вашего ConnectionProvider
null
себя вrelease()
? Какую версию JOOQ вы используете? И просто чтобы быть уверенным: как вы создаете свойConnectionProvider
?