จะสร้างพูลการเชื่อมต่อใน JDBC ได้อย่างไร?


111

ใครสามารถให้ตัวอย่างหรือลิงค์เกี่ยวกับวิธีการสร้างพูลการเชื่อมต่อ JDBC

จากการค้นหาใน google ฉันเห็นวิธีการต่างๆมากมายและค่อนข้างสับสน

ในที่สุดฉันต้องการรหัสเพื่อส่งคืนjava.sql.Connectionวัตถุ แต่ฉันมีปัญหาในการเริ่มต้น ... ยินดีรับข้อเสนอแนะใด ๆ

อัปเดต: ไม่มีjavax.sqlหรือjava.sqlมีการใช้งานการเชื่อมต่อร่วมกัน? เหตุใดจึงไม่ควรใช้สิ่งเหล่านี้ให้ดีที่สุด


8
ไม่หุ้น JDBC ไม่มีการรวมการเชื่อมต่อ คุณต้องมีห้องสมุดแยกต่างหากสำหรับสิ่งนั้น เซิร์ฟเวอร์แอปและคอนเทนเนอร์ servlet ส่วนใหญ่มีพูลการเชื่อมต่อรวมอยู่ด้วย นอกจากนี้การใช้งาน JPA มักจะให้การใช้งานด้วยเช่นกัน
Will Hartung

3
การอัปเดตสำหรับผู้ใช้ Java ในปัจจุบัน JDBC 3.0+ (ซึ่งฉันเชื่อว่าใช้ใน Java 6?) มีการใช้งานสำหรับการเชื่อมต่อ DB แบบรวม Java 7 ใช้ JDBC 4 และ Java 8 JDBC 4.1
BRasmussen

1
เกี่ยวกับ JDBC 3.0 API สำหรับการรวมการเชื่อมต่อ: progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling
Arto Bendiken

คำตอบ:


102

หากคุณต้องการพูลการเชื่อมต่อแบบสแตนด์อโลนค่ากำหนดของฉันจะไปที่C3P0บนDBCP (ที่ฉันได้กล่าวไว้ในคำตอบก่อนหน้านี้ ) ฉันมีปัญหามากเกินไปกับ DBCP ภายใต้ภาระงานหนัก การใช้ 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
Ditto นั่น ฉันสังเกตการหยุดชะงักของ DBCP ภายใต้ภาระงานมาหลายปีแล้ว เวอร์ชันหลังเวอร์ชัน
Vasiliy

ใช่ แต่ C3P0 ฉันมีประสบการณ์ที่ดีที่สุดกับ BoneCP
Nicolas Mommaerts

1
ดูเหมือน BoneCP ได้รับเลิกในความโปรดปรานของHikariCP HikariCP ยังกล่าวถึงในคำตอบด้านล่าง
kaartic

19

โดยปกติแล้วถ้าคุณต้องการพูลการเชื่อมต่อคุณกำลังเขียนแอปพลิเคชันที่ทำงานในสภาพแวดล้อมที่มีการจัดการบางอย่างนั่นคือคุณกำลังรันภายในแอ็พพลิเคชันเซิร์ฟเวอร์ หากเป็นกรณีนี้อย่าลืมตรวจสอบสิ่งอำนวยความสะดวกการรวมการเชื่อมต่อที่แอปพลิเคชันเซิร์ฟเวอร์ของคุณมีให้ก่อนลองใช้ตัวเลือกอื่น ๆ

โซลูชันแบบสำเร็จรูปจะรวมเข้ากับแอปพลิเคชันเซิร์ฟเวอร์ที่เหลือได้ดีที่สุด แต่ถ้าคุณไม่ได้ใช้ภายในแอพพลิเคชันเซิร์ฟเวอร์ฉันอยากจะแนะนำApache Commons DBCP ตัวแทน มีการใช้กันอย่างแพร่หลายและมีฟังก์ชันการรวมพื้นฐานทั้งหมดที่แอปพลิเคชันส่วนใหญ่ต้องการ


18

HikariCP

มันทันสมัยเร็วง่าย ฉันใช้สำหรับทุกโครงการใหม่ ฉันชอบมากกว่า C3P0 มากไม่รู้จักสระอื่น ๆ ดีเกินไป


