
Oleg
28.07.2016
13:48:36
или ты хочешь чтобы после закрытия твоей программы существовала возможность оставить соединение открытым?)))

Dmitry
28.07.2016
13:49:00
я хотел чтобы после завершения метода соединение оставалось открытым.

Oleg
28.07.2016
13:49:07
какого метода?

Dmitry
28.07.2016
13:49:22
чтобы при новом запросе его не пеероткрывать. getIMGsMetadataFromDB()

Google

Oleg
28.07.2016
13:49:37
вот тут я реально не знаю
возможно идеологически правильно открывать каждый раз соединение (при закрытии например транзакция происходит)

Dmitry
28.07.2016
13:50:10
просто вот на сайте сидит 100 человек и шлют запросы. Что получается соединение будет 100 раз в секунду открываться, закрываться?

Oleg
28.07.2016
13:50:18
а возможно оно открывается один раз на жизнь программы

Макс
28.07.2016
13:50:23

Dmitry
28.07.2016
13:50:40
так я же:
scope(exit) conn.close();
вызываю, значит оно закрывается

Oleg
28.07.2016
13:50:53
ты про пример из readme?)
это просто пример использования, это не "боевой" код
понятное дело там main закончился и всё закончилось
в реальном коде нужно разбираться, какие объекты подразумевается что живут всегда, а какие постоянно создаются и уничтожаются

Dmitry
28.07.2016
13:56:17
ок пасибо, щас еще повтыкаю

Макс
28.07.2016
14:04:32

Dmitry
28.07.2016
14:07:05
так, а можно написать так?
~this()
{
scope(exit) conn.close();
}
?

Google

Dmitry
28.07.2016
14:07:18
Олег, щас еще твой пример посмотрю

Макс
28.07.2016
14:09:35
здесь не нужен scope(exit)
просто conn.close()

Dmitry
28.07.2016
14:09:57
а точно

Макс
28.07.2016
14:09:59
деструктор — это и есть эдакий scope(exit), только при удалении объекта

Dmitry
28.07.2016
14:11:04
и тогда:
scope(exit) stmt.close();
оставлю в методе т.к. по логике именно он в каждом методе должен финализироваться?

Oleg
28.07.2016
14:11:37
создать только не забудь)

Макс
28.07.2016
14:11:47

Dmitry
28.07.2016
14:13:04
предлагаешь в каждом методе его отдельно создавать?

Макс
28.07.2016
14:13:57
да. ведь каждый раз ты в прошлый раз его уже удалил, так?
ну, закрыл. сделал непригодным к использованию

Dmitry
28.07.2016
14:16:47
а как быть если создаание соединение должно быть видно в методе финилизации:
получается надо посмотреть тип conn и объявить его как поле?

Макс
28.07.2016
14:20:50
да

Dmitry
29.07.2016
07:09:50
Так, в итоге вот этот пример правильный?
http://forum.dlang.org/post/wsadfomctuprdvmuwqxx@forum.dlang.org
как я понял по теме единственный разумный вариант это пул подключений делать
К теме про сборку мусора. В каких случаях надо вручную вызывать деструктор:
`
Foo foo = new Foo;
destroy(foo);
`
Если его не вывать память так и не освободится?

Макс
29.07.2016
10:46:27
При завершении программы всё равно высвободится. Или когда GC захочет поработать, всё равно высвободится, я так понимаю. А самому нужно вроде если сам чувствуешь, что слишком много создаёшь объектов и точно знаешь, когда их удалять. Например, в каком-то большом цикле если приходится на каждом шаге что-то создавать, то почему бы и не удалять за собой – через тот же scope(exit), например.
Но я не спец, я просто ляпнул)

Eto
29.07.2016
12:43:24

Google

Eto
29.07.2016
12:44:07
destroy только вызывает деструктор. Оно пригодится, когда нужно высвободить ресурсы занимаемые объектом.

Dmitry
29.07.2016
12:44:41
точнее не вызывает, а помечаетобъект к уничтожению?
и дальше его ГК допнет?

Eto
29.07.2016
12:45:21
Да, я привёл цитату.

Dmitry
29.07.2016
12:46:35
нет, я к тому что что будет если объект к уничтожению самому не пометить
когда метод завершится разве GC не грохнет все что внутри него было?

Eto
29.07.2016
12:49:37
Я уверен, что GC вызовет финализаторы для всего содержимого.

Oleg
29.07.2016
15:54:02
вызовет
вот только когда не всегда понятно

Dmitry
29.07.2016
16:43:55
А тут получается гарантированно при запуске?

