JDBC में कनेक्शन पूल कैसे स्थापित करें?


111

क्या कोई JDBC कनेक्शन पूल स्थापित करने के बारे में उदाहरण या लिंक प्रदान कर सकता है?

Google को खोजने से मुझे ऐसा करने के कई अलग-अलग तरीके दिखाई देते हैं और यह भ्रामक है।

अंततः मुझे एक java.sql.Connectionवस्तु वापस करने के लिए कोड की आवश्यकता है , लेकिन मुझे शुरू करने में परेशानी हो रही है..जिसके सुझावों का स्वागत है।

अद्यतन: कनेक्शन कार्यान्वयन को पूल किया javax.sqlया नहीं java.sqlकिया है? इनका उपयोग करना सबसे अच्छा क्यों नहीं होगा?


8
नहीं, स्टॉक JDBC कनेक्शन पूलिंग प्रदान नहीं करता है। उसके लिए आपको एक अलग से लाइब्रेरी चाहिए। अधिकांश ऐप सर्वर और सर्वलेट कंटेनरों में उनके साथ शामिल कनेक्शन पूल हैं। इसके अलावा, जेपीए कार्यान्वयन आमतौर पर कार्यान्वयन भी प्रदान करते हैं।
विल हार्टुंग

3
आधुनिक दिन जावा उपयोगकर्ताओं के लिए एक अद्यतन। JDBC 3.0+ (जो मेरा मानना ​​है कि जावा 6 में उपयोग किया जाता है?) में पूल डीबी कनेक्शन के लिए कार्यान्वयन है। Java 7 में JDBC 4, और Java 8 JDBC 4.1 का उपयोग किया जाता है।
19

1
कनेक्शन पूलिंग के लिए JDBC 3.0 API के बारे में: progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling
Arto Bendiken

जवाबों:


102

यदि आपको एक स्टैंडअलोन कनेक्शन पूल की आवश्यकता होती है, तो मेरी प्राथमिकता सीबीसीपी पर सी 3 पी 0 एल पर जाती है (जो मैंने इस पिछले उत्तर में उल्लेख किया है ), मुझे भारी लोड के तहत डीबीसीपी के साथ बहुत अधिक समस्याएं थीं। C3P0 का उपयोग करना सरल है। से प्रलेखन :

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver
cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
cpds.setUser("swaldman");
cpds.setPassword("test-password");

// the settings below are optional -- c3p0 can work with defaults
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);

// The DataSource cpds is now a fully configured and usable pooled DataSource 

लेकिन अगर आप एक एप्लिकेशन सर्वर के अंदर चल रहे हैं, तो मैं इसे प्रदान करने वाले अंतर्निहित कनेक्शन पूल का उपयोग करने की सिफारिश करूंगा। उस स्थिति में, आपको इसे कॉन्फ़िगर करना होगा (अपने एप्लिकेशन सर्वर के दस्तावेज़ देखें) और JNDI के माध्यम से डेटा स्रोत पुनर्प्राप्त करने के लिए:

DataSource ds = (DataSource) new InitialContext().lookup("jdbc/myDS");

1
डिट्टो, वह। मैं अब वर्षों से लोड के तहत DBCP गतिरोध का अवलोकन कर रहा हूं। संस्करण के बाद संस्करण।
वासिली

हाँ, लेकिन C3P0 भी, मुझे BoneCP के साथ सबसे अच्छा अनुभव हुआ है
निकोलस मम्मैर्ट्स

1
लगता है कि HoneariCP के पक्ष में BoneCP को हटा दिया गया है । नीचे दिए गए जवाब में HikariCP का भी उल्लेख किया गया है ।
kaartic

19

आमतौर पर अगर आपको कनेक्शन पूल की आवश्यकता होती है तो आप एक एप्लिकेशन लिख रहे हैं जो कुछ प्रबंधित वातावरण में चलता है, यानी आप एक एप्लिकेशन सर्वर के अंदर चल रहे हैं। यदि यह मामला है, तो जाँच लें कि आपके एप्लिकेशन सर्वर द्वारा क्या कनेक्शन पूलिंग सुविधाएं प्रदान की जाती हैं कोई अन्य विकल्प आज़माने से पहले हैं।

