время ожидания на вторичных вставках базы данных в berkeleydb - PullRequest
0 голосов
/ 09 октября 2018

Моя текущая настройка использует BDBJE 4.1.10.У меня есть 10 потоков, пытающихся записать объект Keyword в базу данных.

Характер данных заключается в том, что вторичные ключи - магазины и предметы имеют много дубликатов.Это означает, что многие объекты Keyword отображаются в один и тот же магазин и записи предметов.

LOCK_N_LOCK_TABLES равно 7

@ Entity

открытый класс Keyword реализует Serializable {

@PrimaryKey

private String key;

@SecondaryKey(relate = Relationship.MANY_TO_MANY)

private List<Long> stores = new ArrayList<Long>();

@SecondaryKey(relate = Relationship.MANY_TO_MANY)

private List<Long> items = new ArrayList<Long>();

}

около 10% (изиз 100 000) вставок вторичной базы данных завершается с ошибкой LockTimeoutException.

Глядя на трассировку стека, я понимаю, что поток 6 ждал, чтобы получить блокировку в течение 2000 мс, прежде чем сдаться, и еще 3 потока ожидают.

По сути, операция, которую выполняет поток Владелец (поток 10), занимает более 2000 мс.Поток 6 пытается вставить запись во вторичные элементы базы данных.

Stacktrace:

com.sleepycat.je.LockTimeoutException: (JE 4.1.10) Lock expired. 

Locker 786527582 -1_fileChannelTaskExecutor-6_ThreadLocker: waited for lock on database=persist#faceted_store#com.xyzq.seo.bdb.entity.Keyword#items 

LockAddr:43409842 node=281964 type=WRITE grant=WAIT_NEW timeoutMillis=2000 startTime=1538759059393 endTime=1538759061393 

Owners: [<LockInfo locker="786774600 -1_fileChannelTaskExecutor-10_ThreadLocker" type="WRITE"/>] 

Waiters: 

[

<LockInfo locker="1270863098 -1_fileChannelTaskExecutor-9_ThreadLocker" type="WRITE"/>, 

<LockInfo locker="1244207474 -1_fileChannelTaskExecutor-4_ThreadLocker" type="WRITE"/>, 

<LockInfo locker="1391625295 -1_fileChannelTaskExecutor-1_ThreadLocker" type="WRITE"/>

] 

at com.sleepycat.je.txn.LockManager.newLockTimeoutException(LockManager.java:608

 at com.sleepycat.je.txn.LockManager.makeTimeoutMsgInternal(LockManager.java:567

 at com.sleepycat.je.txn.SyncedLockManager.makeTimeoutMsg(SyncedLockManager.java:75

 at com.sleepycat.je.txn.LockManager.lockInternal(LockManager.java:385

 at com.sleepycat.je.txn.LockManager.lock(LockManager.java:272

 at com.sleepycat.je.txn.BasicLocker.lockInternal(BasicLocker.java:134

 at com.sleepycat.je.txn.Locker.lock(Locker.java:453

 at com.sleepycat.je.dbi.CursorImpl.lockDupCountLN(CursorImpl.java:2768

 at com.sleepycat.je.tree.Tree.insertDuplicate(Tree.java:2847

 at com.sleepycat.je.tree.Tree.insert(Tree.java:2488

 at com.sleepycat.je.dbi.CursorImpl.put(CursorImpl.java:1209

 at com.sleepycat.je.Cursor.putAllowPhantoms(Cursor.java:1799

 at com.sleepycat.je.Cursor.putNoNotify(Cursor.java:1756

 at com.sleepycat.je.Cursor.putNotify(Cursor.java:1689

 at com.sleepycat.je.Cursor.putInternal(Cursor.java:1626

 at com.sleepycat.je.SecondaryDatabase.insertKey(SecondaryDatabase.java:984

 at com.sleepycat.je.SecondaryDatabase.updateSecondary(SecondaryDatabase.java:909

 at com.sleepycat.je.SecondaryTrigger.databaseUpdated(SecondaryTrigger.java:41

 at com.sleepycat.je.Database.notifyTriggers(Database.java:2016

 at com.sleepycat.je.Cursor.putNotify(Cursor.java:1702

 at com.sleepycat.je.Cursor.putInternal(Cursor.java:1626

 at com.sleepycat.je.Database.putInternal(Database.java:1186

 at com.sleepycat.je.Database.put(Database.java:1058

 at com.sleepycat.persist.PrimaryIndex.putNoReturn(PrimaryIndex.java:479

 at com.sleepycat.persist.PrimaryIndex.putNoReturn(PrimaryIndex.java:442

 at com.xyzq.bdb.cache.da.impl.BDBDataAccessor.create(BDBDataAccessor.java:77)

Я попробовал следующее

  • Уменьшена блокировкавремя.Надеясь, что победитель снимет блокировку, как только закончит вставлять записи в базу данных.

  • Перехватите исключение LockTimeOutException и повторите попытку, вставив ключевое слово позже.Это работает, но это руководство и требует времени.10% ключевых слов терпят неудачу из-за LockTimeOutException.~ 10 КБ из 100 КБ.

У меня есть несколько вопросов:

Есть ли ограничение на количество потоков, которые могут записывать в БД, или это зависит отданные?

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

@ Entity

Keyword

@PrimaryKey

- key

@ Entity

Item

-id

-key [reference to Keyword Obj]

@ Entity

Store

- id

- key [reference to Keyword obj.]

Спасибо!

  • K
...