Oleg
29.07.2016
18:01:58
запуске чего?
destroy только деструктор вызывает

Oleg
29.07.2016
18:02:39
раньше было ключевое слово delete, работало как в С++

Dmitry
29.07.2016
18:04:23
при запуске GC

Oleg
29.07.2016
18:09:33
gc работает всегда
он выделяет память
он принимает решение что-то почистить

Dmitry
29.07.2016
18:10:01
в чистит память в какой момент? По таймеру?

Oleg
29.07.2016
18:10:14
нет, по какому-то своду правил
типа памяти мало

Google

Oleg
29.07.2016
18:10:56
в процентном соотношении
динамика выделения памяти тоже вроде влияет, тут точно не знаю
кто с vibe.d плотно работает? можете объяснить почему при обновлении страницы дважды отрабатывается функция, отвечающая на запрос?
если создать шаблонное приложение и просто вписать логирование в функцию hello оно выведется 2 раза

Pavel
31.07.2016
15:40:46
Не наблюдал такого

Dmitry
31.07.2016
16:06:11
а логгируешь чем?
можешь код показать?

Oleg
31.07.2016
17:53:11
Тот логгер что в vibe
Прям просто копирую с static this

Admin
ERROR: S client not available

Oleg
31.07.2016
18:49:59
вот добрался до компа
import vibe.d;
shared static this()
{
auto settings = new HTTPServerSettings;
settings.port = 8080;
settings.bindAddresses = ["::1", "127.0.0.1"];
listenHTTP(settings, &hello);
logInfo("Please open http://127.0.0.1:8080/ in your browser.");
}
void hello(HTTPServerRequest req, HTTPServerResponse res)
{
logInfo("hello");
res.writeBody("Hello, World!");
}
при обновлении страницы hello выводится 2 раза
29 и 30-aplha.4 одинаково

Dmitry
31.07.2016
18:50:50
а если счетчик какой нить поставить int i

Oleg
31.07.2016
18:50:59
инкрементируется 2 раза
вообще я это обнаружил когда в базу писать при запросе стал
по две записи на одно обращение

Макс
31.07.2016
18:51:20
в порядке бреда: а обращение точно происходит одно? а если консольным httpie/wget/чем-то проверить, то как будет? а то вдруг это браузер и его плагины балуются лишними запросами

Oleg
31.07.2016
18:51:36
хм
сейчас проверю, чёт даже не пришло в голову, что браузер может косячить...

Google

Макс
31.07.2016
18:52:49
=))

Oleg
31.07.2016
18:52:51
теряю хватку))
спасибо за подсказку

0x9d8e
31.07.2016
18:54:03
По идее браузер не долже бы такой ерунды для post-запросов допускать

Dmitry
31.07.2016
18:55:01
да??
а из-за чего это? Плагин какой-то или что?

Макс
31.07.2016
18:56:58
вот тоже интересно, и хочется верить, что плагин. я бы начал отключать сначала всякие Pocket и прочие сохранятели копий/миниатюрок, у них могут быть причины делать запрос

Oleg
31.07.2016
18:56:59
плагины только Google Docs, Google Docs Offline, Google Sheets, Google Slides

Макс
31.07.2016
18:57:11
или HTTPSEverywhere
хром?

Oleg
31.07.2016
18:57:26
да
кстати при самом первом запросе (после перезапуска сервера) запрос 1

Макс
31.07.2016
18:58:03
не знаю зачем я спросил, всё равно не помогу)

Oleg
31.07.2016
18:58:11
далее если переоткрывать страницу 2 запроса

0x9d8e
31.07.2016
18:58:30
Хром может предварительно обращаться чтобы попытаться подгрузить заранее, чтобы заголовок в подсказки подтянуть. Но тогда он дожен бы второй раз уже полученный результат отдать, но...
*показать а не отдать

Oleg
31.07.2016
18:59:25
надо будет потом проверить как он себя ведёт с post запросами...
не должен так делать
а то что я в get писал в базу это просто ради "попробовать писать в базу"... так не надо делать, как я понял)

Pavel
31.07.2016
20:39:02
проверять http запросы надо только через curl !
Так будет соблюдена однозначность и повторяемость. Навороченные браузеры хрен знает как там кешируют, буферизируют, работают с редиректами и всякой плагинной магией.

Dmitry
01.08.2016
04:05:46
Видимо я сталкивался с этим. Такое было во всех браузерах. Тогда я решил это глюк в коде
А не приводит ли такой код к лишней аллокации памяти?
jsonfromstruct = jsonfromstruct.replaceLast(`,`,``);