Кто-либо использовал ServiceLoader вместе с Guice?

Можно усилить таблицу Number, чтобы сделать строковый парсинг.

Составляют физическую таблицу чисел:

    create table dbo.Numbers (N int primary key);
    insert into dbo.Numbers
        select top 1000 row_number() over(order by number) from master..spt_values
    go

Составляют тестовую таблицу с 1 000 000 строк

    create table #yak (i int identity(1,1) primary key, array varchar(50))

    insert into #yak(array)
        select 'a,b,c' from dbo.Numbers n cross join dbo.Numbers nn
    go

, Создают функцию

    create function [dbo].[ufn_ParseArray]
        (   @Input      nvarchar(4000), 
            @Delimiter  char(1) = ',',
            @BaseIdent  int
        )
    returns table as
    return  
        (   select  row_number() over (order by n asc) + (@BaseIdent - 1) [i],
                    substring(@Input, n, charindex(@Delimiter, @Input + @Delimiter, n) - n) s
            from    dbo.Numbers
            where   n <= convert(int, len(@Input)) and
                    substring(@Delimiter + @Input, n, 1) = @Delimiter
        )
    go

Использование (выходные строки 3 миллиметров в 40-х на моем ноутбуке)

    select * 
    from #yak 
    cross apply dbo.ufn_ParseArray(array, ',', 1)

очистка

    drop table dbo.Numbers;
    drop function  [dbo].[ufn_ParseArray]

, Производительность здесь не удивительна, но вызывание функции, более чем миллион таблиц строки не является лучшей идеей. При выполнении строкового разделения по поводу многих строк я избежал бы функции.

14
задан Mark Renouf 23 May 2009 в 22:33
поделиться

2 ответа

Практически точно это мы делаем на моей работе. В настоящее время мы застряли на java 5 из-за некоторых внутренних ограничений, поэтому мы делаем это немного по-другому, используя Service Provider (из-за отсутствия доступа к ServiceLocator до java 6, как вы упомянули), но по сути он работает так же.

Я помню, как где-то читал, что это был один из предпочтительных способов, рекомендуемых разработчиками Guice, хотя они хотят оставить его открытым для гибкости.

3
ответ дан 1 December 2019 в 16:44
поделиться

Я уже рассматривал этот способ, но не использовал его, потому что боялся, что мне придется делать модули очень маленькими, потому что их невозможно связать интерфейс дважды. Моя проблема заключается в том, что если я хочу использовать интерфейс / класс / перечисление / что-либо из другой банки, и эта банка определяет файл services / *, мне не нравится, потому что я не могу использовать содержимое банки, не загружая его как модуль.

Надеюсь, мои опасения понятны.

1
ответ дан 1 December 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: