当另一个线程从同一个表

时间:2017-08-18 21:42:15

标签: java jooq

我有一个表,我使用record.insert()方法插入记录。我相信这种方法是在插入然后选择但在不同的事务中。与此同时,我有另一个线程,它将这个表池用于记录处理它们,然后删除它们。

在某些情况下,我得到以下异常:

org.jooq.exception.NoDataFoundException: Exactly one row expected for refresh. Record does not exist in database.
at org.jooq.impl.UpdatableRecordImpl.refresh(UpdatableRecordImpl.java:345)
at org.jooq.impl.TableRecordImpl.getReturningIfNeeded(TableRecordImpl.java:232)
at org.jooq.impl.TableRecordImpl.storeInsert0(TableRecordImpl.java:208)
at org.jooq.impl.TableRecordImpl$1.operate(TableRecordImpl.java:169)

我的解决方案是使用DSL.using(configuration())。insertInto而不是record.insert()。

我的问题是不应该在同一个事务中完成insert和fetch吗?

更新: 这是一个使用jooqbundle的dropwizard应用程序:com.bendb.dropwizard:dropwizard-jooq。

配置是在DAO中注入的,插入如下:

R object = // jooq record
object.attach(configuration);
object.insert();

在第二个线程上,我只是从该表中选择一些记录,处理它们然后删除它们

Jooq日志清楚地表明2个查询不在同一个事务中运行:

14:07:09.550 [main] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : insert into "queue"
....
14:07:09.083', 1)
14:07:09.589 [main] DEBUG org.jooq.tools.LoggerListener - Affected row(s)          : 1
14:07:09.590 [main] DEBUG org.jooq.tools.StopWatch - Query executed           : Total: 47.603ms
14:07:09.591 [main] DEBUG org.jooq.tools.StopWatch - Finishing                : Total: 48.827ms, +1.223ms
14:07:09.632 [main] DEBUG org.jooq.tools.LoggerListener - Executing query          : select "queue"."

我没有在日志中看到“autocommit off”或“savepoint”语句,这些语句通常由jooq打印,以防查询在事务中运行。我希望这有帮助,如果您需要更多信息,请告诉我

更新2:

Jooq版本是3.9.1 mysql版本5.6.23

数据库和jooq条目yml文件:

database:
  driverClass: com.mysql.jdbc.Driver
  user: ***
  password: ***
  url: jdbc:mysql://localhost:3306/mySchema
  properties:
    charSet: UTF-8
    characterEncoding: UTF-8
  # the maximum amount of time to wait on an empty pool before throwing an exception
  maxWaitForConnection: 1s
  # the SQL query to run when validating a connection's liveness
  validationQuery: "SELECT 1"
  # the timeout before a connection validation queries fail
  validationQueryTimeout: 3s
  # initial number of connections
  initialSize: 25
  # the minimum number of connections to keep open
  minSize: 25
  # the maximum number of connections to keep open
  maxSize: 25
  # whether or not idle connections should be validated
  checkConnectionWhileIdle: true
  # the amount of time to sleep between runs of the idle connection validation, abandoned cleaner and idle pool resizing
  evictionInterval: 10s
  # the minimum amount of time an connection must sit idle in the pool before it is eligible for eviction
  minIdleTime: 1 minute

jooq:
  # The flavor of SQL to generate. If not specified, it will be inferred from the JDBC connection URL.  (default: null)
  dialect: MYSQL
  # Whether to write generated SQL to a logger before execution.  (default: no)
  logExecutedSql: no
  # Whether to include schema names in generated SQL.  (default: yes)
  renderSchema: yes
  # How names should be rendered in generated SQL.  One of QUOTED, AS_IS, LOWER, or UPPER.  (default: QUOTED)
  renderNameStyle: QUOTED
  # How keywords should be rendered in generated SQL.  One of LOWER, UPPER.  (default: UPPER)
  renderKeywordStyle: UPPER
  # Whether generated SQL should be pretty-printed.  (default: no)
  renderFormatted: no
  # How parameters should be represented.  One of INDEXED, NAMED, or INLINE.  (default: INDEXED)
  paramType: INDEXED
  # How statements should be generated; one of PREPARED_STATEMENT or STATIC_STATEMENT.  (default: PREPARED_STATEMENT)
  statementType: PREPARED_STATEMENT
  # Whether internal jOOQ logging should be enabled.  (default: no)
  executeLogging: no
  # Whether optimistic locking should be enabled.  (default: no)
  executeWithOptimisticLocking: yes
  # Whether returned records should be 'attached' to the jOOQ context.  (default: yes)
  attachRecords: yes
  # Whether primary-key fields should be updatable.  (default: no)
  updatablePrimaryKeys: no

已按照https://github.com/benjamin-bader/droptools/tree/master/dropwizard-jooq中的说明将jooq捆绑包包含在Application类中。 使用https://github.com/xvik/dropwizard-guicey将配置注入每个DAO。 指南模块具有以下绑定:

bind(Configuration.class).toInstance(jooqBundle.getConfiguration());

0 个答案:

没有答案