2013-06-20 5 views
4

Я хочу, чтобы данные из базы данных в приложение вместо приложения вытащили данные. Я установил сервер ms sql и сервер Tomcat Apache. У меня есть мое приложение в apache tomcat, здесь я подключился к базе данных. Теперь я хочу, чтобы база данных отправляла данные всякий раз, когда в данных обновляется. Но все, что я знаю, это получение данных из базы данных, это не очень хорошая идея, потому что приложение нуждается в мониторинге базы данных для обновленных данных, что приведет к срабатыванию запроса каждые 5 секунд, это также неэффективно.Как перенести данные из базы данных в приложение?

Я google, у меня есть ответы на них, они являются уведомлением о запросе here, Sql Server Agent Job, чтобы запланировать задачу автоматически. Если у вас есть какое-либо другое предложение, разместите его.

ответ

4

Там, конечно, есть несколько возможностей сделать это:

  • Реализовать небезопасный триггер CLR
  • Реализовать небезопасной процедуры CLR
  • Использование xp_cmdshell
  • Вызов веб-службы
  • Использование Query Notification

Вы можете прочитать немного о них в этой дискуссии: Serial numbers, created and modified in SQL Server.

Лично я бы предпочел Уведомление о запросах на другие методы, поскольку он уже имеет поддержку fopr различных случаев (например, синхронизация/асинхронная связь), и вам не нужно изобретать велосипед. И в вашем случае рекомендуется Microsoft.

Опрос - это еще один метод, о котором вы упоминали. Это больше похоже на традиционный метод, и могут быть некоторые связанные с производительностью штрафы, но вы не должны беспокоиться о них, если будете достаточно осторожны. Например, если у вас уже есть аутентификация, встроенная в ваше приложение, вы можете создать другой столбец в своей таблице Users, который установлен, если есть какие-либо изменения, связанные с этим пользователем. И тогда в вашем приложении может быть только поток, который будет выполнять запрос каждую секунду против этой таблицы (даже грязные чтения с NOLOCK не должны быть проблемой здесь) и поддерживать некоторую структуру в памяти (например, нитевидный словарь) который говорит, что клиент должен быть нажат. Другой поток опроса вашего словаря и когда он находит что-то для клиента, выполняет db-запрос, который извлекает данные и отправляет их клиенту. Это выглядит как много неэффективной работы, но в конце вы получаете двух независимых работников, которые несколько помогают разделить проблемы; первый - это просто информатор, который выполняет «легкий» опрос базы данных; второй из них извлекает реальные данные и выполняет нажим сервера. Вы даже можете оптимизировать push-worker таким образом, чтобы при его запуске он проверял, нужны ли нескольким клиентам некоторые данные, а затем выполняет выбор для всех тех, кто в нем нуждается. Вероятно, вы захотите, чтобы второй рабочий работал менее часто, чем первый.

EDIT

Если вы хотите использовать non-.NET технологии для достижения той же функциональности, вы должны будете получить больше в SQL Server Service Broker. Уведомление о запросах - это упрощённый уровень, построенный в .NET поверх SQL Server Service Broker, и вам придется создавать по крайней мере часть этого слоя самостоятельно. Это включает в себя создание очереди, типа сообщения, обслуживания и хранимых процедур с помощью SEND и RECEIVE с другой стороны. Вам придется самостоятельно позаботиться о разговоре/диалоге. SB фактически представляет собой мир асинхронных сообщений, настроенный для работы в среде РСУБД, поэтому вы увидите несколько новых выражений TSQL.Однако, MSDN здесь, чтобы помочь:

Это может помочь также: Externally activate non-.NET application from Service Broker

Пример того, как закодировать материал:

-- First you have to enable SB for your database 
USE master 
ALTER DATABASE Playground 
SET ENABLE_BROKER 
GO 

USE Playground 
GO 

-- Then create a message type; usually it will be XML 
-- because it's very easy to serialize/deserialize it 
CREATE MESSAGE TYPE [//Playground/YourMessageType] 
VALIDATION = WELL_FORMED_XML 
GO 

-- Then create a contract to have a rule for communication 
-- Specifies who sends which message type 
CREATE CONTRACT [//Playground/YourContract] (
    [//Playground/YourMessageType] SENT BY ANY) 
GO 

--Creates queues, one for initiator (1) and one for target (2) 
CREATE QUEUE MyQueue1 
GO 
CREATE QUEUE MyQueue2 
GO 

-- Finally, configure services that 'consume' queues 
CREATE SERVICE [//Playground/YourService1] 
ON QUEUE MyQueue1 ([//Playground/YourContract]) 
GO 

CREATE SERVICE [//Playground/YourService2] 
ON QUEUE MyQueue2 ([//Playground/YourContract]) 
GO 

-- Now you can send a message from service to service using contract 
DECLARE 
    @dHandle uniqueidentifier, 
    @Msg nvarchar(max) 

BEGIN DIALOG @dHandle 
    FROM SERVICE [//Playground/YourService1] 
    TO SERVICE '//Playground/YourService2' 
    ON CONTRACT [//Playground/YourContract] 
WITH ENCRYPTION = OFF 

SELECT @Msg = (
    SELECT TOP 3 * 
    FROM Table1 
    FOR XML PATH('row'), ROOT('Table1')) 

;SEND ON CONVERSATION @dHandle 
MESSAGE TYPE [//Playground/YourMessageType] (@Msg) 

PRINT @Msg 
GO 

-- To get the message on the other end, use RECEIVE 
-- Execute this in another query window 
DECLARE @dHandle uniqueidentifier 
DECLARE @MsgType nvarchar(128) 
DECLARE @Msg nvarchar(max) 

;RECEIVE TOP(1) 
    @dHandle = conversation_handle, 
    @Msg = message_body, 
    @MsgType = message_type_name 
FROM MyQueue2 

SELECT @MsgType 
SELECT @Msg 

END CONVERSATION @dHandle 
GO 
+0

какой метод был бы полезен для моей версии сервера sql, я использую ms sql сервер 2012 Express Edition. Мое приложение на сервере tomcat - webMathemaica. – niren

+0

К сожалению, я испорчен, используя почти стандартное/корпоративное издание. Я полагаю, что в 2012 году, если вы включите [Service Broker и другие материалы уведомления о запросах] (http://msdn.microsoft.com/en-us/library/ms172133 (v = vs.80) .aspx), вы не должны есть какие-либо проблемы с использованием [SqlDependency] (http://msdn.microsoft.com/en-us/library/62xk7953.aspx) – OzrenTkalcecKrznaric

+0

всех примеров, которые я вижу для уведомления о запросе, которое они показывают только в .Net-приложениях. могу ли я реализовать это уведомление о запросах для других клиентских приложений, таких как jsp и т. д.? Если я смогу найти хорошие примеры. – niren

 Смежные вопросы

  • Нет связанных вопросов^_^