आउट-ऑफ-द-बॉक्स समाधान बाकी एप्लिकेशन सर्वर सुविधाओं के साथ सबसे अच्छा एकीकृत होगा। यदि आप एक एप्लिकेशन सर्वर के अंदर नहीं चल रहे हैं, तो मैं अपाचे कॉमन्स DBCP घटक की सिफारिश करूंगा । यह व्यापक रूप से उपयोग किया जाता है और सभी अनुप्रयोगों की आवश्यकता होती है सभी बुनियादी पूलिंग कार्यक्षमता प्रदान करता है।


18

HikariCP

यह आधुनिक है, यह तेज है, यह सरल है। मैं हर नए प्रोजेक्ट के लिए इसका इस्तेमाल करता हूं। मैं इसे C3P0 से अधिक पसंद करता हूं, अन्य पूलों को भी अच्छी तरह से नहीं जानता।


18

पहिया को सुदृढ़ मत करो।

आसानी से उपलब्ध 3 पार्टी घटकों में से एक का प्रयास करें:

  • अपाचे DBCP - यह एक Tomcat द्वारा आंतरिक रूप से प्रयोग किया जाता है, और तुम्हारा सही मायने में।
  • c3p0

Apache DBCP पूलिंग javax.sql.DataSource को सेटअप करने के तरीके पर अलग-अलग उदाहरण के साथ आता है । यहां एक नमूना है जो आपको आरंभ करने में मदद कर सकता है।


1
इसे C3P0 कहा जाता है। यह एक तरह से DBCP लॉक होने के बाद से मल्टीथ्रेडेड वातावरण में DBCP की तुलना में अधिक प्रदर्शन करने वाला तरीका है।
बालुस 1

@BalusC। सुधार के लिए धन्यवाद, मेरे disclecsiaपास मुझे बेहतर मिला। आप देख सकते हैं कि लिंक सही है। :)
अलेक्जेंडर पोगरेबनीक

1
@Mudassir। मैं अनुशंसा करूंगा कि स्प्रिंग से टॉमकैट में योगदान करने वाले DBCP के लिए ड्रॉप-इन रिप्लेसमेंट को देखा जाए -> static.springsource.com/projects/tc-server/2.0/admin/htmlsingle/… । आपको इसे उपयोग करने के लिए पूरे टॉमकैट सर्वर की आवश्यकता नहीं है, बस एक जार tomcat-jdbc। आप इसे Maven Central -> org.apache.tomcat:tomcat-jdbc:jar:7.0.22-> search.maven.org/…
Alexander Pogrebnyak

@AlexanderPogrebnyak: धन्यवाद अलेक्जेंडर, आप के लिए अच्छा है। मैं एक एक्सिस वेब सेवा में सीपी का उपयोग करने की योजना बना रहा हूं। आपके सुझाव के बारे में सोचेंगे। - मुदस्सिर 7 मिनट पहले
मुदस्सिर

17

मैं कॉमन्स-dbcp लाइब्रेरी का उपयोग करने की सलाह दूंगा । इसका उपयोग करने के तरीके के बारे में कई उदाहरण सूचीबद्ध हैं, यहाँ एक सरल कदम है । उपयोग बहुत सरल है:

 BasicDataSource ds = new BasicDataSource();
 ds.setDriverClassName("oracle.jdbc.driver.OracleDriver")
 ds.setUsername("scott");
 ds.setPassword("tiger");
 ds.setUrl(connectURI);
 ...
 Connection conn = ds.getConnection();

आपको केवल एक बार डेटा स्रोत बनाने की आवश्यकता है, इसलिए सुनिश्चित करें कि आपने प्रलेखन पढ़ा है यदि आपको नहीं पता कि यह कैसे करना है। अगर आपको इस बारे में जानकारी नहीं है कि आप JDBC स्टेटमेंट को कैसे ठीक से लिख सकते हैं ताकि आप रिसोर्सेज लीक न करें, तो आप इस विकिपीडिया पेज को भी पढ़ना चाहेंगे ।


8
क्या यह वास्तव में एक कनेक्शन पूल बनाता है?
14:05

