Oracle nie zmienia specyfikacji JDBC. Zaktualizowaliśmy dokumentację sterownika JDBC bazy danych Oracle. Jeśli w dokumentach jest coś, co jest mylące lub niepoprawne, naprawimy to. Jednak nie ma zmiany w specyfikacji JDBC.
Wcześniejsze wersje sterowników są niespójne. W niektórych miejscach zerowali sekundy. W innych miejscach nie. W 12.1 sprawiliśmy, że kierowcy są konsekwentni. Pytanie brzmiało, jakie było właściwe zachowanie. Tak czy inaczej, niektórzy klienci zauważą zmianę w zachowaniu.
Po długim i intensywnym dyskusji zdecydowaliśmy, że najlepszym rozwiązaniem dla klientów Oracle Database nie było zero sekund. Pozwól mi wyjaśnić.
- Typ DATE ANSI ANSI nie przechowuje sekund. Specyfikacja JDBC zakłada przeważnie ANSI SQL.
- Typ bazy DATA bazy danych Oracle przechowuje sekundy. Członkowie komisji ANSI SQL zapewnili mnie, że jest to w pełni zgodne z ANSI SQL.
- Celem JDBC jest udostępnienie bazy danych. Specyfikacja JDBC nie definiuje abstrakcyjnej bazy danych z intencją, że sterowniki implementują tę abstrakcyjną bazę danych. Sterowniki JDBC są wymagane, aby ujawnić szczegóły bazy danych, a nie ukrywać ich. JDBC definiuje narzędzia do abstrakcji niektórych szczegółów bazy danych, ale programista ma wybór, czy użyć tych narzędzi, czy nie.
java.sql.Date
nie wymusza zachowanie zero sekund choć łatwo mógł. Obowiązek jest wymuszony egzekwowaniem tego zachowania.
Tak więc Oracle DATE ma kilka sekund. Sterownik JDBC Oracle udostępnia bazę danych Oracle. Jeśli getDate
zera w sekundach, to straciłoby dane. Dla niektórych użytkowników nie miało to znaczenia, ale dla innych byłoby. Ponieważ Oracle DATE przechowuje sekundy czasu przechowywania wielu baz danych Oracle z drugą dokładnością w kolumnach DATE. Zerowanie sekund w tych przypadkach spowoduje utratę informacji.
Jeśli program przekaże datę o niezerowych sekundach do setDate
, program utworzy datę niezgodności. Jeśli sterownik zeruje sekundy, sterownik wyrzucił informacje dostarczone przez program i przechowywane w bazie danych. Ponownie sterownik stracił informacje.
To proste wystarczy napisać SQL lub Java, aby wyzerować sekundy zarówno get i set. Trudniej jest obejść utratę informacji, choć oczywiście jest to możliwe.
Więc zdecydowaliśmy, aby kierowcy konsekwentnie trzymać sekundy na java.sql.Date
s. ResultSet.getDate
może zbudować java.sql.Date
z niezerowymi sekundami, jednak to dokładnie odzwierciedla to, co jest w bazie danych. Jak już wcześniej wspomniano, implementacja Data mogła to wymusić, ale tego nie zrobiła. Jednym ze sposobów obejrzenia tego jest to, że program utworzył datę, kiedy zapisał ją w bazie danych, więc jest to odpowiedzialność programu. Sterownik używa właśnie danych dostarczonych przez program.
Naprawdę mi przykro sterowniki były niespójne wcześniej. Cały czas staramy się usuwać niespójności i dziwne przypadki narożne. Ale mamy ogromną bazę zainstalowaną. Za każdym razem, gdy coś zmieniamy, nawet oczywiste poprawki błędów, wpływ ma jakiś klient. Staramy się znaleźć równowagę między ulepszaniem sterowników i zachowaniem kompatybilności wstecznej. 12c to główne wydanie. Wykorzystaliśmy tę okazję, aby wprowadzić bardziej widoczne zmiany. Przykro nam z powodu zakłóceń, ale uważamy, że jest to właściwe rozwiązanie dla klientów.
Innym problemem, który pojawił się związany ojdbc7-12.1.0.1: PreparedStatement.setDate (indeks java.sql.Date) nie jest skracanie czasu zanim jakikolwiek składnik przechowywania wartości w bazie danych. Może występować tylko z 10g (nie mam 11g lub 12c, aby przetestować go w innych wersjach). –