18

อย่าสร้างล้อใหม่

ลองใช้ส่วนประกอบของบุคคลที่สามที่พร้อมใช้งาน:

  • Apache DBCP - อันนี้ใช้ภายในโดย Tomcat และของคุณอย่างแท้จริง
  • c3p0

Apache DBCP มาพร้อมกับตัวอย่างที่แตกต่างกันเกี่ยวกับวิธีการติดตั้งร่วมกันjavax.sql.DataSource นี่คือตัวอย่างหนึ่งที่สามารถช่วยคุณเริ่มต้นได้


1
เรียกว่า C3P0 เป็นวิธีที่มีประสิทธิภาพมากกว่า DBCP ในสภาพแวดล้อมแบบมัลติเธรดเนื่องจาก DBCP ล็อกการเข้าถึงเธรดเดียว
BalusC

@BalusC. ขอบคุณสำหรับการแก้ไขฉันdisclecsiaทำให้ฉันดีขึ้น คุณจะเห็นว่าลิงค์ถูกต้อง :)
Alexander Pogrebnyak

1
@ มูดาสซีร์. ฉันจะขอแนะนำให้มองหาที่ดรอปแทนสำหรับ DBCP ส่วนร่วมในการ Tomcat จากฤดูใบไม้ผลิ -> static.springsource.com/projects/tc-server/2.0/admin/htmlsingle/... คุณไม่จำเป็นต้องเซิร์ฟเวอร์ Tomcat tomcat-jdbcทั้งที่จะใช้เพียงขวดเดียว สามารถรับได้จาก Maven Central -> org.apache.tomcat:tomcat-jdbc:jar:7.0.22-> search.maven.org/…
Alexander Pogrebnyak

@AlexanderPogrebnyak: ขอบคุณอเล็กซานเดอร์ที่ดีของคุณ ฉันวางแผนที่จะใช้ CP ในบริการเว็บของ Axis จะคิดถึงข้อเสนอแนะของคุณ - Mudassir 7 นาทีที่แล้ว
Mudassir

17

ฉันอยากจะแนะนำให้ใช้ไลบรารีcommons-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 อย่างถูกต้องเพื่อไม่ให้ทรัพยากรรั่วไหลคุณอาจต้องการอ่านหน้าWikipediaนี้


8
สิ่งนี้สร้างพูลการเชื่อมต่อจริงหรือไม่
llm

@llm ชัวร์! javax.sql.DataSourceนิยามของอินเตอร์เฟซที่มีการดำเนินงานของ "การเชื่อมต่อร่วมกัน“(นอกจากนี้ฉันคิดว่าคุณรู้อยู่แล้วว่าสิ่งที่อินเตอร์เฟซที่เป็น JDBC).
วน

7

ในเซิร์ฟเวอร์แอปที่เราใช้ในที่ที่ฉันทำงาน (Oracle Application Server 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[โดยใช้วัตถุเดียวกันเพื่อดำเนินการใด ๆ กับ Object-Data] & memory[การจัดสรรและยกเลิกการจัดสรรวัตถุจำนวนมากจะทำให้เกิดค่าใช้จ่ายในการจัดการหน่วยความจำที่สำคัญ]
  • ไม่จำเป็นต้องล้างข้อมูลวัตถุเนื่องจากเราใช้ Object เดียวกันลดภาระการรวบรวมขยะ

« Objectพูล[ พูลStringคงพูลThreadพูลพูลเชื่อมต่อ]

สตริงคงพูล

  • สตริงลิเทอรัลพูลเก็บสำเนาของค่าสตริงที่แตกต่างกันเพียงหนึ่งชุด ซึ่งจะต้องไม่เปลี่ยนรูป
  • เมื่อเรียกใช้เมธอด intern จะตรวจสอบความพร้อมใช้งานของอ็อบเจ็กต์ที่มีเนื้อหาเดียวกันในพูลโดยใช้วิธีการเท่ากับ «ถ้า String-copy มีอยู่ใน Pool ให้ส่งกลับข้อมูลอ้างอิง «มิฉะนั้นอ็อบเจ็กต์ String จะถูกเพิ่มลงในพูลและส่งกลับการอ้างอิง

ตัวอย่าง: สตริงเพื่อตรวจสอบUnique Objectจากพูล

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));
    }
}

