1. 程式人生 > >java通過代理使用redis,redis自動關閉連線,釋放資源

java通過代理使用redis,redis自動關閉連線,釋放資源

java使用redis一般都是通過redis.clients.jedis.Jedis來連線redis伺服器,通過redis.clients.jedis.Jedis提供的方法使用redis

但是每次執行完jedis裡面的方法之後必須關閉連結,釋放資源,否則連結一旦用完下次再使用redis程式會堵塞,但是手動關閉連結或出現很多的重複程式碼,並且有些時候也會忘記關閉

解決方法就是使用代理模式來解決這一問題

代理有兩種:java的Proxy類和Spring的Enhancer

區別就是前者只能代理基於介面的類,也就是說代理的類必須是介面,否則無法代理

後者是Spring的代理類,彌補java的Proxy只能代理介面的缺陷

Enhancer使用非常簡單,只要使用了Spring就會有,全類目是org.springframework.cglib.proxy.Enhancer

package com.xiaogang.report.proxy;

import com.xiaogang.report.handler.JedisHandler;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * jedis代理,自動關閉jedis連線
 */
public class JedisProxy {

    private JedisPool jedisPool;

    public JedisProxy(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }

    public Jedis createProxy() throws Exception{
        Enhancer enhancer = new Enhancer();
        //設定代理的父類,就設定需要代理的類
        enhancer.setSuperclass(Jedis.class);
        //設定自定義的代理方法
        Callback callback = new JedisHandler(jedisPool);
        enhancer.setCallback(callback);

        Object o = enhancer.create();
        Jedis jedis = null;
        if (o instanceof Jedis){
            jedis = (Jedis) o;
        }
        return jedis;
    }

}



package com.xiaogang.report.handler;

import org.springframework.cglib.proxy.InvocationHandler;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.lang.reflect.Method;

/**
 * jedis代理,自動關閉資源
 */
public class JedisHandler implements InvocationHandler {

    private JedisPool jedisPool;

    public JedisHandler(JedisPool jedisPool){
        this.jedisPool = jedisPool;
    }

