2015-05-12 1 views
2

Скажем, у меня есть конструктор запросовВ jOOq, почему соединение сильно связано с конструкцией оператора?

ResultQuery query = DSL.select().from(TABLE); 

и связь/контекст бассейн

DSLContext ctx = DSL.using(conn, SQLDialect.MYSQL) 

Я хочу быть в состоянии:

  • повторно использовать тот же объект запроса для различного подключения/context
  • Если тот же экземпляр запроса не может быть использован, используйте запрос в качестве шаблона
  • выполнить задачу построения запросов вне процесса выполнения запроса

Поскольку объект запроса в jOOQ имеет конфигурацию с подключением:

Означает ли это, что запрос должен быть построен только на активном соединении контекст?

отказ от ответственности: я использую jOOQ через несколько недель, возможно, мне просто не хватает некоторых документов.


Например, следующий код не является потокобезопасным, и он не будет безопасным, если он не синхронизируется с запросом.

ctx.fetch(query).map(mapper); 

источник DefaultDSLContext.fetch в 2157 версии 3.5.3

public <R extends Record> Result<R> fetch(ResultQuery<R> query) { 
    final Configuration previous = Utils.getConfiguration(query); 

    try { 
     query.attach(configuration()); 
     return query.fetch(); 
    } 
    finally { 
     query.attach(previous); 
    } 
} 

ответ

2

повторно использовать тот же объект запроса для различных соединений/контекста

Вы не должны делать это с jOOQ 3.x. Существует множество исторических причин, почему (некоторые) jOOQ QueryParts являются изменяемыми. Это изменится, надеюсь, в jOOQ 4.0. Справочная информация здесь:

если тот же экземпляр запроса невозможно использовать, использовать запрос в качестве шаблона

То, что вы всегда можете сделать, это реализовать функции построения AST, которые производят новые QueryParts на лету, например:

public static Condition template(...) { 
    Condition result = DSL.trueCondition(); 

    if (...) 
     result = result.and(...); 

    return result; 
} 

Это, очевидно, также подходит для полных запросов.