สระว่ายน้ำการเชื่อมต่อโดยใช้ Type-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() แทนที่จะปิดจะส่งกลับการเชื่อมต่อที่ห่อกลับไปที่พูล

ตัวอย่าง: การใช้ ~ DBCP2 Connection Pool กับ Java 7 [ 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 "wait_timeout" ค่าเริ่มต้น 8 ชั่วโมง] เพื่อเปิดการเชื่อมต่ออีกครั้งกับฐานข้อมูลพื้นฐาน

คุณสามารถทำได้เพื่อทดสอบการเชื่อมต่อทุกครั้งโดยตั้งค่า testOnBorrow = true และ validationQuery = "SELECT 1" และอย่าใช้ autoReconnect สำหรับเซิร์ฟเวอร์ 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();    }
}

ดูสิ่งเหล่านี้ด้วย:


ในตัวอย่าง String Constant pool ฉันเข้าใจว่าเมื่อคุณเขียนว่า "If String-copy is available [.equals ()] ใน Pool จะส่งกลับการอ้างอิง«มิฉะนั้นอ็อบเจ็กต์ String จะถูกเพิ่มลงในพูลและส่งกลับการอ้างอิง" แต่ในpublic class StringPoolTestโมฆะมี 2 วิธีดังนั้นพวกเขาจึงไม่ส่งคืนอะไรเลย รหัสนั้นผ่านขั้นตอนการจัดการสตริงพูลจริงหรือไม่ ดูเหมือนจะไม่ใช้ข้อโต้แย้งใด ๆ ด้วยซ้ำ
jeffery_the_wind

@jeffery_the_wind: - มันเป็นเพียงเพื่อทราบแนวคิดสระว่ายน้ำ, สระว่ายน้ำสำหรับสตริงตรวจสอบฉันเพียงแค่ใช้ hashCode, identityHashCode methodes แก้ไขรหัส ...
Yash

ขออภัยs1ไม่ได้กำหนดไว้?
jeffery_the_wind

โอเคแค่อยากให้แน่ใจว่าฉันเห็นมันทั้งหมด ฉันจะทำงานนั้น สิ่งที่ฉันต้องการเพื่อบางสิ่งบางอย่างที่ใกล้ชิดกับConnectionPoolชั้นเรียนของคุณ ขอบคุณมาก.
jeffery_the_wind

5

ในช่วงปลายปี 2017 Proxool, BoneCP, C3P0, DBCP ส่วนใหญ่จะหมดอายุในขณะนี้ HikariCP (สร้างขึ้นในปี 2012) ดูเหมือนจะมีแนวโน้มดีและทำให้ประตูปิดสิ่งอื่น ๆ ที่ฉันรู้จัก http://www.baeldung.com/hikaricp

Proxool มีปัญหาหลายประการ:
- ภายใต้ภาระงานหนักอาจเกินจำนวนการเชื่อมต่อสูงสุดและไม่กลับมาต่ำกว่าค่าสูงสุด
- สามารถจัดการไม่ให้กลับไปที่การเชื่อมต่อขั้นต่ำแม้ว่าการเชื่อมต่อจะหมดอายุ
- สามารถล็อกพูลทั้งหมด (และเธรดเซิร์ฟเวอร์ / ไคลเอนต์ทั้งหมด) หากมีปัญหาในการเชื่อมต่อกับฐานข้อมูลระหว่างเธรด HouseKeeper (ไม่ใช้. setQueryTimeout)
- เธรด HouseKeeper ในขณะที่มีการล็อกพูลการเชื่อมต่อสำหรับกระบวนการขอให้เธรด Prototyper สร้างการเชื่อมต่อใหม่ (กวาด) ซึ่งอาจส่งผลให้เกิดสภาวะการแข่งขัน / การล็อก ในวิธีการเหล่านี้ควรเรียกพารามิเตอร์สุดท้ายเสมอ: false ระหว่างลูปให้กวาดเท่านั้น: จริงด้านล่าง
- HouseKeeper ต้องการเพียงแค่การกวาด PrototypeController ตัวเดียวในตอนท้ายและมีมากกว่านั้น [ดังกล่าวข้างต้น]
- เธรด HouseKeeper ตรวจสอบการทดสอบการเชื่อมต่อก่อนที่จะดูว่าการเชื่อมต่อใดที่อาจหมดอายุ [ความเสี่ยงบางประการในการทดสอบการเชื่อมต่อที่หมดอายุซึ่งอาจขาด / ยุติผ่านการหมดเวลาอื่น ๆ ไปยัง DB ในไฟร์วอลล์ ฯลฯ ]
- โปรเจ็กต์มีโค้ดที่ยังไม่เสร็จ (คุณสมบัติที่กำหนด แต่ไม่ได้ดำเนินการ)
- อายุการเชื่อมต่อสูงสุดเริ่มต้นหากไม่ได้กำหนดไว้คือ 4 ชั่วโมง (มากเกินไป)
- เธรด HouseKeeper ทำงานทุกๆห้าวินาทีต่อพูล (มากเกินไป)