    /**
     * 當使用jedis方法的時候,實際呼叫的這裡的方法
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("JedisHandler.invoke -----start");
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Object invoke = method.invoke(jedis, args);
            System.out.println("代理方法獲得的結果:"+invoke);
            return invoke;
        }finally {
            if (jedis != null) {
                jedis.close();
                System.out.println("關閉jedis連線");
            }
            System.out.println("JedisHandler.invoke -----end");
        }
    }
}


以後獲取Jedis物件通過new JedisProxy().createProxy(),使用jedis的方法都會自動關閉連線了

執行結果

JedisHandler.invoke -----start
代理方法獲得的結果:[email protected]
關閉jedis連線
JedisHandler.invoke -----end

相關推薦

java通過代理使用redisredis自動關閉連線釋放資源

java使用redis一般都是通過redis.clients.jedis.Jedis來連線redis伺服器,通過redis.clients.jedis.Jedis提供的方法使用redis 但是每次執行完jedis裡面的方法之後必須關閉連結,釋放資源,否則連結一旦用完下次

內網中JAVA通過代理方式訪問URL

1)前言:企業實際開發中,會遇到這樣的情況,在瀏覽器中可以訪問域名地址(如:www.baidu.com),但是實際在命令列中,通過ping命令是ping不通的。 2)原因: 2.1)首先我們的電腦能連線到外網,在通過域名訪問地址時,正常的訪問流程是,先到最近的域名

WPF彈出一個視窗自動關閉

最近用WPF做了一個小的demo,由於對於WPF不是很熟悉,在這個過程中遇到不少問題,這篇文章便是針對某個小需求的整理,這個需求便是:在WPF中,如何彈出一個視窗,並讓它定時自動關閉。 我記得我最早的思路是在主視窗中開啟一個執行緒,這個執行緒每隔1s休眠一次,用這個執行緒來

簡單演示螢幕視窗截圖的兩種方法(MessageBox截圖自動關閉

程式碼中提供了視窗截圖的兩種方法,但是在ScreenCapture.cs檔案中提供了多種螢幕截圖的方法 1、擷取button_click後彈出的視窗; 2、獲取指定標題的MessageBox,截圖,並在一秒鐘後自動關閉。 不貼程式碼了,直接上VS2008的工程了

在陽光下關閉自動調節功能後背光很亮開啟自動調節亮度背光很暗[FAQ12718][AAL] 開啟MTK_AAL_SUPPORT 後自動亮度調節速度變慢

[DESCRIPTION] 在陽光下關閉自動調節功能後,背光很亮,開啟自動調節亮度,背光很暗 在設定MTK_AAL_SUPPORT =yes後,選擇自動背光,環境變化後,背光亮度調節比較慢 [SOLUTION] 有兩個地方可以加快AAL 對背光PW

Java通過key直接擷取json字串的valuejson無需轉換

例如想擷取scoreClass 這是json資料 "extra_info": { "fm_info": { "riskService": { "reason_code": "0

vue富文本編輯編輯自動預覽單個圖片上傳不能預覽的問題解決:

pac themes indexof conf html_ sta spa load this //預覽<div class="htmlViewBox"> <p v-html="activity_html_defaultMsg" v-show="html

給mysql表加上自動時間戳以及解決"Incorrect string value: '\\xF0\\x9F\\x93\\x9D\\xC2\\xA0...' for column 'con的錯誤

建立表時CURRENT_TIMESTAMP,一定要設定預設的值 "Incorrect string value: '\\xF0\\x9F\\x93\\x9D\\xC2\\xA0...' for column 'con  報錯是因為utf8不能容納超過3個位元組的emoji

localStorage使用例項-進入顯示廣告點選關閉之後重新整理網頁不再出現

仿一下京東官網頂部的廣告關閉,效果為第一次進入官網會出現廣告,然後點選關閉,重新整理網頁不會再顯示廣告,但是當清除localStorage存入的資料,重新整理網頁會再顯示廣告。 html程式碼 <div class="header"> <div class="

IOS微信6.7.4輸入框失去焦點軟鍵盤關閉被撐起的頁面無法回退到原來正常的位置

IOS微信6.7.4輸入框失去焦點,軟鍵盤關閉後,被撐起的頁面無法回退到原來正常的位置   近期在開發微信H5頁面時碰到這個問題,如圖,軟鍵盤彈起後,若原輸入框被遮擋,頁面整體將會上移,然而當輸入框失焦,軟鍵盤收起後,頁面未恢復,這也是ios的微信版本更新6.7.4之後才

用兩個函式基本上解決此世紀難題——PB實現網路重新恢復後系統自動重新連線資料庫

//==================================================================== // 函式: of_ReConnectDB() //-----------------------------------------------------

Apache配置.htaccess檔案 http自動轉https隱藏index.php

<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{

客戶端一段時間不訪問第一次訪問資料庫自動斷開連線重新整理可以正常連線

資料庫應用開發過程中,我們可能會遇到一個問題:應用使用了資料庫連線池,每經過指定時間後,發出到資料庫伺服器的任何請求都會失敗,而且有且僅有一次失敗,之後的正常訪問都沒有問題。尤其是在Web應用中,如果晚上時段沒有訪問,而第二天第一個訪客的經歷就是碰到一個數據庫訪問錯誤,如果開發系統的程式設計師沒有注意這個問

伺服器端主動關閉連線 產生的TIME_WAIT狀態為什麼會佔用服務端大量埠?

1. 理解認為accep() 返回的socket_new, 其源埠和目的埠與 listen() 的socket 是一置的,accept() 返回並未佔用伺服器新的埠。 2. 如果伺服器端主動關閉 socket_new, 產生的TIME_WAIT狀態為什麼會在伺服器端佔用除監聽埠以外的其餘埠,還是其實並沒有佔

C#關閉窗體前釋放資源

在form_closing事件中加入以下程式碼: System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close();

剛才看別人總結的JDBC各種資料庫連線汗顏啊。老是抄襲別人的。哎。不要重複發明輪子。。

 1、Oracle8/8i/9i資料庫(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:o

hadoop啟動後9000埠無法連線netstat -tpnl中找不到該埠

已解決: 需要重新格式化hdfs。 1、停止hdfs; 2、刪除hdfs的相關檔案目錄(hdfs-site.xml中配置的存放檔案的目錄)。 3、啟動journalnode:sbin/hadoop-daemon.sh start journalnode; 4、格式化namenode:hdfs nam

基於Android硬體裝置跟微信伺服器通訊的專案心得以UDP Byte通訊為例建立無向連線0530手札

這段時間挺忙的,微信企業號等微信系列的教程全部停滯了,原因是我手頭上抓著幾個專案,加班就不說了,今天剛剛把新接手的專案整到大概%80的樣 子吧,準備明天整整,星期一過來直接對接測試,很多朋友跑過來問問題,我是真沒時間,請見諒! 今天就分享下這個專案的總結,原始碼就不貼上了

SQL語句的並集UNION交集JOIN(內連線連線)交叉連線(CROSS JOIN笛卡爾積)差集(NOT IN)

1.a. 並集UNIONSELECT column1, column2 FROM table1UNIONSELECT column1, column2 FROM table2b. 交集JOINSELECT * FROM table1 AS a JOIN table2 b ON

winform 窗體關閉但不釋放資源

重寫OnClosing方法,就可以實現此功能        protected override void OnClosing(CancelEventArgs e)         {             e.Cancel = true;             thi