@llm ज़रूर! javax.sql.DataSourceइंटरफेस की परिभाषा "कनेक्शन पूलिंग" के एक कार्यान्वयन शामिल है (इसके अलावा, मुझे लगता है कि आप पहले से ही पता है कि एक JDBC इंटरफेस है)।
एड़ी

7

एप्लिकेशन सर्वर में हम जहां मैं काम करते हैं (Oracle एप्लिकेशन सर्वर 10g, जैसा कि मुझे याद है), पूलिंग को ऐप सर्वर द्वारा नियंत्रित किया जाता है। हम एक के javax.sql.DataSourceसाथ JNDI लुकअप का उपयोग करके पुनः प्राप्त करते हैं javax.sql.InitialContext

यह कुछ ऐसा है

try {     
   context = new InitialContext();
   jdbcURL = (DataSource) context.lookup("jdbc/CachedDS");
   System.out.println("Obtained Cached Data Source ");
}
catch(NamingException e)   
{  
    System.err.println("Error looking up Data Source from Factory: "+e.getMessage());
}

(हमने यह कोड नहीं लिखा है, यह इस दस्तावेज़ से कॉपी किया गया है ।)


5

पूल

  • पूलिंग मैकेनिज्म ऑब्जेक्ट्स को पहले से बनाने का तरीका है। जब एक कक्षा भरी हुई है।
  • यह एप्लिकेशन को बेहतर बनाता है performance[ऑब्जेक्ट-डेटा पर किसी भी क्रिया को करने के लिए एक ही ऑब्जेक्ट का उपयोग करके] और memory[कई ऑब्जेक्ट्स को आवंटित करना और डी-आवंटित करना एक महत्वपूर्ण मेमोरी मैनेजमेंट ओवरहेड बनाता है]।
  • ऑब्जेक्ट क्लीन-अप की आवश्यकता नहीं है क्योंकि हम एक ही ऑब्जेक्ट का उपयोग कर रहे हैं, कचरा संग्रह लोड को कम कर रहे हैं।

«पूलिंग [ Objectपूल, Stringलगातार पूल, Threadपूल, कनेक्शन पूल]

स्ट्रिंग कॉन्सटेंट पूल

  • स्ट्रिंग शाब्दिक पूल प्रत्येक विशिष्ट स्ट्रिंग मान की केवल एक प्रति रखता है। जो अपरिवर्तनीय होना चाहिए।
  • जब इंटर्न विधि को लागू किया जाता है, तो यह बराबर पद्धति का उपयोग करके पूल में समान सामग्री के साथ ऑब्जेक्ट उपलब्धता की जांच करता है। «अगर स्ट्रिंग-कॉपी पूल में उपलब्ध है तो संदर्भ लौटाता है। «अन्यथा, स्ट्रिंग ऑब्जेक्ट को पूल में जोड़ा जाता है और संदर्भ देता है।

उदाहरण: पूल से अनन्य ऑब्जेक्ट को सत्यापित करने के लिए स्ट्रिंग ।

public class StringPoolTest {
    public static void main(String[] args) { // Integer.valueOf(), String.equals()
        String eol = System.getProperty("line.separator"); //java7 System.lineSeparator();

        String s1 = "Yash".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s1, s1.hashCode(), System.identityHashCode(s1));
        String s2 = "Yas"+"h".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s2, s2.hashCode(), System.identityHashCode(s2));
        String s3 = "Yas".intern()+"h".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s3, s3.hashCode(), System.identityHashCode(s3));
        String s4 = "Yas"+"h";
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s4, s4.hashCode(), System.identityHashCode(s4));
    }
}

कनेक्शन पूल प्रकार -4 का उपयोग कर चालक 3 पार्टी पुस्तकालयों का उपयोग कर [ DBCP2, c3p0, Tomcat JDBC]

Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora]. विकि

कनेक्शन पूल तंत्र में, जब कक्षा को लोड किया जाता है तो यह physical JDBC connectionऑब्जेक्ट्स प्राप्त करता है और उपयोगकर्ता को एक लिपटे हुए भौतिक कनेक्शन ऑब्जेक्ट प्रदान करता है। PoolableConnectionवास्तविक कनेक्शन के आसपास एक आवरण है।

  • getConnection()मुफ्त लिपटे-कनेक्शन में से किसी एक को चुनें, कनेक्शन ऑब्जेक्टपुल बनाता है और इसे वापस करता है।
  • close() बंद करने के बजाय यह लिपटे-कनेक्शन को वापस पूल में लौटाता है।

