1. 程式人生 > >Java資料庫連線池的實現(不用框架)

Java資料庫連線池的實現(不用框架)

前言:因為需要正式做專案,瞭解到了連線池這個東西。在網上找了很多資料,發現都是大同小異,各種轉載,看上去搜出來了幾十個答案,結果很可能是同一個。並且大多都是基於框架的資料庫連線池。可是我只是想採用MVC做一個不是很大的專案,不需要使用到框架啊。這可怎麼辦,最後沒辦法,弄清楚連線池的原理,配合網上的資料,自己寫一個簡單的吧(這裡暫時不考慮多執行緒操作,後面會繼續完善這個連線池,自己挖坑,後面慢慢補)

1、連線池是什麼以及連線池的好處

這裡想借用老師的例子,覺得非常的貼切。我是一個圖書管理員(CPU),當需要有人來借書的時候(進行資料庫操作),我首先需要去圖書館找到這本書(連線資料庫),然後登記把書給借書的人(執行並返回執行結果),人們來還書的時候,我們再把書放回圖書館(關閉資料庫)。這是我們普通的做法,這樣的做法有一個問題是這樣的,圖書管理員在找書的時候需要花費10分鐘(連線資料庫),登記把書給借書的人(執行SQL語句)只需要1分鐘。這就極大的降低了效能,因此就圖書管理員就想了一個辦法,我首先放一些書放在前臺書桌上(連線池),然後別人來借書的時候(進行資料庫操作的時候),我直接看書桌上還有沒有書,如果有的話,直接登記就可以了,花費的時間約為1分鐘,相對之前的借書流程提高了11倍。如果沒有的話,我們再去圖書館找這本書(連線資料庫)。在別人還書的時候,我們也不直接把書放回圖書館,而是放在書桌上(不關閉連線,放入連線池)。

2、簡單連線池的具體實現

建立一個連線池,基本原理就是,我們先建立一堆資料庫連線放在List中(初始化),在要進行連線的時候,我們判斷是否連線池中還有連線,如果有就直接從連線池中獲取,如果沒有,我們再重新建立連線。並且我們使用完成以後也不要關閉,而是重新放回List中。
IDatabaseConnection介面檔案

package DBPool;

import java.sql.Connection;
/**
 * @author xiaoD
 * @date 2017年11月22日 上午9:00:05
 * Description: 定義一個介面,更換資料庫的時候方便
 */
