स्प्रिंगबैच के साथ मेरे पास निम्न त्रुटि है:

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.

यह देखते हुए कि मेरे पास लोड करने के लिए बहुत सी फाइलें हैं, मुझे लगता है कि त्रुटि मेरे कार्य निष्पादनकर्ता के कारण है:

@Bean
    public TaskExecutor MyTE() {
             ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
             executor.setCorePoolSize(64);
             executor.setMaxPoolSize(64);
             executor.setQueueCapacity(64);
             executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
             executor.setThreadNamePrefix("MyTE-");
             return executor;
        }

मैंने CorePoolSize, MaxPoolSize और QueueCapacity (64 के बजाय) के लिए "Integer.MAX_VALUE" का उपयोग किया, लेकिन त्रुटि सभी समान होती है।

संपादित करें: आखिरकार, मेरी समस्या का कारण पहले जॉब में संग्रहीत प्रक्रिया को कॉल करना प्रतीत होता है। दरअसल, जब मैं इस कोड को नीचे टिप्पणी करता हूं, तो यह काम करता है।

@Override
public void beforeJob(JobExecution jobExecution) {
        
CallableStatement cs=null; 

cs=MyDataSource.getConnection().prepareCall("CALL my_proc(?,?)");
cs.setString(1, "my_arg1");
cs.setString(2,"my_arg2"); 
cs.execute();
cs.close();

हालांकि, मैं यह कॉल करना चाहता हूं और मुझे समझ में नहीं आता कि यह समस्या क्यों उत्पन्न करता है। ऐसा लगता है कि cs.close(); के साथ कनेक्शन अच्छी तरह बंद हो गया है

समस्या क्या है ?

सादर।

समाधान :

Connection con = null;
CallableStatement cs = null; 

con=MyDataSource.getConnection();
                         
cs=con.prepareCall("CALL my_proc(?,?)");
cs.setString(1, "my_arg1");
cs.setString(2,"my_arg2"); 
cs.execute();

cs.close();
con.close();
1
Amasta 14 सितंबर 2021, 16:30

2 जवाब

सबसे बढ़िया उत्तर

आप अपने डेटाबेस कनेक्शन पूल को समाप्त कर रहे हैं क्योंकि आप कनेक्शन को वापस पूल में छोड़ने के लिए बंद नहीं कर रहे हैं। आप केवल close को CallableStatement पर कॉल कर रहे हैं। कुछ इस तरह की कोशिश करें...

try (Connection conn = MyDataSource.getConnection()) {
  CallableStatement cs= conn.prepareCall("CALL my_proc(?,?)");
  cs.setString(1, "my_arg1");
  cs.setString(2,"my_arg2"); 
  cs.execute();
  cs.close();
}

यह Connection ऑब्जेक्ट को स्वतः बंद कर देगा और इसे वापस DataSource कनेक्शन पूल में छोड़ देगा।

0
httPants 16 सितंबर 2021, 11:59

यहां दो प्रमुख पैरामीटर हैं: आपके वर्कर थ्रेड पूल का आकार और आपके डेटाबेस कनेक्शन पूल का आकार।

यदि प्रत्येक थ्रेड डेटाबेस कनेक्शन का अनुरोध करता है और आपके पास उपलब्ध कनेक्शन से अधिक श्रमिक हैं, तो किसी बिंदु पर कार्यकर्ता थ्रेड कनेक्शन उपलब्ध होने की प्रतीक्षा करेंगे। यदि कॉन्फ़िगर किए गए टाइमआउट मान से पहले कोई कनेक्शन जारी नहीं किया जाता है, तो यह प्रतीक्षा टाइमआउट हो सकती है।

तो आपको यह सुनिश्चित करने की ज़रूरत है कि आपके कार्यकर्ता धागे के लिए आपके पास पर्याप्त कनेक्शन हैं, या अपने कनेक्शन पूल में टाइमआउट बढ़ाएं।

0
Mahmoud Ben Hassine 16 सितंबर 2021, 11:48