उदाहरण: जावा 7 के साथ ~ DBCP2 कनेक्शन पूल का उपयोग करना [ try-with-resources]

public class ConnectionPool {
    static final BasicDataSource ds_dbcp2 = new BasicDataSource();
    static final ComboPooledDataSource ds_c3p0 = new ComboPooledDataSource();
    static final DataSource ds_JDBC = new DataSource();

    static Properties prop = new Properties();
    static {
        try {
            prop.load(ConnectionPool.class.getClassLoader().getResourceAsStream("connectionpool.properties"));

            ds_dbcp2.setDriverClassName( prop.getProperty("DriverClass") );
            ds_dbcp2.setUrl( prop.getProperty("URL") );
            ds_dbcp2.setUsername( prop.getProperty("UserName") );
            ds_dbcp2.setPassword( prop.getProperty("Password") );
            ds_dbcp2.setInitialSize( 5 );

            ds_c3p0.setDriverClass( prop.getProperty("DriverClass") );
            ds_c3p0.setJdbcUrl( prop.getProperty("URL") );
            ds_c3p0.setUser( prop.getProperty("UserName") );
            ds_c3p0.setPassword( prop.getProperty("Password") );
            ds_c3p0.setMinPoolSize(5);
            ds_c3p0.setAcquireIncrement(5);
            ds_c3p0.setMaxPoolSize(20);

            PoolProperties pool = new PoolProperties();
            pool.setUrl( prop.getProperty("URL") );
            pool.setDriverClassName( prop.getProperty("DriverClass") );
            pool.setUsername( prop.getProperty("UserName") );
            pool.setPassword( prop.getProperty("Password") );
            pool.setValidationQuery("SELECT 1");// SELECT 1(mysql) select 1 from dual(oracle)

            pool.setInitialSize(5);
            pool.setMaxActive(3);
            ds_JDBC.setPoolProperties( pool );
        } catch (IOException e) {   e.printStackTrace();
        } catch (PropertyVetoException e) { e.printStackTrace(); }
    }

    public static Connection getDBCP2Connection() throws SQLException {
        return ds_dbcp2.getConnection();
    }

    public static Connection getc3p0Connection() throws SQLException {
        return ds_c3p0.getConnection();
    }

    public static Connection getJDBCConnection() throws SQLException {
        return ds_JDBC.getConnection();
    }
}
public static boolean exists(String UserName, String Password ) throws SQLException {
    boolean exist = false;
    String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?";
    try ( Connection connection = ConnectionPool.getDBCP2Connection();
          PreparedStatement pstmt = connection.prepareStatement(SQL_EXIST); ) {
        pstmt.setString(1, UserName );
        pstmt.setString(2, Password );

        try (ResultSet resultSet = pstmt.executeQuery()) {
            exist = resultSet.next(); // Note that you should not return a ResultSet here.
        }
    }
    System.out.println("User : "+exist);
    return exist;
}

jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName> jdbc:oracle:thin:@localhost:1521:myDBName jdbc:mysql://localhost:3306/myDBName

connectionpool.properties

URL         : jdbc:mysql://localhost:3306/myDBName
DriverClass : com.mysql.jdbc.Driver
UserName    : root
Password    :

वेब अनुप्रयोग: कनेक्शन समस्या से बचने के लिए जब सभी कनेक्शन बंद हो गए हैं [MySQL "wa_timeout" डिफ़ॉल्ट 8 घंटे] अंतर्निहित DB के साथ कनेक्शन को फिर से खोलने के लिए।

आप यह कर सकते हैं कि प्रत्येक कनेक्शन को TestOnBreat = true और validationQuery = "Select 1" सेट करके टेस्ट करें और MySQL सर्वर के लिए ऑटो-कनेक्ट का उपयोग न करें क्योंकि यह पदावनत है। मुद्दा