public
interface IDatabaseConnection { //初始化 public void init(); //取得連線 public Connection getConnection(); //關閉 public void close(Connection conn); }

SQLServerHandler處理器

package DBPool;

import java.sql.Connection;
import java.sql.DriverManager;


/**
 * @author xiaoD
 * @date 2017年11月22日 上午9:02:19
 * Description: 
 */
public class SQLServerHandler { private static final String DBDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private static final String DBURL = "jdbc:sqlserver://localhost:1433;DatabaseName=xiaoD"; private static final String USERNAME = "sa"; private static final String PASSWORD = "sql2008"; private Connection conn = null; public Connection buildConnection() { try { Class.forName(DBDRIVER); this.conn = DriverManager.getConnection(DBURL, USERNAME, PASSWORD); }catch(Exception e) { e.printStackTrace(); } return conn; } }

SQLServerPool

package DB;

import java.sql.Connection;
import java.util.LinkedList;


/**
 * @author xiaoD
 * @date 2017年11月22日 下午2:49:38
 * Description: 構建一個連線池
 */
public class SQLServerPool implements IDatabaseConnection{
    //最小連線數
        private static final int minCount = 1;
        //最大連線數
        private static final int maxCount = 10;
        //連線池
        private static final LinkedList<Connection> pools = new LinkedList<Connection>();
        SQLServerHandler handler = new SQLServerHandler();
        /**
         * @author xiaoD
         * @date 2017年11月22日 下午2:49:38
         * Description: 重寫init
         */
        public void init() {
            Connection conn = null;
            try{
                for(int i=0; i<minCount; i++) {
                    conn = handler.buildConnection();
                    pools.add(conn);
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * @author xiaoD
         * @date 2017年11月22日 下午2:49:38
         * Description: 重寫getConnection
         */
        public synchronized Connection getConnection() {
            Connection conn = null;
            if(pools.size() == 0) {
                conn = handler.buildConnection();
            } else {
                conn = pools.remove(0);
            }
            return conn;
        }

        /**
         * @author xiaoD
         * @date 2017年11月22日 下午2:49:38
         * Description: 重寫close
         */
        public synchronized void close(Connection conn) {
            if(pools.size() < maxCount) {
                pools.add(conn);
            }
            System.out.println(pools);
        }
}

測試類

package DB;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @author xiaoD
 * @date 2017年11月22日 下午2:52:00
 * Description: 
 */
public class DatabseTest {
    static IDatabaseConnection SQLServer = new SQLServerPool();
    public static void main(String args[]) {
        SQLServer.init();
        long start = System.currentTimeMillis();
        for(int i=0; i<300; i++) {
            test();
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
    private static void test() {
        try{
            Connection conn = SQLServer.getConnection();
            String sql = "select * from users";
            PreparedStatement pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();
            System.out.println(rs);
            pst.close();
            SQLServer.close(conn);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

(完) 2017/11/222 20:30

相關推薦

Java資料庫連線實現不用框架

前言:因為需要正式做專案,瞭解到了連線池這個東西。在網上找了很多資料,發現都是大同小異,各種轉載,看上去搜出來了幾十個答案,結果很可能是同一個。並且大多都是基於框架的資料庫連線池。可是我只是想採用MVC做一個不是很大的專案,不需要使用到框架啊。這可怎麼辦,最後沒

Java資料庫連線比較c3p0,dbcp,proxool和BoneCP

詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp21 Java框架資料庫連線池比較(c3p0,dbcp和proxool,BoneC) 現在常用的開源資料連線池主要有c3p0,dbcp,proxool

java資料庫連線實現原理

原文:http://blog.csdn.net/frightingforambition/article/details/25464129  一、為什麼在連線資料庫時要使用連線池  資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得

Java框架資料庫連線比較c3p0,dbcp和proxool

現在常用的開源資料連線池主要有c3p0,dbcp和proxool三種,其中:  ¨         hibernate開發組推薦使用c3p0;  ¨         spring開發組推薦使用dbcp (dbcp連線池有weblogic連線池同樣的問題,就是強行關閉連

Java資料庫連線原理與簡易實現

1、什麼是資料庫連線池     我們現在在開發中一定都會用到資料庫,為了提高我們的系統的訪問速度,資料庫優化是一個有效的途徑。我們現在開發中使用資料庫一般都要經歷以下的四個步驟:(1)載入資料庫的驅動類,(2)建立資料庫連線,(3)進行資料操作,(4)關閉資料庫連線;在這四步中建立資料庫連線是一個比較耗時的操

java資料庫連線程式碼實現

import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.uti

Java資料庫連線細節探討

我們知道,資料庫連線池可以把資料庫的連線快取起來,下次使用的話可以直接取到快取起來的資料庫連線。那麼,在這個過程中有幾個細節需要注意: 1、資料庫的連線數有沒有限制? 2、資料庫會不會自動斷開已經建立的連線? 3、如果資料庫重啟了,但應用沒有重啟,那麼資料庫連線池中的所有連線都不可用了,

HikariCP 的Java資料庫連線介紹及配置

HiKariCP是資料庫連線池的一個後起之秀,號稱效能最好,可以完美地PK掉其他連線池。 原文地址:http://blog.csdn.net/clementad/article/details/46928621 官網:https://github.com/brettwooldridge/Hi

Druid以及Druid和常見的資料庫連線對比轉載

寫的灰常好非常細,關鍵是還有各種資料庫連線池的對比,條理比較清晰。 1. Druid是什麼? Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。 2. 在哪裡下載druid 3. 怎麼獲取Druid的原始碼 Druid

Java資料庫連線

1.簡介 Java 獲取資料庫的基本方式有兩種:1,通過DriverManager;2,通過DataSource,這裡主要講述第二種。 1.1 DriverManager跟DataSource獲取getConnection 的區別 DriverManag

資料庫連線使用springboot

轉自:https://blog.csdn.net/u014209205/article/details/80625963 1. 為什麼要使用資料庫連線池         使用資料庫連線池主要考慮到程式與資料庫建立連線

servlet+jsp+mysql+資料庫連線實現註冊登陸驗證碼功能

首先專案的結構及所用到的jar包如圖: 主要用到jdbc和jstl的jar包,大家可自行去相應網站下載 一、資料庫和資料表的建立 1.建庫語句: create database test; 2.建表語句: CREATE TABLE `t_users` (  

Spring Boot 整合 Mybatisdruid 資料庫連線 以及 分頁配置

MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映,目前很大一部分網際網路、軟體公司都在使用這套框架 下來來之後,我們主要關注幾個檔案 配置檔案:generator.properties 主要是資料庫的相關配置,以及檔案生成的根路徑 generator.jdbc.drive

主流Java資料庫連線比較與開發配置實戰

1.資料庫連線池概述 資料庫連線的建立是一種耗時、效能低、代價高的操作,頻繁的資料庫連線的建立和關閉極大的影響了系統的效能。資料庫連線池是系統初始化過程中建立一定數量的資料庫連線放於連線池中,當程式需要訪問資料庫時,不再建立一個新的連線,而是從連線池中取出一個已建立的空

自定義資料庫連線實現方式 MySQL

應用程式直接獲取資料庫連線缺點 使用者每次請求都會建立一次資料庫連線,並且資料庫建立連線會消耗相對大的資源和時間。 如果針對於個別的工具或者是大量的程式碼測試甚至系統執行,對資料庫操作次數頻繁,極大的佔用資料庫資源,有可能會發生宕機或者記憶體溢位的現象。 而在大多的專案中,常常用到阿里巴

為什麼HikariCP被號稱為效能最好的Java資料庫連線,如何配置使用

HiKariCP是資料庫連線池的一個後起之秀,號稱效能最好,可以完美地PK掉其他連線池。 什麼?不是有C3P0/DBCP這些成熟的資料庫連線池嗎?一直用的好好的,為什麼又搞出一個BoneCP來?因為,傳說中BoneCP在快速這個特點上做到了極致,官方資料是C3P0等

JDBC資料庫連線實現原理(手動實現)

一、普通的資料庫連線     如下圖所示,個使用者獲取資料庫資料都要單獨建立一個jdbc連線,當用戶獲取資料完成後再將連線釋放,可見對cpu的資源消耗很大。  二

自定義資料庫連線實現方式 MySQL

應用程式直接獲取資料庫連線缺點 使用者每次請求都會建立一次資料庫連線,並且資料庫建立連線會消耗相對大的資源和時間。 如果針對於個別的工具或者是大量的程式碼測試甚至系統執行,對資料庫操作次數頻繁,極大的佔用資料庫資源,有可能會發生宕機或者記憶體溢位的現象。 而在大多的專案中

Java資料庫連線比較及使用場景

我們在連線資料庫的時候,由於建立資料庫連線代價很大(銷燬連線的代價也很大),需要消耗很多資源,因此引入資料庫連線池。資料庫連線池是一種池化技術,預先建立好資料庫連線,儲存在記憶體中,當需要連線時,從中取出即可,使用完後放回連線池。 下面我們介紹Java中常用的

Java資料庫連線幾種方式及其特點

主流的資料庫連線池  在目前技術前沿比較流行的資料庫連線池有:DBCP、Tomcat Jdbc Pool、BoneCP、Druid、C3P0等 DBCP:由Apache開發的一個Java資料庫連線池專案, Jakarta commons-pool物件池機制,Tomcat使