तिथि
जावा में टाइमज़ोन अज्ञेयवादी है। यह हमेशा UTC लेता है (डिफ़ॉल्ट रूप से और हमेशा) लेकिन जब Date
/ टाइमस्टैम्प
एक JDBC ड्राइवर के माध्यम से एक डेटाबेस में भेजा जाता है, यह JVM समय क्षेत्र के अनुसार दिनांक / समय की व्याख्या करता है जो बदले में सिस्टम समय क्षेत्र (मूल ऑपरेटिंग सिस्टम ज़ोन) में डिफ़ॉल्ट होता है।
इसलिए, जब तक MySQL JDBC ड्राइवर को स्पष्ट रूप से UTC ज़ोन का उपयोग करने के लिए मजबूर नहीं किया गया था या JVM स्वयं उस ज़ोन का उपयोग करने के लिए सेट नहीं है, यह Date
स्टोर नहीं करेगा। / टाइमस्टैम्प
यूटीसी का उपयोग करते हुए लक्ष्य डेटाबेस में भले ही MySQL को default_time_zone='+00:00'
का उपयोग करके यूटीसी का उपयोग करने के लिए कॉन्फ़िगर किया जाना था। my.ini
. में या my.cnf
[mysqld]
. में खंड। Oracle जैसे कुछ डेटाबेस टाइम ज़ोन के साथ टाइम स्टैम्प का समर्थन कर सकते हैं और यह एक अपवाद हो सकता है जिससे मैं परिचित नहीं हूँ (अनचाहे क्योंकि मेरे पास वर्तमान में वह वातावरण नहीं है)।
void setTimestamp(int पैरामीटरIndex, Timestamp x, Calendar cal) SQLException को फेंकता है
इसे के आह्वान की जांच करके और स्पष्ट किया जा सकता है। सेटटाइमस्टैम्पइंटरनल ()
MySQL JDBC ड्राइवर कार्यान्वयन की विधि।
निम्नलिखित देखें दो
setTimestampInternal()
पर कॉल करता है setTimestamp()
. के दो अतिभारित संस्करणों के भीतर से विधि विधि।
जब कोई कैलेंडर
न हो उदाहरण PreparedStatement#setTimestamp()
. के साथ निर्दिष्ट किया गया है विधि, डिफ़ॉल्ट समय क्षेत्र का उपयोग किया जाएगा (this.connection.getDefaultTimeZone()
)।
एप्लिकेशन सर्वर में कनेक्शन पूल का उपयोग करते समय / कनेक्शन द्वारा समर्थित सर्वलेट कंटेनर / जेएनडीआई जैसे डेटा स्रोतों तक पहुंच या संचालन,
com.mysql .jdbc.jdbc2.Optional.MysqlXADataSource
(एक्सए)com.mysql .jdbc.jdbc2.Optional.MysqlDataSource
(गैर-एक्सए)
MySQL JDBC ड्राइवर को हमारी रुचि के वांछित समय क्षेत्र (UTC) का उपयोग करने के लिए मजबूर करने की आवश्यकता है, निम्नलिखित दो मापदंडों को कनेक्शन URL की क्वेरी स्ट्रिंग के माध्यम से आपूर्ति करने की आवश्यकता है।
<उप>मैं MySQL JDBC ड्राइवरों के इतिहास से परिचित नहीं हूँ, लेकिन MySQL ड्राइवरों के अपेक्षाकृत पुराने संस्करणों में, यह पैरामीटर useLegacyDatetimeCode
आवश्यकता नहीं हो सकती है। इस प्रकार, किसी को उस स्थिति में स्वयं को समायोजित करने की आवश्यकता हो सकती है।
उदाहरण के लिए, एप्लिकेशन सर्वर, ग्लासफ़िश के मामले में, उन्हें JDBC क्षेत्र बनाते समय सर्वर के अंदर JDBC कनेक्शन पूल के साथ-साथ अन्य विन्यास योग्य गुणों के साथ या तो व्यवस्थापक वेब GUI टूल का उपयोग करके या domain.xml में सेट किया जा सकता है।
सीधे। domain.xml
निम्न जैसा दिखता है (XA डेटा स्रोत का उपयोग करके)।
<संपत्ति का नाम="पासवर्ड" मान ="पासवर्ड"> संपत्ति> <संपत्ति का नाम ="डेटाबेस नाम" मूल्य ="डेटाबेस_नाम"> संपत्ति> <संपत्ति का नाम ="सर्वरनाम" मूल्य ="लोकलहोस्ट"> संपत्ति> <संपत्ति का नाम ="user" value="root">
WildFly के मामले में, उन्हें standalone-xx.yy.xml
में कॉन्फ़िगर किया जा सकता है CLI कमांड का उपयोग करना या व्यवस्थापक वेब GUI टूल का उपयोग करना (XA डेटा स्रोत का उपयोग करना)।
database_name localhost 3306 xa-datasource-property> true UTF-8 गलत UTC com.mysql.jdbc.jdbc2.Optional.MysqlXADataSource mysql TRANSACTION_READ_COMMITTED <एक्सए-पूल> <न्यूनतम-पूल-आकार>5मिनट-पूल-आकार> <अधिकतम-पूल-आकार>15अधिकतम-पूल-आकार> <सुरक्षा> <उपयोगकर्ता-नाम>रूटउपयोगकर्ता- नाम> <पासवर्ड>पासवर्डपासवर्ड> सुरक्षा> <मान्यता> <वैध-कनेक्शन-जांचकर्ता वर्ग-नाम="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/> <पृष्ठभूमि-सत्यापन>सत्यपृष्ठभूमि-सत्यापन> <अपवाद-सॉर्टर वर्ग-नाम="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/> मान्यता> <कथन> <शेयर-तैयार-कथन>सत्य com.mysql.jdbc.Driverड्राइवर-क्लास> ड्राइवर>ड्राइवर>
<उप>गैर-XA डेटा स्रोतों पर भी यही बात लागू होती है। उस स्थिति में उन्हें सीधे ही कनेक्शन URL में जोड़ा जा सकता है।
ये सभी उल्लिखित गुण जेडीबीसी ड्राइवर में उपलब्ध उल्लिखित वर्ग पर सेट किए जाएंगे, अर्थात् com.mysql.jdbc.jdbc2.Optional.MysqlXADataSource
दोनों मामलों में इस वर्ग में अपने संबंधित सेटर विधियों का उपयोग करना।
उदाहरण के लिए, सीधे कोर JDBC API का उपयोग करने या टॉमकैट में कनेक्शन पूलिंग के मामले में, उन्हें सीधे कनेक्शन URL पर सेट किया जा सकता है (context.xml
में) )
<संदर्भ antiJARLocking="true" path="/path">
का उपयोग करें
अतिरिक्त :
यदि लक्ष्य डेटाबेस सर्वर डीएसटी-सेंसिबल ज़ोन पर चल रहा है और डेलाइट सेविंग टाइम (डीएसटी) बंद नहीं है, तो यह समस्याएँ पैदा करेगा। एक मानक समय क्षेत्र का उपयोग करने के लिए डेटाबेस सर्वर को भी बेहतर तरीके से कॉन्फ़िगर करें जो यूटीसी या जीएमटी जैसे डीएसटी से प्रभावित नहीं है। यूटीसी को आमतौर पर जीएमटी पर पसंद किया जाता है लेकिन इस संबंध में दोनों समान हैं। सीधे यह लिंक ।
वैसे, मैंने जेपीए 2.1 के बाद से, EclipseLink के मालिकाना कनवर्टर को छोड़ दिया है। अपना स्वयं का मानक कनवर्टर प्रदान करता है
जिसे आवश्यकता पड़ने पर एक अलग जेपीए प्रदाता को पोर्ट किया जा सकता है, बिना थोड़े या बिना किसी संशोधन के। यह अब निम्न जैसा दिखता है जिसमें java.util.Date
java.sql.Timestamp
. द्वारा भी प्रतिस्थापित किया गया था ।
तब यह पूरी तरह से संबंधित एप्लिकेशन क्लाइंट (सर्वलेट्स / जेएसपी / जेएसएफ / रिमोट डेस्कटॉप क्लाइंट आदि) की जिम्मेदारी है कि वह अंतिम उपयोगकर्ताओं को दिनांक / समय प्रदर्शित या प्रस्तुत करते समय एक उपयुक्त उपयोगकर्ता के समय क्षेत्र के अनुसार दिनांक / समय को परिवर्तित करें। संक्षिप्तता के लिए इस उत्तर में शामिल नहीं है और वर्तमान प्रश्न की प्रकृति के आधार पर ऑफ-विषय है।
कन्वर्टर में उन शून्य जांचों की भी आवश्यकता नहीं है क्योंकि यह पूरी तरह से संबद्ध एप्लिकेशन क्लाइंट (ग्राहकों) की जिम्मेदारी है जब तक कि कुछ फ़ील्ड वैकल्पिक न हों।
अब सब ठीक हो जाता है। किसी भी अन्य सुझाव/सुझावों का स्वागत है। मेरे किसी भी अज्ञानी की आलोचना का स्वागत है।