Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA и писанина во вторую коннекцию / 14 сообщений из 14, страница 1 из 1
10.10.2020, 19:21
    #40007294
hck2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
есть приложение c JPA, пишет в mariadb. оказалось powerbi не умеет напрямую с mariadb работать, планирую поднять коннекцию в azure sql и писать те же транзакции еще и туда.
я верно понимаю, что те же entity записать не получится ? планирую наплодить копии каждой entity, через gson копировать туда объект, и тогда делать persist/merge. может что-то попроще можно выдумать ?
...
Рейтинг: 0 / 0
10.10.2020, 19:56
    #40007307
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
hck2,
Расскажите с чем работает powerbi. И что у вас есть для этого.
...
Рейтинг: 0 / 0
10.10.2020, 20:14
    #40007308
hck2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
PetroNotC Sharp
Расскажите с чем работает powerbi. И что у вас есть для этого.

у powerbi есть понятие live connections. c mariadb и файликами adsl он live не умеет, умеет только через некий gateway и только 8 раз в сутки синхронизировать. 8 раз в сутки не устраивает.
есть навыки работы со spark, хотел писать в parquet файлки, так тоже пакость (powerbi) и читать parquet не умеет и синхронизация 8 штук лимит.
...
Рейтинг: 0 / 0
10.10.2020, 20:32
    #40007309
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
hck2,
Программисты больше пишут сами чем используют готовое программное обеспечение (ПО).
То есть берут хостинг, томкат, пишут сайт или сервис и т.д.
Понятно?
...
Рейтинг: 0 / 0
10.10.2020, 20:34
    #40007310
hck2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
PetroNotC Sharp

Программисты больше пишут сами чем используют готовое программное обеспечение (ПО).
То есть берут хостинг, томкат, пишут сайт или сервис и т.д.
Понятно?

да, понятно. не пиши больше сюда. твоя помощь не нужна.
...
Рейтинг: 0 / 0
10.10.2020, 20:42
    #40007311
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
hck2,
)) эх, молодо зелено)
Планов громадье!
...
Рейтинг: 0 / 0
11.10.2020, 11:59
    #40007411
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
Zzz79,
Смотришь в книгу видишь фигу). Я говорил про либы и фреймворки а не:
авторPower BI — комплексное программное обеспечение бизнес-анализа компании Microsoft, объединяющее несколько программных продуктов, имеющих общий технологический и визуальный дизайн, соединителей, а также web-сервисов. Power BI относится к классу self-service BI, и BI с резидентным вычислением
...
Рейтинг: 0 / 0
12.10.2020, 08:42
    #40007573
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
hck2
есть приложение c JPA, пишет в mariadb. оказалось powerbi не умеет напрямую с mariadb работать, планирую поднять коннекцию в azure sql и писать те же транзакции еще и туда.
я верно понимаю, что те же entity записать не получится ? планирую наплодить копии каждой entity, через gson копировать туда объект, и тогда делать persist/merge. может что-то попроще можно выдумать ?


Может нафиг mariadb, а всё делать на azure sql?! :-)
В противном случае писать свою репликацию, это то ещё приключение.

Хотя можно сделать стильно, модно молодёжно в виде саги . :-)
...
Рейтинг: 0 / 0
12.10.2020, 09:29
    #40007584
hck2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
mad_nazgul

Может нафиг mariadb, а всё делать на azure sql?! :-)

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

mad_nazgul
Хотя можно сделать стильно, модно молодёжно в виде саги . :-)

не, сложно.
у меня по сути был вопрос верно ли я понимаю, что Entity гвоздями прибита на одну базу и если я захочу сразу писать - самый прямой путь был бы продублировать каждую Entity для azure sql + deep copy объекта ?
...
Рейтинг: 0 / 0
12.10.2020, 13:02
    #40007687
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
hck2
mad_nazgul

Может нафиг mariadb, а всё делать на azure sql?! :-)

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


ИМХО почитайте что такое репликация, двухфазный коммит и всё такое прочие.
Если после этого, всё же захотите писать своё, то хорошо.
Каждый сам кузнец своего счастья.


hck2

mad_nazgul
Хотя можно сделать стильно, модно молодёжно в виде саги . :-)

не, сложно.
у меня по сути был вопрос верно ли я понимаю, что Entity гвоздями прибита на одну базу и если я захочу сразу писать - самый прямой путь был бы продублировать каждую Entity для azure sql + deep copy объекта ?



Не совсем. Один тот же класс entity можно использовать для разных БД.
Но вот как себя поведут два EntityManagera, при работе с одной копией Entity - не знаю.
Я не гуру в Hibernate.
Скорее всего вы сталкнетесь с кучей не очевидных глюков.

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

ИМХО может всё таки рассмотреть переход на azure sql, чем пытаться решить задачу на порядок сложнее?
...
Рейтинг: 0 / 0
12.10.2020, 14:58
    #40007748
hck2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
mad_nazgul
Но вот как себя поведут два EntityManagera, при работе с одной копией Entity - не знаю.
Я не гуру в Hibernate.
Скорее всего вы сталкнетесь с кучей не очевидных глюков.

