jdbcpool

下面是java写的数据库连接池代码,可以连接oracle和mysql,当然使用时必须加上对应的驱动包。
public class JdbcPool {

private static List<Connection> pool=new LinkedList<Connection>();
private static int minConn=10;
private static int maxConn=50;
private static int curActive=0;
private static JdbcPool jp;
public static JdbcPool getInstance(){
if(jp==null){
jp=new JdbcPool();
}
return jp;
}
private JdbcPool(){
initPool();
}
public void initPool(){
for(int i=0;i<minConn;i++){
try {
pool.add(createConnection());
} catch (Exception e) {
e.printStackTrace();
}
}
}
private Connection createConnection() throws Exception{
String clazz="org.gjt.mm.mysql.Driver";//"oracle.jdbc.driver.OracleDriver";
String url="jdbc:mysql://localhost:3306/user";//"jdbc:oracle:thin:@127.0.0.1:1521:ORAC";
String username="root";//"scott";
String password="root";//"tiger";
Connection conn=null;

Class.forName(clazz);
conn=DriverManager.getConnection(url,username,password);
//保证连接池中存放的是对象代理 Proxy得到动态代理对象
conn=(Connection)Proxy.newProxyInstance(Connection.class.getClassLoader(),
new Class[]{Connection.class},
new DynamicProxyHandler(conn));
return conn;
}
public synchronized Connection getConnection() throws Exception{
Connection conn=null;
synchronized (pool) {
if(pool.size()<=0){
if(curActive<=maxConn){
conn=createConnection();//这个已经是代理类
curActive++;
}else{
Thread.sleep(50);
}
}else{
conn=pool.remove(0);
curActive++;
}
}
return conn;
}
private class DynamicProxyHandler implements InvocationHandler{//逻辑处理器
private Connection conn;
private DynamicProxyHandler(Connection conn){
this.conn=conn;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName()=="close"){
synchronized(pool){
if(pool.size()>minConn){
try {
conn.close();
System.out.println("真正关闭");
} catch (SQLException e) {
e.printStackTrace();
}
}else{
System.out.println(conn.getClass());
conn=(Connection)Proxy.newProxyInstance(Connection.class.getClassLoader(),
new Class[]{Connection.class},
new DynamicProxyHandler(conn));
System.out.println(conn.getClass());
pool.add(conn);
}
}
curActive--;
return null;
}
return method.invoke(conn,args);
}

}
public static void main(String[] args) {
try {
Connection conn=null;
for(int i=0;i<100;i++){
conn=JdbcPool.getInstance().getConnection();
System.out.println(conn.getClass());
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值