#jooq
#jooq
Вопрос:
Я переключаю свой код на использование поставщика соединений, а не конфигурации. В процессе я потерял возможность использовать свой пользовательский прослушиватель выполнения, который я использую для регистрации своих операторов SQL.
Итак, пара вопросов:
- Есть ли способ использовать пользовательский прослушиватель, если я использую ConnectionProvider?
- Конфигурация даже не нужна?
-
Что мне добавить в метод «release»?
conn = DriverManager.getConnection( url, userName, password ); conn.setSchema( schema ); configuration = new DefaultConfiguration().set( conn ).set( SQLDialect.MYSQL ); configuration.set( new DefaultExecuteListenerProvider( new IFSCustomJOOQExecuteListener( true, true ) ) ); aDSL = DSL.using( configuration );
Я переключил его, и теперь он выглядит так:
IFSConnectionProvider ifsConnectionProvider = new IFSConnectionProvider();
aDSL = DSL.using( ifsConnectionProvider, SQLDialect.MYSQL );
Вот код поставщика подключения (с удаленными не относящимися к делу строками):
public class IFSConnectionProvider implements ConnectionProvider
{
protected Connection conn;
protected Configuration configuration;
@Override
public Connection acquire() throws DataAccessException
{
try
{
if (conn == null)
{
conn = DriverManager.getConnection( url, userName, password );
conn.setSchema( schema );
conn.setAutoCommit( false );
configuration = new DefaultConfiguration().set( conn ).set( SQLDialect.MYSQL );
configuration.set( new DefaultExecuteListenerProvider( new IFSCustomJOOQExecuteListener( true, true ) ) );
}
return conn;
}
catch (SQLException ex)
{
... yada yada yada ...
}
}
@Override
public void release( Connection connection ) throws DataAccessException
{
// TODO Auto-generated method stub
// do i need to do a release?
}
}
Ответ №1:
Здесь стоит упомянуть несколько вещей:
Я переключаю свой код на использование поставщика соединений, а не конфигурации
Вы все еще используете конфигурацию. Потому что под капотом всегда есть конфигурация, даже если она создана для вас, обертывающая вашего поставщика соединений.
- Есть ли способ использовать пользовательский прослушиватель, если я использую ConnectionProvider?
Эти две вещи не связаны. В любом случае, в какой-то момент вам нужно будет включить оба в свою конфигурацию
- Конфигурация даже не нужна?
Да, это необходимо. Вопрос в том, нужно ли вам создавать его самостоятельно. Вам не нужно этого делать, если вы просто передаете провайдеру подключения DSL.using()
(который является просто удобным API! Он создает конфигурацию для вас).
Но если вы хотите использовать прослушиватель выполнения, вам нужно будет создать конфигурацию самостоятельно, вручную.
- Что мне добавить в метод «release»?
В вашем случае вы никогда ничего не будете делать в методе release, потому что вы сами создали автономное соединение. Логика, которая создала соединение, должна закрыть его, а не jOOQ (т.Е. Не «release»)
public class IFSConnectionProvider implements ConnectionProvider { protected Connection conn; protected Configuration configuration;
Я боюсь, что это никуда не денется по двум причинам:
- Вероятно, вам не следует кэшировать соединение в вашем поставщике соединений. Я не понимаю, почему это было бы полезно.
- Поставщик соединения — это то, что вы помещаете в конфигурацию. Не имеет смысла идти наоборот.
Я думаю, что весь вопрос вызван непониманием различных SPI jOOQ:
- Всегда есть конфигурация
- Если вы не создаете его самостоятельно, удобные методы jOOQ создадут его за вас
- Конфигурации содержат ConnectionProviders, а не наоборот.