Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

स्प्रिंग जेपीए हाइबरनेट:धीमी सेलेक्ट क्वेरी

मैंने विभिन्न प्रकार के डीएओ का परीक्षण किया है (मैं यहां कोड प्रकाशित नहीं करता क्योंकि यह बहुत गंदा है):

  • हाइबरनेट के साथ :~200ms
  • स्प्रिंग JDBCTemplate और RowMapper के साथ :~70 एमएस
  • जावा स्टेटमेंट के साथ :~2 एमएस
  • Java OracleStatement के साथ :~5 एमएस
  • जावा तैयार स्टेटमेंट के साथ :~100ms
  • जावा के साथ तैयार स्टेटमेंट को फ़ेच आकार =5000 के साथ समायोजित किया गया :~50ms
  • Java OraclePreparedStatement के साथ :~100ms
  • Java OraclePreparedStatement के साथ PreFetch आकार के साथ समायोजित =5000 :~170ms

नोट:

  • डीएओ को नए क्लाइंटडाओ () के बजाय स्प्रिंग द्वारा इंजेक्ट किया गया :+30ms खो गया (-बीमार-)
  • DB से कनेक्शन का समय:46ms

मैं उपयोग कर सकता था:

  • मैन्युअल सैनिटाइज्ड फ़ील्ड के साथ जावा स्टेटमेंट।
  • एप्लिकेशन लॉन्च पर प्री-कनेक्शन
  • स्प्रिंग इंजेक्शन का इस्तेमाल न करें

लेकिन :

  • वास्तव में सुरक्षित / सुरक्षित नहीं है
  • पंक्तियों की एक छोटी संख्या के लिए तेज़, बड़ी संख्या में पंक्तियों पर परिणामसेट को इकाई में मैप करने में धीमा (मेरे पास यह उपयोग मामला भी है)

तो :

वसंत JDBCTemplate रोमैपर . के साथ विशिष्ट मामले पर प्रदर्शन बढ़ाने के लिए सबसे अच्छा समाधान प्रतीत होता है। और हम SQL प्रश्नों पर सुरक्षा रख सकते हैं। लेकिन ResultSet को Entity में बदलने के लिए विशिष्ट RowMapper लिखने की आवश्यकता है।

स्प्रिंग JDBCTemplate का उदाहरण

@Repository
public class ClientJdbcTemplateDao {


    private final Logger logger = LoggerFactory.getLogger(ClientJdbcTemplateDao.class);

    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public List<Client> find() {
        List<Client> c = this.jdbcTemplate.query( "SELECT login FROM Client WHERE LOGIN='xxxx' AND PASSWORD='xxx'", new ClientRowMapper());
        return c;
    }
}

क्लाइंट रोमैपर का उदाहरण

public class ClientRowMapper implements RowMapper<Client> {

    @Override
    public Client mapRow(ResultSet arg0, int arg1) throws SQLException {
        // HERE IMPLEMENTS THE CONVERTER
        // Sample : 
        // String login = arg0.getString("LOGIN")
        // Client client = new Client(login);
        // return client;
    }
}

शायद बेहतर हो सकता है, किसी भी सुझाव का स्वागत है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. वैरिएबल कैसे घोषित करें और उसी Oracle SQL स्क्रिप्ट में इसका उपयोग कैसे करें?

  2. SQLBLANKLINES सेट करें:SQLcl और SQL* Plus में खाली लाइनों की अनुमति कैसे दें

  3. केवल Oracle में दिनांक भाग के आधार पर दो दिनांक मानों की तुलना कैसे करें?

  4. Oracle स्ट्रिंग से चर संख्या निकालें

  5. सिंक फ्रेमवर्क:Oracle/SQLServer