1. 程式人生 > >JDBC連線池的簡單實現

JDBC連線池的簡單實現

先說明一下,我本身是做android開發的,java web是我的弱項,只是近來京東雲免費,於是去折騰了幾下,有了些許經驗,特作分享。如果文章中內容有誤,還請各高手指正。

我在web端,需要連線資料庫進行查詢插入等操作,但是每次進行操作都先獲取連線用完後就斷開的話,未免效率太低。以前知道tomcat中可以配置,但是京東雲引擎的tomcat並不能由自己配置。因為我折騰的東西較小,所以也不考慮使用框架,於是就想自己寫一個。

我寫的連線池很簡單,在初始化時建立5個連線,並放在一個列表當中。如果要獲取連線,從列表中獲取,同時列表移除,還回來時,列表新增上。也就是列表儲存的是閒置的連線。

如果列表已經為空了,那麼判斷是否超過最大連線了,沒有就建立,有的話就等待。當然,我這裡做的是很簡單的實現,所以沒有去做等待超時等處理。

程式碼如下:

package com.githang.tucao.web.dbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

public class DatabaseConnection {
    private static final String CREATE_TABLE_TWITTER = "CREATE TABLE IF NOT EXISTS twitter (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, msg varchar(300) not null) DEFAULT CHARSET=utf8";
    final static String HOST = "host";
    final static String PORT = "port";
    final static String DB_NAME = "dbname";
    final static String USERNAME = "username";
    final static String PASSWORD = "password";
    final static String url = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DB_NAME
            + "?useUnicode=true&characterEncoding=utf-8";
    private static final DatabaseConnection instance = new DatabaseConnection();
    private final int INIT_COUNT = 5;
    private final int MAX_COUNT = 30;
    private int count = 0;
    
    private final Object wait = new Object();
    
    private  LinkedList<Connection> CONN_POOL;