спасибо. примерно то что ожидал услышать.

mad_nazgul

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

не, эти штуки для ситуации где во вторую бд кровь из носа надо записать. у меня же кровь из носа нужно записать в mariadb, если для отчетов в azure sql не удается записать - трагедии не будет. т.е. принципиально иной сценарий.

mad_nazgul
ИМХО может всё таки рассмотреть переход на azure sql, чем пытаться решить задачу на порядок сложнее?

я наверно понял, что даже если я свои entity переделаю, данные с магазичника все равно нужны в отчетах.
пока самопальная репликация в одну сторону выглядит проще. у меня сильно проще условия, нет удалений, нет конфликтов.
я попробовал включить на mariadb некие temporal tables, теперь у меня есть trxid в таблицах, легко могу изменившиеся стоки кверить. спарком вышло запросто перекидывать дельту в "staging area" на azure sql. спарк не может мне merge сделать, но я могу генерить merge statement и выполнить из jdbcTemplate. т.е. мне только сохранить максимальную trxid нужно в транзакции с merge.
если сеанс связи не удался, транзакция с merge откатится, trxid не продвинется. на следующий сеанс связи staging перезатрется более крупным куском. если ничего не упустил выглядит не сложно.
...
Рейтинг: 0 / 0
12.10.2020, 16:52
    #40007787
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
hck2,
Нет мастер - мастер, только чтение.
Но!
Самодельная репликация, темпоральные таблицы.
И вы пишите что это проще)).
Вам там виднее. Нам тут виднее, велосипед это или нет.
...
Рейтинг: 0 / 0
12.10.2020, 18:21
    #40007806
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
PetroNotC Sharp
вы пишите что это проще

- двухфазные тразакции ради репликации это точно ошибка. Репликацию путем коверканья кода приложения делать не стоит, тем более что "у меня же кровь из носа нужно записать в mariadb, если для отчетов в azure sql не удается записать - трагедии не будет". Как промежуточное решение - асинхронно выполняемое копирование, типа на любые операции изменения через messaging засылать в отдельное приложение сообщения, а уж там вести запись в azure sql. Но разумней по таймеру репликацию производить (в идеале скрипт запускать, но можно и приложение наколхозить). И, тема объема данных не раскрыта ...
...
Рейтинг: 0 / 0
23.01.2021, 18:01
    #40038311
hck2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA и писанина во вторую коннекцию
хочу похвастать. появилось время, доделал. вроде предчувствие не подвело уложился в пару pagedowns.
самое сложное было pom.xml подружить spring со spark, и порадовали temporal tables. офигенная штука, даже круче ораклового flashback.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
@Service
public class EtlService {
    private static final Logger logger = LoggerFactory.getLogger(EtlService.class);

    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;

    @Autowired
    private Environment env;

    @Autowired
    private EntityManager em;

    private HashMap<String, Long> watermarks;

    public void copyMysqlTable(SparkSession spark, String tableName, String idColumn) {
        logger.info("copyMysqlTable: copying table {}",tableName);
        long tableWatermark = loadWatermark(tableName) ;

        Dataset<Row> mysqlDf = spark.read()
                .format("jdbc")
                .option("url", env.getProperty("mysql.datasource.url"))
                .option("dbtable", String.join(".","mydwhdwh",tableName))
                .option("user", env.getProperty("mysql.datasource.username"))
                .option("password", env.getProperty("mysql.datasource.password"))
                .load();

        mysqlDf = mysqlDf.filter(mysqlDf.col("start_trxid").gt(tableWatermark));

        mysqlDf.write()
                .format("jdbc")
                .mode("overwrite")
//                .option("truncate", true)
                .option("url", env.getProperty("spring.datasource.url"))
                .option("dbtable", tableName+"_staging")
                .option("user", env.getProperty("spring.datasource.username"))
                .option("password", env.getProperty("spring.datasource.password"))
                .save();

        List<String> columnList = new ArrayList();
        Arrays.stream(mysqlDf.schema().fields()).forEach(x -> columnList.add(x.name()));

        executeMergeStatement(columnList, tableName, idColumn);

    }

    private void executeMergeStatement(List<String> columnList, String tableName, String idColumn) {
        var setList = columnList.stream().map(s-> "t."+s+" = s."+s).collect(Collectors.joining(", "));
        var valList = columnList.stream().map(s-> "s."+s).collect(Collectors.joining(", "));

        var query = """
		MERGE $target AS t
		USING $source	AS s
		ON (t.$idcolumn = s.$idcolumn)
		WHEN MATCHED
			 THEN UPDATE
			 SET $setlist         
		WHEN NOT MATCHED BY Target THEN
		INSERT ($columnlist)
		VALUES ($vallist);
		""".replace("$target", tableName)
            .replace("$source", tableName+"_staging")
            .replace("$columnlist", String.join(",", columnList))
            .replace("$idcolumn", idColumn)
            .replace("$setlist", setList)
            .replace("$vallist", valList);


        var namedParameters = new MapSqlParameterSource();
        jdbcTemplate.update(query,namedParameters);
    }
...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA и писанина во вторую коннекцию / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]