Я построил веб-сервис с весенним ботинком. Я использовал диаграмму титана как одноэлементный, который был доступен через веб-службу. Поэтому в случае, если несколько запросов к веб-сервису, веб-сервер будет порождать потоки для обработки запросов и диаграммы титана, будут использоваться в этих потоках. Есть ли проблемы с этим подходом? Я использую titan graph 1.0.0 и tinkerpop 3.0.1-incubating. Итак, график титана для меня совершенно новый, и я не знаю, конфликтуют ли конфликты с титановым графиком в нескольких потоках. Если этот подход имеет проблемы, так что лучше всего использовать диаграмму титана в нескольких потоках? Спасибо за помощь.Какова наилучшая практика использования графика титана в нескольких потоках?
ответ
Вполне приемлемо использовать Titan таким образом. Вам просто нужно быть уверенным, что транзакции не протекают между запросами. В соответствии с семантикой TinkerPop транзакции на экземпляре Graph
привязаны к текущему потоку. Поэтому конец каждого HTTP-запроса должен закрыть транзакцию с commit()
или rollback()
в зависимости от успеха или отказа запроса. Если вы даже слегка не уверены в своей способности всегда закрывать транзакцию, то вам следует рассмотреть вопрос о выпуске rollback()
в начале вашего запроса, чтобы очистить любое устаревшее состояние от предыдущего.
Благодарим за сообщение. Я хочу задать еще один вопрос. Я использовал TitanGraph как одноэлементный, когда я открываю график, я также генерирую GraphTraversalSource из графика, а также использую GraphTraversalSource в качестве одноэлементного типа, например, используя TitanGraph. Так ли это нормально использовать однострочный синтаксис GraphTraversalSource для нескольких потоков, или мне нужно создать один для каждого потока? Спасибо. – MichaelP
он должен быть безопасным для повторного использования. –
Да, пойдите для этого. Если вы используете Titan, обязательно прочитайте документацию, доступную по адресу multi-threaded transactions.
С обработкой транзакций по умолчанию Blueprints каждый поток автоматически открывает свою собственную транзакцию по базе данных графа. Чтобы открыть независимую от потока транзакцию, используйте метод
newTransaction()
. МетодnewTransaction()
возвращает новый объектTransactionalGraph
, который представляет эту недавно открытую транзакцию. Объект графика tx поддерживает все методы, которые выполнял исходный граф, но делает это без открытия новых транзакций для каждого потока. Это позволяет нам запускать несколько потоков, которые все работают одновременно в одной транзакции, и одна из которых, наконец, совершает транзакцию, когда все потоки завершили свою работу.
Это может быть безопаснее, если вы используете библиотеки, которые могут иметь одну концептуальную транзакцию для нескольких потоков, например. посредством использования отсрочек или обещаний.
благодарю вас за ответ – MichaelP
Кто-то, пожалуйста, помогите мне! Я использую диаграмму титана для крупномасштабного веб-сервиса, и я действительно забочусь о производительности графика титана в случае многих запросов на обслуживание. – MichaelP