DSL使用ConnectionProvider和ExecuteListeners

时间:2016-10-11 17:44:17

标签: jooq

我正在将代码切换为使用连接提供程序而不是配置。在这个过程中,我已经失去了使用我用来记录我的SQL语句的自定义执行监听器。

所以有几个问题:

  1. 如果我使用的话,有没有办法使用自定义监听器 的ConnectionProvider?
  2. 甚至不需要配置?
  3. 我在“发布”方法中添加了什么?

        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 );
    
  4. 我将其切换,现在看起来像这样:

        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 个答案:

答案 0 :(得分:1)

这里有几件值得一提的事情:

  

我正在将代码切换为使用连接提供程序而不是配置

您仍在使用配置。因为在引擎盖下,总是有一个配置,即使它是为你创建的,包裹你的连接提供者。

  
      
  1. 如果我使用的是connectionProvider,有没有办法使用自定义侦听器?
  2.   

这两件事是无关的。无论如何,在某些时候你需要将两者放在你的配置中

  
      
  1. 甚至不需要配置?
  2.   

是的,这是必要的。问题是你是否需要自己创建一个。如果您只是将连接提供程序传递给DSL.using()(这只是便利API!它会为您创建配置),那么您并不需要。

但是如果你想使用执行监听器,你需要自己手动创建一个配置。

  
      
  1. 我在"发布"中放入了什么?方法
  2.   

在您的情况下,您将永远不会在发布方法中执行任何操作,因为您自己创建了独立连接。创建连接的逻辑应该关闭它,而不是jOOQ(即不是"发布")

public class IFSConnectionProvider implements ConnectionProvider
        {
        protected Connection conn;
        protected Configuration configuration;

我担心这会因为两个原因而无法前往任何地方:

  1. 您可能不应该在连接提供程序中缓存连接。我不明白为什么那会有用。
  2. 连接提供程序是您放在配置中的内容。反过来说,没有任何意义。
  3. 我认为整个问题是由于对jOOQ的各种SPI的误解造成的:

    1. 始终有配置
    2. 如果您不是自己创建的,jOOQ的便捷方法会为您创建
    3. 配置包含ConnectionProviders,反之亦然。