最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 15:46:13
文檔

通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的

通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的:package tk.dong.connection.util;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Conn
推薦度:
導(dǎo)讀通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的:package tk.dong.connection.util;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Conn

package tk.dong.connection.util;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Conn

package tk.dong.connection.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.Properties;
import java.util.logging.Logger;

import javax.sql.DataSource;

//這是通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的操作
public class JdbcPoolProxy implements DataSource {

	// 創(chuàng)建連接池
	private static LinkedList connections = new LinkedList();
	static {
	// 獲取properties的配置文件,并以流的方式存儲(chǔ)
	InputStream inputStream = JdbcPoolProxy.class.getClassLoader()
	.getResourceAsStream("jdbc.properties");
	// 創(chuàng)建properties的屬性處理對(duì)象
	Properties properties = new Properties();
	try {
	// 將屬性文件載入
	properties.load(inputStream);
	// 獲取連接的驅(qū)動(dòng)文件
	Class.forName(properties.getProperty("driverClassName"));
	// 循環(huán)創(chuàng)建連接并放入連接池
	for (int i = 0; i < 10; i++) {
	// 創(chuàng)建連接對(duì)象
	final Connection conn = DriverManager.getConnection(
	properties.getProperty("url"),
	properties.getProperty("user"),
	properties.getProperty("pass"));

	// 將創(chuàng)建分連接對(duì)象添加到連接池
	// 通過動(dòng)態(tài)代理處理close的方法實(shí)現(xiàn)取出的連接對(duì)象返回連接池的效果
	connections.add((Connection) Proxy.newProxyInstance(
	JdbcPoolProxy.class.getClassLoader(),
	new Class[] { Connection.class },
	new InvocationHandler() {

	@Override
	public Object invoke(Object proxy, Method method,
	Object[] args) throws Throwable {
	// 判斷當(dāng)前執(zhí)行的方法名是不是close時(shí)還執(zhí)行自己的方法體
	if (!method.getName().equals("close")) {
	// 執(zhí)行目標(biāo)方法
	return method.invoke(conn, args);
	}
	// 如果是close方法
	// 向連接池中添加連接對(duì)象
	connections.add(conn);
	System.out.println("又一個(gè)連接用玩完了,返回個(gè)連接池,當(dāng)前連接池有"
	+ connections.size() + "個(gè)連接對(duì)象");
	return null;
	}
	}));
	System.out.println("線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======"
	+ connections.size() + "=====個(gè)連接對(duì)象");
	}

	} catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
	} catch (ClassNotFoundException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
	} catch (SQLException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
	}

	}

	@Override
	public Connection getConnection() throws SQLException {
	// 聲明連接對(duì)象
	Connection conn = null;
	// 判斷連接池中是否有連接對(duì)象
	if (connections.size() > 0) {
	// 從連接池取出連接對(duì)象
	conn = connections.removeFirst();
	System.out.println("有一個(gè)連接對(duì)象被占用,連接池還有=========" + connections.size()
	+ "個(gè)連接");
	}

	return conn;
	}

	@Override
	public Connection getConnection(String username, String password)
	throws SQLException {
	// TODO Auto-generated method stub
	return null;
	}

	@Override
	public PrintWriter getLogWriter() throws SQLException {
	// TODO Auto-generated method stub
	return null;
	}

	@Override
	public void setLogWriter(PrintWriter out) throws SQLException {
	// TODO Auto-generated method stub

	}

	@Override
	public void setLoginTimeout(int seconds) throws SQLException {
	// TODO Auto-generated method stub

	}

	@Override
	public int getLoginTimeout() throws SQLException {
	// TODO Auto-generated method stub
	return 0;
	}

	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException {
	// TODO Auto-generated method stub
	return null;
	}

	@Override
	public  T unwrap(Class iface) throws SQLException {
	// TODO Auto-generated method stub
	return null;
	}

	@Override
	public boolean isWrapperFor(Class iface) throws SQLException {
	// TODO Auto-generated method stub
	return false;
	}

}
下面是測(cè)試代碼
package tk.dong.connectionPool.test;

import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;

import tk.dong.connection.util.JdbcPoolProxy;

public class JdbcPoolProxyTest {

	@Test
	public void test() throws SQLException {
	// 創(chuàng)建連接池對(duì)象
	JdbcPoolProxy jdbcPoolProxy = new JdbcPoolProxy();

	// 從連接池中取出連接
	jdbcPoolProxy.getConnection();
	jdbcPoolProxy.getConnection();
	jdbcPoolProxy.getConnection();
	jdbcPoolProxy.getConnection();

	Connection conn = jdbcPoolProxy.getConnection();
	conn.close();

	jdbcPoolProxy.getConnection();
	jdbcPoolProxy.getConnection();

	}

}

下面是運(yùn)行結(jié)果

線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======1=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======2=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======3=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======4=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======5=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======6=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======7=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======8=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======9=====個(gè)連接對(duì)象
線連接池添加了一個(gè)鏈接對(duì)象,當(dāng)前連接池有======10=====個(gè)連接對(duì)象
有一個(gè)連接對(duì)象被占用,連接池還有=========9個(gè)連接
有一個(gè)連接對(duì)象被占用,連接池還有=========8個(gè)連接
有一個(gè)連接對(duì)象被占用,連接池還有=========7個(gè)連接
有一個(gè)連接對(duì)象被占用,連接池還有=========6個(gè)連接
有一個(gè)連接對(duì)象被占用,連接池還有=========5個(gè)連接
又一個(gè)連接用玩完了,返回個(gè)連接池,當(dāng)前連接池有6個(gè)連接對(duì)象
有一個(gè)連接對(duì)象被占用,連接池還有=========5個(gè)連接
有一個(gè)連接對(duì)象被占用,連接池還有=========4個(gè)連接

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的

通過動(dòng)態(tài)代理(Proxy)實(shí)現(xiàn)的數(shù)據(jù)庫連接池的創(chuàng)建連接與歸還鏈接的:package tk.dong.connection.util;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Conn
推薦度:
標(biāo)簽: 創(chuàng)建 代理 連接
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top