java學習筆記—標準連接池的實現(27)

 2023-12-06 阅读 22 评论 0

摘要:javax.sql.DataSource. Java.sql.* DataSource 接口由驅動程序供應商實現。共有三種類型的實現: 基本實現 - 生成標準的 Connection 對象 – 一個DataSource數據源中,只有一個Connection ,這個不是池管理。連接池實現 [W1]?- 生成自動參與連接池的 Connection

javax.sql.DataSource.

Java.sql.*

DataSource 接口由驅動程序供應商實現。共有三種類型的實現:

  1. 基本實現 - 生成標準的 Connection 對象 – 一個DataSource數據源中,只有一個Connection ,這個不是池管理。
  2. 連接池實現 [W1]?- 生成自動參與連接池的 Connection 對象。
  3. 分布式事務實現 - 生成一個 Connection 對象,該對象可用于分布式事務,大多數情況下總是參與連接池。JTA.jar – SUN。

?

標準的連接池,要求:

?????? 1:實現dataSource接口。

?????? 2:聲明一個集合類用于管理多個連接。

?????? 3:必須要擁有一種能力,回收連接。

?????? 4:必須要實現一個方法,getConnection以獲取一個連接。

?????? 5:實現DataSource接口的類,一般不能擁有static池對象。List.

?????? 6:在一個程序中,要求只擁有一個DataSource實例就可以了。

以下是具體的實現:


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import javax.sql.DataSource;
/*** 標準的連接*/
public class DBPool implements DataSource  {//聲明一個池管理對象private LinkedList<Connection> pool = new LinkedList<Connection>();//在初始化這個DataSourc的子類時在構造方法設置多個連接public DBPool(){try{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql:///db909?characterEncoding=UTf8";for(int i=0;i<3;i++){Connection con = DriverManager.getConnection(url,"root","1234");//將生成的這個連接。放到pool
                pool.add(con);}}catch(Exception e){throw new RuntimeException(e.getMessage(),e);}}public Connection getConnection() throws SQLException {return pool.removeFirst();}///其他的方法。不實現
}

2:實現連接的回收

package cn.itcast.utils;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.util.LinkedList;
import javax.sql.DataSource;
/*** 標準的連接*/
public class DBPool implements DataSource {//聲明一個池管理對象private LinkedList<Connection> pool = new LinkedList<Connection>();//在初始化這個DataSourc的子類時在構造方法設置多個連接public DBPool(){ try{Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql:///db909?characterEncoding=UTf8";for(int i=0;i<3;i++){final Connection con = DriverManager.getConnection(url,"root","1234");Object proxyedConn =Proxy.newProxyInstance(DBPool.class.getClassLoader(), new Class[]{Connection.class},new InvocationHandler() {public Object invoke(Object proxyedConnection, Method method, Object[] args)throws Throwable {if(method.getName().equals("close")){synchronized (pool) { pool.addLast((Connection) proxyedConnection);pool.notify();}return  null;}//目標方法的返回值Object returnValue=method.invoke(con, args); return returnValue;}});pool.add((Connection) proxyedConn);}}catch(Exception e){throw new RuntimeException(e.getMessage(),e);}}public Connection getConnection() throws SQLException { synchronized (pool) {if(pool.size()==0){try {pool.wait();} catch (InterruptedException e) {e.printStackTrace();}return getConnection();}Connection con = pool.removeFirst();System.err.println("siize:"+pool.size());return con;}}
}

?

轉載于:https://www.cnblogs.com/zhenghongxin/p/4399132.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/192534.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息