Во-первых, вам не нужно устанавливать RPM-пакет scala, поскольку SBT сам загружает для вас Scala (какая версия настроена в вашей сборке).
Во-вторых, каждая команда RUN
создает новый слой, которого вы обычно избегаете. Объедините их:
RUN cmd1 \
&& cmd2 \
&& cmd3
Почему вы хотите создать образ для каждой из ваших сборок? Это кажется расточительным. Обычно вы создаете свои вещи вне образа Docker и только упаковываете результаты.
Мой совет - использовать плагин sbt-native-packager SBT с интеграцией Docker , чтобы просто создать образ из ваших артефактов после их создания. Таким образом, вам понадобится только JRE в вашем изображении, а не JDK, не SBT. Кроме того, вам не нужно ждать инициализации SBT при запуске вашего изображения.
Вы можете использовать многоэтапные сборки , если у вас установлена новая версия Docker.
Попытка дать Вам, которых краткий ответ на Ваше сомнение, если Вы выполняетесь эти skip(n).take(m)
методы на linq (с SQL 2005 / 2008 как сервер базы данных) Ваш запрос, будет использовать Select ROW_NUMBER() Over ...
оператор, с, является так или иначе прямой подкачкой страниц в механизме SQL.
Предоставление Вам пример, у меня есть таблица базы данных, названная mtcity
, и я записал следующий запрос (работа также с linq к объектам):
using (DataClasses1DataContext c = new DataClasses1DataContext())
{
var query = (from MtCity2 c1 in c.MtCity2s
select c1).Skip(3).Take(3);
//Doing something with the query.
}
получающийся запрос будет:
SELECT [t1].[CodCity],
[t1].[CodCountry],
[t1].[CodRegion],
[t1].[Name],
[t1].[Code]
FROM (
SELECT ROW_NUMBER() OVER (
ORDER BY [t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]) AS [ROW_NUMBER],
[t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]
FROM [dbo].[MtCity] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
, Который является оконным доступом к данным (довольно прохладный, btw, потому что будет возвращать данные с самого начала и получит доступ к таблице пока, условия соблюдают). Это будет очень похоже на:
With CityEntities As
(
Select ROW_NUMBER() Over (Order By CodCity) As Row,
CodCity //here is only accessed by the Index as CodCity is the primary
From dbo.mtcity
)
Select [t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0 + 1 AND @p0 + @p1
Order By c.Row Asc
За исключением того, что, этот второй запрос будет выполняться быстрее, чем результат linq, потому что он будет использовать исключительно индекс для создания окна доступа к данным; это означает при необходимости в некоторой фильтрации фильтрация должна быть (или должен быть) в списке Объектов (где строка создается), и некоторые индексы должны быть созданы также для поддержания на высоком уровне хорошей производительности.
Теперь, что лучше?
, Если у Вас есть в значительной степени твердый рабочий процесс в Вашей логике, реализовывая надлежащий SQL, путь будет сложным. В этом случае LINQ будет решением.
, Если можно понизить ту часть логики непосредственно к SQL (в хранимой процедуре), это будет еще лучше, потому что можно реализовать второй запрос, который я показал Вам (использующие индексы), и позвольте SQL генерировать и хранить План выполнения запроса (улучшающий производительность).
LinqToSql автоматически преобразует.Skip (N1).Take (N2) в синтаксис TSQL для Вас. На самом деле, каждый "запрос", который Вы делаете в Linq, на самом деле просто создает SQL-запрос для Вас в фоновом режиме. Для тестирования этого просто выполните SQL Profiler, в то время как приложение работает.
пропускать/брать методология работала очень хорошо на меня и других от того, что я считал.
Из любопытства, какой запрос самоподкачки страниц Вы имеете, которому Вы верите, более эффективно, чем Linq пропускает/берет?
Мы используем CTE, перенесенный в Динамический SQL (потому что наше приложение требует динамической сортировки стороны сервера данных) в рамках хранимой процедуры. Я могу обеспечить основной пример, если Вы хотели бы.
у меня не было шанса посмотреть на T/SQL, который производит LINQ. Кто-то может отправить образец?
Мы не используем LINQ или прямой доступ к таблицам, поскольку мы требуем дополнительного уровня безопасности (допустил, что динамический SQL повреждает это несколько).
Что-то вроде этого должно добиться цели. Можно добавить в параметризованных значениях для параметров, и т.д.
exec sp_executesql 'WITH MyCTE AS (
SELECT TOP (10) ROW_NUMBER () OVER ' + @SortingColumn + ' as RowID, Col1, Col2
FROM MyTable
WHERE Col4 = ''Something''
)
SELECT *
FROM MyCTE
WHERE RowID BETWEEN 10 and 20'