mysql本身的数据库连接池_MySQL数据库连接池学习 一 手动写数据库连接池(dragon)...

这个博客介绍了一个简单的Java实现的数据库连接池JdbcPool。它使用LinkedList存储数据库连接,并通过Properties文件配置数据库连接参数。在获取连接时,它会从连接池中取出并返回一个代理Connection对象,当调用close方法时,实际是将连接归还给连接池,而不是真正关闭。
摘要由CSDN通过智能技术生成

2.在src下新建java文件JdbcPool.java,其内容为

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;

public class JdbcPool implements DataSource {

/**

*

*         使用LinkedList集合来存放数据库链接,

*        由于要频繁读写List集合,所以这里使用LinkedList存储数据库连接比较合适

*/

private static LinkedList listConnections = new LinkedList();

static{

InputStream in = JdbcPool.class.getClassLoader().getResourceAsStream("db.properties");

Properties prop = new Properties();

try {

prop.load(in);

String driver = prop.getProperty("driver");

String url = prop.getProperty("url");

String username = prop.getProperty("username");

String password = prop.getProperty("password");

//数据库连接池的初始化连接数大小

int jdbcPoolInitSize =Integer.parseInt(prop.getProperty("jdbcPoolInitSize"));

//加载数据库驱动

Class.forName(driver);

for (int i = 0; i < jdbcPoolInitSize; i++){

Connection conn = DriverManager.getConnection(url, username, password);

System.out.println("获取到了链接" + conn);

//将获取到的数据库连接加入到listConnections集合中,listConnections集合此时就是一个存放了数据库连接的连接池

listConnections.add(conn);

}

} catch (Exception e) {

// TODO Auto-generated catch block

throw new ExceptionInInitializerError(e);

}

}

@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;

}

/* 获取数据库连接

* @see javax.sql.DataSource#getConnection()

*/

@Override

public Connection getConnection() throws SQLException {

//如果数据库连接池中的连接对象的个数大于0

if (listConnections.size()>0){

//从listConnections集合中获取一个数据库连接

final Connection conn = listConnections.removeFirst();

System.out.println("listConnections数据库连接池大小是" + listConnections.size());

//返回Connection对象的代理对象

return (Connection) Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), new Class[]{Connection.class}, new InvocationHandler(){

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

if(!method.getName().equals("close")){

return method.invoke(conn, args);

}else{

//如果调用的是Connection对象的close方法,就把conn还给数据库连接池

listConnections.add(conn);

System.out.println(conn + "被还给listConnections数据库连接池了!!");

System.out.println("listConnections数据库连接池大小为" + listConnections.size());

}

return null;

}

});

}else{

throw new RuntimeException("对不起,数据库忙");

}

}

@Override

public Connection getConnection(String username, String password)

throws SQLException {

return null;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值