2012-06-08 10 views
7

में कनेक्शन प्राप्त करने का प्रयास करते समय मैं वर्तमान में ओरेकल में जावा संग्रहीत प्रक्रियाओं के साथ काम कर रहा हूं और अपने जावा के भीतर कनेक्शन प्राप्त करने का प्रयास करते समय कुछ अजीब व्यवहार देख रहा हूं कोड।java.lang.ArithmeticException ओरेकल 11.2.0.2.0 (64 बिट)

मेरा जावा एक जार फ़ाइल में पैक किया गया है और फिर loadjava कमांड लाइन उपयोगिता का उपयोग करके ओरेकल में तैनात किया गया है। एक package तब डेटाबेस में बनाया गया है जो नामित जावा क्लास में प्रत्येक विधि को कॉल विनिर्देशों के माध्यम से पीएल/एसक्यूएल फ़ंक्शन में मैप करता है।

कुछ कॉलम जिनके साथ मैं काम कर रहा हूं CLOB एस हैं। (oracle.sql.CLOB के रूप में कॉल विनिर्देश में मैप) एक String में जावा में मैं इस CLOB का मूल्य उद्धृत करने का प्रयास:

private static String getStringFromCLOB(CLOB clob) throws SQLException { 
    long length = clob.length(); 
    return clob.getSubString(1, (int) length); 
} 

मुझे इस कोड मैं निम्नलिखित स्टैक ट्रेस * एसक्यूएल में प्रदर्शित करने के साथ ही चलाएँ:

java.lang.ArithmeticException:/by zero 
    at oracle.jdbc.driver.T2SConnection.<init>(T2SConnection.java:107) 
    at oracle.jdbc.driver.T2SDriverExtension.getConnection(T2SDriverExtension.java:31) 
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:481) 
    at oracle.jdbc.driver.OracleDriver.defaultConnection(OracleDriver.java:505) 
    at oracle.sql.DatumWithConnection.getPhysicalConnection(DatumWithConnection.java:53) 
    at oracle.sql.DatumWithConnection.getInternalConnection(DatumWithConnection.java:177) 
    at oracle.sql.CLOB.getDBAccess(CLOB.java:1383) 
    at oracle.sql.CLOB.length(CLOB.java:197) 

इससे पहले कि मैं सिर्फ Exception का संदेश दिखाई दे रहा था तो मैं एक try/catch साथ अपमानजनक विधि की सामग्री को लपेटा तो मैं System.out करने के लिए पूर्ण स्टैक ट्रेस डंप कर सकता है।

यह ध्यान देने योग्य है कि मैंने ओरेकल 11.2.0.1.0 (32 बिट) पर यह काम किया है लेकिन यह ओरेकल 11.2.0.2.0 (64 बिट) पर काम नहीं कर रहा है।

मेरे पास अन्य जावा समर्थित पीएल/एसक्यूएल function भी समस्या के बिना काम कर रहा है। यह केवल वे लोग हैं जो असफल कनेक्शन बनाने का प्रयास करते हैं।

मैंने <ORACLE_HOME>\jdbc\lib में एक नज़र डाली है और जार, हालांकि इसे नामित किया गया है, इन दो वितरणों में अलग दिखता है। निर्देशिका में जार कर रहे हैं (11.2.0.1.0 आकार और 11.2.0.2.0 आकार दिखाया गया है):

  • ojdbc5.jar (1,950KB | 1,983KB)
  • ojdbc5_g.jar (3,010KB | 3,271KB)
  • ojdbc5dms.jar (2,374KB | 2,489KB)
  • ojdbc5dms_g.jar (3,030KB | 3,291KB)
  • ojdbc6.jar (2,062KB | 2,102KB)
  • ojdbc6_g.jar (3,323KB | 3,782KB)
  • ojdbc6dms.jar (2,594 केबी | 2,698KB)
  • ojdbc6dms_g.jar (3,344KB | 3,805KB)
  • simplefan.jar (20KB | 20KB) < - शायद ही

इन जार के प्रकट फ़ाइलों की पुष्टि वे विशेष संस्करण के लिए निर्माण कर रहे हैं, यानी 11.2.0.1.0 या 11.2.0.2.0। क्या यह संभव है कि 11.2.0.2.0 में एक बग पेश किया गया हो? या यह उपयोगकर्ता होने की अधिक संभावना है, यानी मेरा, त्रुटि :-)

इसके अलावा, oracle.jdbc.driver.T2SConnection कक्षा कहां रहती है?

किसी भी मदद/मार्गदर्शन की बहुत सराहना की। यदि आपको अधिक जानकारी की जरूरत है तो कृपया मुझे बता है।

+0

ड्राइवर में बग की तरह दिखता है, ऑरैकल की रिपोर्ट करें या कोशिश करें/पकड़ें, अनदेखा करें ... (या दोनों) – bestsss

उत्तर

0

उन लोगों के लिए जो इस मुद्दे पर आ सकते हैं, हमने पाया कि यह ओरेकल के भीतर JVM इंस्टॉल के भ्रष्टाचार के कारण हुआ था। यह शायद खराब स्थापना के कारण हुआ था।