    private DatabaseConnection() {
        CONN_POOL = new LinkedList<Connection>();
        try {
            Class.forName("com.mysql.jdbc.Driver");
            for (int i = 0; i < INIT_COUNT; i++) {
                Connection connection = createConnection();
                if(connection != null) {
                    CONN_POOL.add(createConnection());
                    count++;
                }
            }
     //       Connection connection = getConnection();
     //       Statement stmt = connection.createStatement();
     //       stmt.execute(CREATE_TABLE_TWITTER);
     //       stmt.execute("set names 'utf-8'");
     //       stmt.close();
     //       releaseConnection(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static DatabaseConnection getInstance() {
        return instance;
    }
    
    private static Connection createConnection() {
        try {
            return DriverManager.getConnection(url, USERNAME, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public Connection getConnection() {
        synchronized (CONN_POOL) {
            while(CONN_POOL.size() > 0) {
                Connection conn = CONN_POOL.removeLast();
                try {
                    if(conn.isValid(1000)) {
                        return conn;
                    } else {
                        count--;
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(count < MAX_COUNT) {
                count++;
                return createConnection();
            } 
            synchronized (wait) {
                try {
                    wait.wait(3000);
                    if(CONN_POOL.size() > 0) {
                        return CONN_POOL.removeLast();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    public void releaseConnection(Connection connection) {
        CONN_POOL.add(connection);
        synchronized (wait) {
            wait.notify();
        }
    }
    
}
其中count用於儲存當前連線數(包括閒置和在使用的)。

wait物件用於執行緒同步鎖,主要是獲取不到連線並且需要等其他連線被還回來時使用,在getConnection()裡面呼叫 wait,而在releaseConnection()方法中,也就是釋放連線時,呼叫 notify通知其他等待的執行緒。

另外,在公用的資料庫當中,資料庫連線通常是不作長連線的。所以在這裡連線池中的連線,可能是已經斷開的或者是無效的,所以在獲取連線時需要判斷一下當前拿到的連線是否還有效。沒有的話就拿下一個。

相關推薦

【設計模式】之物件模式--JDBC連線簡單實現案例

文章目錄 物件池設計模式 物件池設計模式的目標 問題 討論 結構 示例 核驗單 經驗法則 連線池模式示例程式碼 ObjectPool.java

JDBC連線簡單實現

先說明一下,我本身是做android開發的,java web是我的弱項,只是近來京東雲免費,於是去折騰了幾下,有了些許經驗,特作分享。如果文章中內容有誤,還請各高手指正。 我在web端,需要連線資料庫進行查詢插入等操作,但是每次進行操作都先獲取連線用完後就斷開的話,未免效率

jdbc連線實現

2、連線池實現   下面給出連線池類和連線池管理類的主要屬性及所要實現的基本介面: public class DBConnectionPool implements TimerListener{ private int checkedOut;//已被分配出去的連線數 private ArrayLis

一個簡單資料庫連線實現

一、已實現功能   資料庫連線快取。將資料庫連線與執行緒ID繫結並提供執行資料庫操作時檢測。資料庫連線超時檢測。初始化資料庫環境,包括初始化資料庫,資料庫使用者,資料庫表。 二、程式碼列表: 1、MySqlDBManager:   用於管理資料庫配置、初始化資料庫環境及建立

JDBC程式設計學習筆記之資料庫連線實現

在JDBC程式設計的時候,獲取到一個數據庫連線資源是很寶貴的,倘若資料庫訪問量超大,而資料庫連線資源又沒能得到及時的釋放,就會導致系統的崩潰甚至宕機。造成的損失將會是巨大的。再看有了資料庫連線池的JDBC,就會較好的解決資源的建立與連線問題,其主要還是針對於連線

jdbc連線Mysql資料庫實現crud

一.首先下載jdbc連線包 https://www.mysql.com/products/connector/ 二:然後解壓出來就可以看見下面兩個壓縮檔案 開啟eclise,假設已經建立好一個java專案 右鍵單擊專案名然後選擇如下圖所示步驟操作就好: 專案名

Hive使用druid做連線程式碼實現

配置文件 hive_jdbc_url=jdbc:hive2://192.168.0.22:10000/default hive.dbname=xxxxx hive_jdbc_username=root hive_jdbc_password=123456 #配置初始化大小、最小、最大 hiv

自定義資料結構設計JDBC連線提高效能

  // 後面貼上原始碼 之前寫一個小工具,發現了一個問題,發現部署到雲端計算上面,由於需要操作其他環境的資料庫,發現獲取66   175環境的獲取連線非常緩慢。 通過列印日誌,然後部署到伺服器,發現獲取175環境的資料庫連線池居然要6s?? 獲取66環境需

JDBC連線BoneCP

public class ExampleDataSource { public static void main(String[] args) { Connection connection = null; try

jdbc連線c3p0連線

public class DataSource { private static DataSource datasource; private ComboPooledDataSource cpds; private DataSource() throws IOExcept

AIDL連線實現

參考《Android開發藝術探索》學習一下AIDL的連線池實現 回顧一下AIDL使用的大致流程:首先建立一個Service和一個AIDL介面,接著建立一個類繼承自AIDL介面中的Stub類並實現Stub中的抽象方法,在Service的onBind方法中返回這個類的物件,然後客戶端就可以繫

golang go-sql-drive mysql連線實現 golang go-sql-drive mysql連線實現

golang go-sql-drive mysql連線池的實現 golang內部自帶了連線池功能,剛開始接觸golang的時候不瞭解這個,還自己搞了一個 sql.Open的物件管理池,真的非常囧啊。 sql.Open函式實際上是返回

golang sql連線實現解析 golang sql連線實現解析

golang sql連線池的實現解析 golang的”database/sql”是操作資料庫時常用的包,這個包定義了一些sql操作的介面,具體的實現還需要不同資料庫的實現,mysql比較優秀的一個驅動是:github.com/go-sql-dri

【Elasticsearch】Java Client連線程式碼實現

用過Elasticsearch API的都知道,在Java端使用是ES服務需要建立Java Client,但是每一次連線都例項化一個client,對系統的消耗很大,而且最令人頭疼的是它的連線非常慢。所以為了解決上述問題並提高client利用率,用池化技術複用client,第一次用去建立cli

Spring的Jdbc,事務及簡單實現

一.spring 整合 jdbc 基本的專案目錄: 首先要加入的pom.xml配置,也就是引入的依賴,程式碼如下: <!-- spring 測試環境 --> <dependency> <groupId>o

JDBC-連線之裝飾者和動態代理

前言 通過裝飾者模式來定義連線池 定義Connection實現 定義DataSource實現的實現 通過動態代理來定義連線池

five, mySQL ,JDBC 連線

JDBC連線池 一 preparedStatement 1.1回顧上一篇的登入案例 我可以不輸入密碼就可以登入 Select * from user where username=’tom’#’and password=’’; 輸入引數與字串連線,傳送給資料

spark的JDBC連線(Scala版)

一個Scala版的連線池,並在使用Spark Streaming進行Word Count時,把每批資料都存到mySql中 import java.sql.{Connection, DriverManager} import java.util object J

tomcat配置jdbc連線

1.為什麼要使用jdbc連線池呢         使用jdbc連線資料庫時,drivermanager得到資料庫連線物件需要與資料庫進行多次認證,影響到了應用系統的效能,那麼我們應當儘量減少不停建立新的

Spring學習(四)Jdbc連線交個spring管理和事務操作

一、連線池的配置交給Spring管理 1,新增jar包 2,spring的jdbc連線池配置 <!-- 配置連線池 --> <bean id="dataSource" class="org.spring