JAVA连接MySQL的好处_java数据库缓冲池的好处和基本原理(转载)

package connectionpool;

import java.lang.reflect.Proxy;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.Stack;

import test.TestInterface;

public class ConnectionPool {

Stack st = new Stack(); //创建一个堆栈,作为池子

private static ConnectionPool instance = new ConnectionPool(); //单例模式

public static int initialPoolSize = 5;

public static String dbName = "test";

public static String userName = "root";

public static String userPasswd = "";

private ConnectionPool() {

for(int i = 0; i < initialPoolSize; i++) //初始化缓冲池

try {

createConnection().close();

} catch (Exception e) {

e.printStackTrace();

}

}

public synchronized static Connection getConnection() throws Exception {

if (instance.st.size() > 0) return instance.st.pop();

else return createConnection();

}

synchronized static void returnConnection(Connection conn) {

instance.st.push(conn);

}

private static Connection createConnection() throws Exception { //以mysql为例 创建数据库连接

String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;

Class.forName("com.mysql.jdbc.Driver").newInstance();

Connection connection=DriverManager.getConnection(url);

ConnectionProxy handler = new ConnectionProxy(connection);

Connection proxy = (Connection ) Proxy.newProxyInstance( //创建代理

connection.getClass().getClassLoader(),

connection.getClass().getInterfaces(),handler);

return proxy;

}

}

接着实现代理类

package connectionpool;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.sql.Connection;

public class ConnectionProxy implements InvocationHandler{

Connection delegate;

ConnectionProxy(Connection delegate) {

this.delegate = delegate;

}

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

throws Throwable {

try {

if ("close".equals(method.getName())) { //在close函数处设置钩子

ConnectionPool.returnConnection((Connection) proxy);

//将数据库连接归还缓冲池,跳过了原来的close()函数

// 这里的proxy实际上就是Connection的一个代理实例

}

else return method.invoke(delegate, args);

} catch (Exception e){

}

return null;

}

}

使用缓冲池很简单 ConnectionPool.getConnection();

使用完connection后,直接执行close()函数就行了,connection将返回缓冲池中而不是真正的关闭

当然这只是实现了很简单的一个缓冲池,实用化还需要加上其他一些功能

比如关闭idle连接等等

接下来介绍一个实用的java数据库缓冲池 c3p0。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-02-21 14:55

浏览 1235

评论

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值