je reçois l'erreur suivante dans un certain scénarioerreur Délai d'attente essayant de verrouiller la table en h2
Lorsqu'un autre thread est peuplait beaucoup d'utilisateurs via l'opération de chargement en vrac et je tente de voir la liste de tous les utilisateurs sur une page web différente. La requête de liste renvoie l'erreur de délai d'attente suivante. Est-il possible de définir ce délai d'expiration afin que je puisse éviter cette erreur de délai d'attente.
Env: h2 (dernier), Mise en veille prolongée 3.3.x
Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "USER"; SQL statement:
[50200-144]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
at org.h2.message.DbException.get(DbException.java:167)
at org.h2.message.DbException.get(DbException.java:144)
at org.h2.table.RegularTable.doLock(RegularTable.java:482)
at org.h2.table.RegularTable.lock(RegularTable.java:416)
at org.h2.table.TableFilter.lock(TableFilter.java:139)
at org.h2.command.dml.Select.queryWithoutCache(Select.java:571)
at org.h2.command.dml.Query.query(Query.java:257)
at org.h2.command.dml.Query.query(Query.java:227)
at org.h2.command.CommandContainer.query(CommandContainer.java:78)
at org.h2.command.Command.executeQuery(Command.java:132)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:278)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:137)
at java.lang.Thread.run(Thread.java:619)
at org.h2.engine.SessionRemote.done(SessionRemote.java:543)
at org.h2.command.CommandRemote.executeQuery(CommandRemote.java:152)
at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:96)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2228)
... 125 more
Je positionniez le délai d'attente sur l'URL du pilote, mais je reçois toujours la même erreur car l'opération ci-dessus prend probablement environ 30 secondes. Je ne veux pas que les autres utilisateurs qui utilisent cette page voient un crash pendant ce temps. Cela signifie-t-il que je devrai régler le délai d'attente à plus de 30 secondes pour éviter ce problème? Comment trouver des problèmes spécifiques aux performances si le délai d'attente est défini sur un grand nombre – user339108
La transaction prend-elle réellement 30 secondes? Cela me semble un peu long. Est-il possible de diviser la transaction en plusieurs transactions plus petites (par exemple 0,5 seconde chacune)? –
L'utilisation du paramètre "MVCC = true" est la solution, changer le timeout ne résout pas ce problème. –