ओरेकल के जेवीएम पहलू को पुनर्स्थापित करने के लिए oracle.jdbc.driver.OracleConnection.defaultConnection() को बिना किसी समस्या के चलाने के लिए अनुमति दी गई है, चाहे किसी अन्य कॉल के ढेर के हिस्से के रूप में स्पष्ट रूप से बुलाया गया हो या कहा जाता है, उदा। oracle.sql.CLOB.length()

2

हाल ही के ओरेकल जेडीबीसी ड्राइवरों के साथ समान समस्या है। हमारा मामला 11.2.0.1 और 11.2.0.3 जैसे विभिन्न संस्करणों से जार मिश्रण करने में एक समस्या प्रतीत होता है, उदाहरण के लिए 11.2.0.1 और oi18n.jar से ojdbc6.jar 11.2.0.3 से। एक अच्छी तकनीक ओरेकल जेडीबीसी चालक के पूरे जारों को कम कर रही है और त्रुटि को उठा रहे स्रोत कोड में रेखा को देख रही है। त्रुटि/बग के बारे में एक टिप प्रदान कर सकता है।

क्लाइंट मशीनों में एक ही जेडीबीसी ड्राइवर संस्करण का उपयोग करने का प्रयास करें।

oracle.jdbc.driver.T2CConnection ड्राइवर के किसी भी मुख्य जार में रहता है, जैसे ojdbc5.jar।

+0

धन्यवाद डेविड। मुझे पूरा यकीन है कि सभी जार 11.2.0.2 के लिए हैं लेकिन दोबारा जांच करेंगे। डी 'आप जानते हैं कि 'oracle.jdbc.driver.T2SConnection' (** सी ** सी के बजाए) कक्षा रहता है? – jabclab

+0

आप सही हैं, यह एक गलती है। 'oracle.jdbc.driver.T2CConnection' किसी भी मुख्य जार में मौजूद है, जैसा कि आप नियमित रूप से ज़िप फ़ाइलों के रूप में जार की सामग्री को सूचीबद्ध करके देख सकते हैं। 'oracle.jdbc.driver.T2SConnection' ओरेकल जेडीबीसी ड्राइवर्स 11.2.0 के किसी भी जार में नहीं मिला है। *। अपने सर्वर में पाए गए किसी भी जार में क्लास लिस्टिंग जार सामग्री को खोजने का प्रयास करें, न केवल/lib में। –

+0

आपके उत्तर डेविड के लिए धन्यवाद। 'oracle.jdbc.driver.T2SConnection' '' के भीतर किसी भी जार में मौजूद नहीं दिखता है। क्या यह संभव है कि इसे गतिशील रूप से बनाया जा सके? – jabclab

4

मेरा पासवर्ड समाप्त होने पर मुझे यह समस्या थी। मैंने इसे सिर्फ पासवर्ड बदल दिया।

1

मेरा जावा/जेडीबीसी कोड अचानक एक दिन से दूसरे दिन काम करना बंद कर दिया।

वही समस्या यहां। कालबाह्य पासवर्ड मैंने ojdbc6 और ojdbc7 दोनों की कोशिश की। मेरे वीएम पर्यावरण को अपग्रेड किया गया। कोड एक अलग डेटाबेस के खिलाफ ठीक काम किया।

target_user="c##ora$rman_bkp" 
Placeholder START_DATE=20170422 
Placeholder START_DATE_TIME=2017Apr22-20h47m13s 
jdbcURL='jdbc:oracle:oci8:@twelve_static' 
Exception in thread "main" java.lang.ArithmeticException:/by zero 
     at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1387) 
     at oracle.jdbc.driver.T2CPreparedStatement.<init>(T2CPreparedStatement.java:109) 
     at oracle.jdbc.driver.T2CDriverExtension.allocatePreparedStatement(T2CDriverExtension.java:81) 
     at oracle.jdbc.driver.PhysicalConnection.prepareStatementInternal(PhysicalConnection.java:2013) 
     at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1960) 
     at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57) 
     at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1866) 
     at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57) 
     at LV.verifyLicensedDbId(LV.java:238) 
     at RmanJ.<init>(RmanJ.java:1891) 
     at RmanJ.main(RmanJ.java:1809) 

[email protected]:SQL> select account_status from dba_users where username='c##ora$rman_bkp'; 

ACCOUNT_STATUS 
-------------------------------- 
EXPIRED(GRACE) 

[email protected]:SQL> connect "c##ora$rman_bkp" 
Enter password: 
ERROR: 
ORA-28002: the password will expire within 5 days 


Connected. 
c##[email protected]:SQL> password 
Changing password for "c##ora$rman_bkp" 
Old password: 
New password: 
Retype new password: 
Password changed 

मेरे कोड का परीक्षण किया और यह ठीक काम किया। ओरेकल के सॉफ्टवेयर में अभी तक एक और अविश्वसनीय बग। उनकी गुणवत्ता आश्वासन कभी भी सही नहीं होता है। मुझे पूरी तरह से आश्वस्त है कि उनके पास उचित परीक्षण योजनाएं भी नहीं हैं, अन्यथा वे समाप्त होने वाली पासवर्ड के लिए शून्य द्वारा विभाजन के रूप में ऐसी गंभीर त्रुटियों को पकड़ लेंगे।