中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java用連接池連接數據庫的方法

發布時間:2020-06-24 09:18:41 來源:億速云 閱讀:157 作者:Leah 欄目:編程語言

本篇文章展示了Java用連接池連接數據庫的方法具體操作,代碼簡明扼要容易理解,絕對能讓你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

傳統方式和連接池方式

傳統方式的步驟

使用傳統方式在Java中使用JDBC連接數據庫,完成一次數據庫的操作,一般有以下幾個步驟:

1. 加載驅動。

2. 建立連接。

3. 執行SQL語句。

4. 釋放連接。

5. 傳統方式的弊端

每一次對數據庫的操作都要建立一次連接,并且會將得到的Connection對象加載到內存中,導致消耗了大量的內存和時間。如果短時間有很多需要進行建立連接的操作,會導致占用很多系統資源,甚至會導致服務器崩潰。

同建立連接相對應,每次使用都需要手動釋放連接,如果忘記釋放連接或者程序出現異常未能成功釋放,會導致內存泄露。

此外,傳統方式并不能控制連接的數量,如果連接的人數過多,會導致無限制的創建連接對象,導致內存開銷過大,服務器崩潰。

連接池的步驟

1. 創建連接池并配置連接屬性。

2. 使用連接池獲取連接。

連接池的優勢

每次需要連接數據庫時,不需要建立連接,而是通過連接池獲取,由連接池提供連接。

在使用完連接后,不需要手動釋放連接,而是交由連接池釋放連接。

可以通過連接池控制連接的數量,在連接池里的連接可多次重復使用,避免了無限制創建連接的問題。

使用連接池

使用C3P0數據庫連接池

導入jar包:

c3p0-0.9.5.2.jar

在當前項目的代碼根目錄 src 下新建名為 c3p0-config.xml 的配置文件,注意文件名稱不可改變,內容如下:

<c3p0-config>
    <!-- 連接名稱 -->
    <named-config name="mysql">
        <!-- 接數據庫的驅動類名 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <!-- 連接屬性 -->
        <property name="jdbcUrl">jdbc:mysql://192.168.35.128:3306/demo</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!-- 當連接池用完時等待獲取新連接的時間,超時后將拋出SQLException,單位毫秒,如設為0則無限期等待。默認為0。 -->
        <property name="checkoutTimeout">5000</property>
        <!-- 當連接用盡后,一次獲取的連接個數 -->
        <property name="acquireIncrement">2</property>
        <!-- 初始連接數 -->
        <property name="initialPoolSize">1</property>
        <!-- 最小連接數 -->
        <property name="minPoolSize">3</property>
        <!-- 最大連接數 -->
        <property name="maxPoolSize">5</property>
    </named-config>
</c3p0-config>

程序代碼:

public class TestDataPool {
    // 根據配置文件里的名稱創建連接池
    public static ComboPooledDataSource cpds = new ComboPooledDataSource("mysql");
    
    /**
     * 主程序
     */
    public static void main(String[] args) {
        // 模擬多次對數據庫的查詢操作
        for (int i = 0; i < 6; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    select();
                }
            }, "線程" + i).start();
        }
    }
    
    /**
     * 查詢程序
     */
    public static void select() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        // 獲取連接并執行SQL
        try {
            conn = cpds.getConnection();
            pstmt = conn.prepareStatement("select * from student where id = 906");
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 釋放資源
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使用DBCP數據庫連接池

導入jar包:

 commons-dbcp-1.4.jar2 commons-pool-1.5.5.jar

在當前項目的代碼根目錄 src 下新建名為 dbcp.properties 的配置文件,文件名需要同代碼中引用的文件名一致,內容如下:

# 接數據庫的驅動類名
driverClassName=com.mysql.jdbc.Driver
# 連接屬性
url=jdbc:mysql://192.168.35.128:3306/demo
username=root
password=123456
# 初始化連接數
initialSize=10
# 最大連接數
maxActive=15

程序代碼:

public class TestDBCP {
    // 根據配置文件里的名稱創建連接池
    private static DataSource source = null;
    static {
        Properties pros = new Properties();
        InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");
        try {
            pros.load(is);
            source = BasicDataSourceFactory.createDataSource(pros);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 主程序
     */
    public static void main(String[] args) {
        // 模擬多次對數據庫的查詢操作
        for (int i = 0; i < 6; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    select();
                }
            }, "線程" + i).start();
        }
    }

    /**
     * 查詢程序
     */
    public static void select() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        // 獲取連接并執行SQL
        try {
            conn = source.getConnection();
            pstmt = conn.prepareStatement("select * from student where id = 906");
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 釋放資源
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

看完上述內容,你們掌握Java用連接池連接數據庫的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西藏| 大姚县| 温州市| 呼玛县| 乌拉特中旗| 红河县| 渑池县| 张北县| 旬阳县| 且末县| 台前县| 宁武县| 克山县| 拉萨市| 阳新县| 星子县| 莱阳市| 株洲市| 武义县| 东丰县| 梨树县| 胶南市| 雷山县| 邢台县| 琼中| 高淳县| 大关县| 宜城市| 望谟县| 安化县| 徐水县| 盘山县| 松潘县| 乐清市| 华亭县| 资阳市| 财经| 罗山县| 佛学| 上蔡县| 左云县|