|
|
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Добрый день. Дано Есть некоторый процесс, который осуществляет сбор данных из разных источников и загружает их в базу данных. Процесс для ускорения работы организует несколько потоков, каждый из которых пишет в базу. Процесс запускается периодически по расписанию. Надо Сохранять в базе в каждой записи, созданной процессом, дату/время начала работы процесса, т.е. датау/время очередного запуска процесса, чтобы можно было впоследствии разделить результаты сеансов работы этого процесса. Собственно вопрос Как наиболее красиво передавать дату/время запуска очередного сеанса работы процесса в порождаемые классы, потоки? P.S. Файлы с какими-либо данными на жестком диске создавать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 11:45:28 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
1) На старте процесса считать время (например, System.currentTimeMilis()). 2) Передать это время всем заинтересованным потокам через Runnable/Callable. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 11:55:31 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick, вариант2: - для различий "кто писал" - сохранять ID потока в БД - для логирования времени - создать в БД поле временной метки TimeStamp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 12:03:48 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
DEVcoach2) Передать это время всем заинтересованным потокам через Runnable/Callable. Ну, так в этом то и вопрос. Тащить во все конструкторы классов эту дату как-то "некрасиво", хотелось бы какого-то элегантного решения. Singleton класс, хранящий дату, или есть более красивое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 12:21:43 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Petro123Garrick, вариант2: - для различий "кто писал" - сохранять ID потока в БД - для логирования времени - создать в БД поле временной метки TimeStamp Тогда возникает такая же проблема передачи этого ID всем классам и потокам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 12:25:17 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
GarrickPetro123Garrick, вариант2: - для различий "кто писал" - сохранять ID потока в БД - для логирования времени - создать в БД поле временной метки TimeStamp Тогда возникает такая же проблема передачи этого ID всем классам и потокам. afaik есть API функция изнутри потока - Дай ID потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 12:45:52 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
GarrickТащить во все конструкторы классов эту дату а год тащить тебе не надо? Что даст тебе время, если она не такое точное для потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 12:47:22 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick, В общем виде - вам нужен глобальный контекст для всего процесса загрузки данных, и время начала - один из элементов этого контекста. Скорее всего, вам понадобятся и другие элементы контекста - соединения или параметры соединения с базой данных, например. Для обеспечения доступа к контексту используются разнообразные фреймворки с dependency injection - Spring, Guice, и т.п. Если они для вас тяжеловесны, сохраняйте контекст как InheritableThreadLocal - достаточно создать и прописать контекст в главном потоке, и он будет доступен во всех дочерних потоках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 12:58:13 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick, кстати, Имя или ИД источника вам не важен? Т.к. обычно - поток на источник. Следовательно, Ид потока не нужен. А Ид_поставщика уже есть и идёт в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 12:58:34 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
rfq, он непонятно что логирует. Если нужно идентифицировать потоки, то Глобальный контекст не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 13:00:19 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
rfqGarrick, В общем виде - вам нужен глобальный контекст для всего процесса загрузки данных, и время начала - один из элементов этого контекста. Скорее всего, вам понадобятся и другие элементы контекста - соединения или параметры соединения с базой данных, например. Для обеспечения доступа к контексту используются разнообразные фреймворки с dependency injection - Spring, Guice, и т.п. Если они для вас тяжеловесны, сохраняйте контекст как InheritableThreadLocal - достаточно создать и прописать контекст в главном потоке, и он будет доступен во всех дочерних потоках. Да, наверное что-то такое. Поподробнее где посмотреть? Petro123он непонятно что логирует. Загрузка данных в базу происходит "сеансами", нужно в базе сохранить "идентификатор" сеанса загрузки - это дата/время (TIMESTAMP), чтобы потом внутри базы можно было разделить данные по "сеансам". Сам сеанс может длится до нескольких часов, поэтому, требуется какая-то "глобальная" переменная, инициализированная единожды, доступная для всех потоков, порождённых в текущем сеансе работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 14:02:27 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
GarrickЗагрузка данных в базу происходит "сеансами", нужно в базе сохранить "идентификатор" сеанса загрузки - это дата/время (TIMESTAMP), чтобы потом внутри базы можно было разделить данные по "сеансам". Сам сеанс может длится до нескольких часов, поэтому, требуется какая-то "глобальная" переменная, инициализированная единожды, доступная для всех потоков, порождённых в текущем сеансе работы. Если ты не в курсе, спроси у постановщика: - что такое термин сеанс при многопотоковости. Т.е. в еденицу времени будет 10 потоков с Одним временем. Это будет один сеанс на 100 поставщиков данных? - старт одного потока от другого может отличаться на милли-микросекунду. Т.е. допустимо, что будет огрубление и у обоих потоков будет Один сеанс? - Какая связь Сеанс - Поток? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 15:04:34 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Petro123Если ты не в курсе, спроси у постановщика: - что такое термин сеанс при многопотоковости. Т.е. в еденицу времени будет 10 потоков с Одним временем. Это будет один сеанс на 100 поставщиков данных? - старт одного потока от другого может отличаться на милли-микросекунду. Т.е. допустимо, что будет огрубление и у обоих потоков будет Один сеанс? - Какая связь Сеанс - Поток? Если обратили внимание, слово "сеанс" я взял в кавычки, т.к. это не имеет отношение к какой-либо терминологии Java. В данном случае "сеанс" это именно из один сеансов (как кино в кинотеатре) загрузки данных в базу, таких сеансов в течении суток несколько, необходимо внутри базы отличать один от другого. Petro123Т.е. в еденицу времени будет 10 потоков с Одним временем. Это будет один сеанс на 100 поставщиков данных? Да, нужно именно одно единое время с точностью до миллисекунд для всех источников и потоков, рождённых в одном "сеансе" загрузки данных в независимости от времени "рождения" самого потока. По-простому нужно время старта программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 15:53:56 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick, +1 к варианту с InheritableThreadLocal ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 15:57:27 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick, - В проектировании, есть Временная диаграмма. Давай на пальцах: ВИ №1 - 26.04.2013 11:17:51 включил комп - стартовал процесс в автозагрузке - 26.04.2013 11:17:53,13 - стартовало 15 потоков для 15-ти источников данных - 26.04.2013 17:00:00 - стоп потока 1 .......... - 26.04.2013 18:00:13 - стоп потока 15 Что хотел увидеть в БД? ЗЫ. Перед программированием пишут ВИ и диаграммы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:02:44 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Petro123, - 26.04.2013 11:17:51 включил комп - стартовал процесс в автозагрузке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:09:21 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Petro123GarrickЗагрузка данных в базу происходит "сеансами", нужно в базе сохранить "идентификатор" сеанса загрузки - это дата/время (TIMESTAMP), чтобы потом внутри базы можно было разделить данные по "сеансам". Сам сеанс может длится до нескольких часов, поэтому, требуется какая-то "глобальная" переменная, инициализированная единожды, доступная для всех потоков, порождённых в текущем сеансе работы. Если ты не в курсе, спроси у постановщика: - что такое термин сеанс при многопотоковости. Т.е. в еденицу времени будет 10 потоков с Одним временем. Это будет один сеанс на 100 поставщиков данных? - старт одного потока от другого может отличаться на милли-микросекунду. Т.е. допустимо, что будет огрубление и у обоих потоков будет Один сеанс? - Какая связь Сеанс - Поток? Долой singleton! :-) В БД нужна сущность <Сеанс> с датой старта и завершения, ID-ник прилагается (ID_Сеанса, Время_Старта, Время_Завершения). Нужна сущность <Поток> (ID_Потока, ID_Сеанса) которая связана с сущностью <Сеанс> И нужна сущность <Данные> (ID_Потока, время, данные) Все это можно преобразовать в <Данные> (ID_Сеанса, ID_Потока, время, данные) Тогда продолжительность сеанса SELECT ID_Сеанса, min(время) as Время_Старта, max(время) as Время_Завершения GROUP BY ID_Сеанса В программе просто нужно создавать уникальный ID_Сеанса и передавать в поток, поток создает для себя уникальный ID_Потока и сохраняет данные в таблицу. А Singletin не нужен... совсем. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:22:52 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
mad_nazgul, )) 3 варианта. От простого к сложному оверхеду) - в конструкторе (прозрачность кода) - Сущность Сеанс (по ООП) - nheritableThreadLocal (оверхед??) imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:26:24 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick Надо Сохранять в базе в каждой записи, созданной процессом, дату/время начала работы процесса, т.е. датау/время очередного запуска процесса, чтобы можно было впоследствии разделить результаты сеансов работы этого процесса JDBCAppender log4j или аналог из используемой вами библиотеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:16:12 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick Собственно вопрос Как наиболее красиво передавать дату/время запуска очередного сеанса работы процесса в порождаемые классы, потоки? Для этого в Java есть принцип closure http://en.wikipedia.org/wiki/Closure_(computer_science)#Local_classes_.28Java.29 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 21:07:13 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov JDBCAppender log4j или аналог из используемой вами библиотеки. Чем это может помочь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2013, 10:58:07 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
SergunkaGarrick Собственно вопрос Как наиболее красиво передавать дату/время запуска очередного сеанса работы процесса в порождаемые классы, потоки? Для этого в Java есть принцип closure http://en.wikipedia.org/wiki/Closure_(computer_science)#Local_classes_.28Java.29 Т.е. если у меня в классе, реализующем поток, нагорожена гора кода по подключению к источнику данных, выборки и проверки данных, загрузки их в базу и пр., всё это надо реализовать в анонимном классе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2013, 11:02:24 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
GarrickSergunkaпропущено... Для этого в Java есть принцип closure http://en.wikipedia.org/wiki/Closure_(computer_science)#Local_classes_.28Java.29 Т.е. если у меня в классе, реализующем поток, нагорожена гора кода по подключению к источнику данных, выборки и проверки данных, загрузки их в базу и пр., всё это надо реализовать в анонимном классе? В Java closure реализовано таким образом - другого нет. В локальном классе Вам собственно нужно реализовать исключительно вызов всей вашей дребедени - это уже скажем исключительно ваши способности по архитектуре и дизайну, но очевидно, что не фатально даже если вы тупо там процедурками опишите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2013, 19:44:47 |
|
||
|
Разделение данных между классами и потоками
|
|||
|---|---|---|---|
|
#18+
Garrick нагорожена гора кода по подключению к источнику данных К слову сказать для этой горы кода имеет очень большой смысл ознакомится с дизайн-патерном Thread Pool Executor все одно рано или поздно понадобится http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html http://en.wikipedia.org/wiki/Thread_pool_pattern ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2013, 19:50:06 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38398461&tid=2128570]: |
0ms |
get settings: |
16ms |
get forum list: |
29ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
305ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 278ms |
| total: | 743ms |

| 0 / 0 |