===== ===== context.xml ===== =====
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for a web application -->
<Context>
    <Resource name="jdbc/MyAppDB" auth="Container" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
        type="javax.sql.DataSource" 

        initialSize="5" minIdle="5" maxActive="15" maxIdle="10"

        testWhileIdle="true"
            timeBetweenEvictionRunsMillis="30000"

        testOnBorrow="true"
            validationQuery="SELECT 1"
            validationInterval="30000"


        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://localhost:3306/myDBName" 
        username="yash" password="777"
    />
</Context>

===== ===== web.xml ===== =====
<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/MyAppDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
===== ===== DBOperations ===== =====
servlet «   init() {}
Normal call used by sevlet  « static {}

static DataSource ds;
static {
    try {
        Context ctx=new InitialContext();
        Context envContext = (Context)ctx.lookup("java:comp/env");
        ds  =   (DataSource) envContext.lookup("jdbc/MyAppDB");
    } catch (NamingException e) {   e.printStackTrace();    }
}

इन्हें भी देखें:


स्ट्रिंग कॉन्सटेंट पूल उदाहरण में, मैं समझता हूं कि जब आपने लिखा था "यदि स्ट्रिंग में कॉपी [। है।] () उपलब्ध है, तो संदर्भ देता है।« अन्यथा, स्ट्रिंग ऑब्जेक्ट को पूल में जोड़ा जाता है और संदर्भ देता है। " लेकिन public class StringPoolTestसिर्फ 2 शून्य तरीकों में वे कुछ भी वापस नहीं करते हैं। क्या वह कोड वास्तव में स्ट्रिंग पूल के प्रबंधन की प्रक्रिया से गुजरता है? यह किसी भी तर्क का उपयोग करने के लिए भी प्रतीत नहीं होता है।
jeffery_the_wind

@jeffery_the_wind: - यह सिर्फ पूल अवधारणा, स्ट्रिंग पूल के लिए पता करने के लिए सत्यापन मैं सिर्फ, hashCode इस्तेमाल किया identityHashCode है methodes । कोड को संशोधित किया ...
यश

क्षमा करें, s1परिभाषित नहीं है?
jeffery_the_wind

ठीक है, बस यह सुनिश्चित करना चाहता था कि मैं यह सब देख रहा हूं। मैं उस पर काम करूंगा। मुझे आपकी ConnectionPoolकक्षा के लिए कुछ और करने की आवश्यकता होगी । बहुत बहुत धन्यवाद।
jeffery_the_wind

5

2017 के अंत में प्रोक्सूल, बीओएनसीपी, सी 3 पी 0, डीबीसीपी इस समय ज्यादातर दोषपूर्ण हैं। HikariCP (2012 में बनाई गई) होनहार लगती है, मुझे जो कुछ भी पता है उससे कुछ दूर दरवाजे को उड़ा देती है। http://www.baeldung.com/hikaricp

Proxool में कई समस्याएँ हैं:
- भारी लोड के तहत कनेक्शन की अधिकतम संख्या से अधिक हो सकता है और अधिकतम से नीचे नहीं लौटा
सकता है - कनेक्शन समाप्त होने के बाद भी न्यूनतम कनेक्शन पर वापस नहीं आने का प्रबंधन
कर सकता है - पूरे पूल (और सभी सर्वर / क्लाइंट थ्रेड्स) को लॉक कर सकता है अगर यह हाउसकीपर थ्रेड के दौरान डेटाबेस से कनेक्ट करने में परेशानी करता है (.setQueryTimeout का उपयोग नहीं करता है)
- हाउसकीपर थ्रेड, इसकी प्रक्रिया के लिए कनेक्शन पूल लॉक होने के दौरान, प्रोटोटाइपर थ्रेड को कनेक्शन (स्वीप) को फिर से बनाने के लिए अनुरोध करता है, जिसके परिणामस्वरूप रेस की स्थिति / लॉकअप हो सकती है। इन विधि में कहा जाता है कि अंतिम पैरामीटर हमेशा स्वीप होना चाहिए: लूप के दौरान गलत, केवल स्वीप: इसके नीचे सच।
- हाउसकीपर को अंत में केवल एक ही प्रोटोटाइपकंट्रोलर स्वीप की आवश्यकता होती है और इसमें अधिक [ऊपर उल्लेखित है]
- हाउसकीपर थ्रेड कनेक्शन की जांच के लिए जाँच करता है कि क्या कनेक्शन समाप्त हो सकते हैं [एक्सपायर कनेक्शन के परीक्षण के कुछ जोखिम जो टूटे / समाप्त हो सकते हैं, अन्य टाइमआउट के माध्यम से डीबी को फ़ायरवॉल में डाल सकते हैं, आदि]
- प्रोजेक्ट में अधूरा कोड (गुण जो परिभाषित किए गए हैं) लेकिन इस पर कार्रवाई नहीं की गई है
- यदि परिभाषित अधिकतम कनेक्शन जीवन 4 घंटे (अत्यधिक) से परिभाषित नहीं है
- हाउसकीपर धागा प्रति पांच सेकंड प्रति पूल (अत्यधिक) चलाता है

