Одна вещь, с которой я столкнулся поздно в проекте, это то, что типы данных MySQL не могут хранить миллисекунды. Даты и метки времени разрешаются только в секундах! Я не могу вспомнить точные обстоятельства, когда это произошло, но мне пришлось хранить int, который мог бы быть преобразован в дату (с миллисекундами) в моем коде.
Драйверы MySQL JDBC кэшируют результаты по умолчанию до такой степени, что это приведет к нехватке памяти в вашей программе (исключение OutOfMemory). Вы можете отключить его, но вы должны сделать это, передавая некоторые необычные параметры в оператор при его создании:
Statement sx = c.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);
sx.setFetchSize(Integer.MIN_VALUE);
Если вы сделаете это, драйвер JDBC не будет кэшировать результаты в памяти, и вы сможете выполнять огромные запросы НО что делать, если вы используете систему ORM? Вы не создаете утверждения сами, и поэтому не можете отказаться от кэширования. Что в основном означает, что вы полностью испорчены, если ваша система ORM пытается что-то сделать с большим количеством записей.
Если бы у них был какой-то смысл, они бы сделали это настраиваемым с помощью URL JDBC. Ну хорошо.