คุณสามารถแก้ไขโค้ดและทำการปรับปรุงเหล่านี้ได้ แต่มันถูกสร้างขึ้นในปี 2546 และได้รับการอัปเดตในปี 2551 จึงขาดการปรับปรุงจาวาเกือบ 10 ปีที่โซลูชันเช่น hikaricp ใช้


4

ตามที่คนอื่นตอบคุณอาจจะมีความสุขกับ Apache Dbcpหรือc3p0 c3p0ทั้งสองเป็นที่นิยมและทำงานได้ดี

เกี่ยวกับข้อสงสัยของคุณ

javax.sql หรือ java.sql ไม่มีการใช้งานการเชื่อมต่อร่วมกัน? เหตุใดจึงไม่ควรใช้สิ่งเหล่านี้ให้ดีที่สุด

พวกเขาไม่ได้จัดเตรียมการใช้งาน แต่เป็นอินเทอร์เฟซและคลาสการสนับสนุนบางอย่าง แต่จะเปิดเผยเฉพาะกับโปรแกรมเมอร์ที่ใช้ไลบรารีของบุคคลที่สาม (พูลหรือไดรเวอร์) ปกติคุณไม่ได้มองเรื่องนั้นด้วยซ้ำ โค้ดของคุณควรจัดการกับการเชื่อมต่อจากพูลของคุณเช่นเดียวกับการเชื่อมต่อแบบ "ธรรมดา" ด้วยวิธีที่โปร่งใส


4

Vibur DBCPเป็นไลบรารีอื่นสำหรับวัตถุประสงค์ดังกล่าว ตัวอย่างมากมายที่แสดงวิธีกำหนดค่าเพื่อใช้กับ Hibernate, Spring + Hibernate หรือแบบเป็นโปรแกรมสามารถพบได้ในเว็บไซต์: http://www.vibur.org/

ยังดูข้อจำกัดความรับผิดชอบที่นี่


3

Apache คอมมอนส์มีห้องสมุดเพื่อวัตถุประสงค์ที่: DBCP เว้นแต่คุณจะมีข้อกำหนดแปลก ๆ เกี่ยวกับสระว่ายน้ำของคุณฉันจะใช้ห้องสมุดเพราะมันต้องยุ่งยากและละเอียดอ่อนกว่าที่คุณคาดหวัง


1

คุณควรพิจารณาใช้ UCP Universal Connection Pool (UCP)คือพูลการเชื่อมต่อ Java เป็นพูลการเชื่อมต่อที่มีคุณสมบัติครบถ้วนและรวมเข้ากับฐานข้อมูล Real Application Clusters (RAC), ADG, DG ของ Oracle

ดูหน้านี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ UCP


0

MiniConnectionPoolManager เป็นการใช้งานไฟล์ java แบบไฟล์เดียวหากคุณกำลังมองหาโซลูชันที่ฝังได้และไม่กังวลเกี่ยวกับประสิทธิภาพมากเกินไป (แม้ว่าฉันจะไม่ได้ทดสอบในเรื่องนั้นก็ตาม)

มันเป็นเรื่องที่ได้รับใบอนุญาตหลายEPL , แอลจีและMPL

เอกสารประกอบยังให้ทางเลือกอื่นที่ควรตรวจสอบ (ด้านบนของ DBCP และ C3P0):

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.