आप कोड को संशोधित कर सकते हैं और इन सुधार कर सकते हैं। लेकिन जैसा कि इसे 2003 में बनाया गया था, और 2008 में अपडेट किया गया था, इसके लगभग 10 वर्षों के जावा में सुधार था जो कि hikaricp जैसे समाधानों का उपयोग करता है।


4

जैसा कि दूसरों द्वारा उत्तर दिया गया है, आप शायद Apache Dbcp या c3p0 से खुश होंगे । दोनों लोकप्रिय हैं, और ठीक काम करते हैं।

अपने शक के बारे में

क्या javax.sql या java.sql का कनेक्शन कार्यान्वयन नहीं है? इनका उपयोग करना सबसे अच्छा क्यों नहीं होगा?

वे कार्यान्वयन प्रदान नहीं करते हैं, बल्कि इंटरफेस और कुछ सहायता वर्ग, केवल प्रोग्रामर जो कि तीसरे पक्ष के पुस्तकालयों (पूल या ड्राइवर) को लागू करते हैं, के लिए रहस्योद्घाटन करते हैं। आम तौर पर आप उस पर भी गौर नहीं करते हैं। आपके कोड को आपके पूल से उन कनेक्शनों से निपटना चाहिए, जैसे वे "सादे" कनेक्शन थे, पारदर्शी तरीके से।


4

Vibur DBCP उस उद्देश्य के लिए एक और पुस्तकालय है। हाइबरनेट, स्प्रिंग + हाइबरनेट या प्रोग्राम के साथ उपयोग के लिए इसे कॉन्फ़िगर करने के तरीके दिखाने वाले कई उदाहरण, इसकी वेबसाइट पर पाए जा सकते हैं: http://www.vibur.org/

इसके अलावा, यहां अस्वीकरण देखें ।


3

Apache Commons के पास उस उद्देश्य के लिए एक पुस्तकालय है: DBCP । जब तक आपके पास अपने पूल के आसपास अजीब आवश्यकताएं नहीं हैं, मैं एक पुस्तकालय का उपयोग करूंगा क्योंकि यह मुश्किल है और जितना आप उम्मीद करेंगे उससे अधिक सूक्ष्म होगा।


1

आपको यूसीपी का उपयोग करने पर विचार करना चाहिए। यूनिवर्सल कनेक्शन पूल (UCP) एक जावा कनेक्शन पूल है। यह एक समृद्ध रिचर्स पूल है और यह Oracle के रियल एप्लीकेशन क्लस्टर (RAC), ADG, DG डेटाबेस के साथ मजबूती से एकीकृत है।

UCP के बारे में अधिक जानकारी के लिए इस पृष्ठ का संदर्भ लें ।


0

MiniConnectionPoolManager यदि आप एक एम्बेड करने योग्य समाधान की तलाश कर रहे हैं और प्रदर्शन के बारे में बहुत चिंतित नहीं हैं (हालांकि मैंने उस संबंध में इसका परीक्षण नहीं किया है)

यह बहु-लाइसेंसित ईपीएल , एलजीपीएल और एमपीएल है

इसका प्रलेखन भी जाँच के लायक विकल्प देता है (DBCP और C3P0 के शीर्ष पर):

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.