`

java数据库连接池的优化动态代理多线程线程通讯

 
阅读更多
1.数据可连接配置文件 jdbc配置文件
driver:oracle.jdbc.driver.OracleDriver
path:jdbc:oracle:thin:@127.0.0.1:1521:ORCL
countSize:3
user:scott
password:tiger  


2.线程类
package com.cgm.util;

import java.sql.Connection;
import java.sql.Statement;

public class MyThread extends  Thread{

@Override
public void run() {
Connection conn=null;
try {
conn=Conutils.getCon();  //取得链接
System.err.println(this.getName()+","+conn);
conn.setAutoCommit(false);//设置失去的开始
String sql=" insert into userss values('"+this.getName()+"','Tom','49')";
Statement st=conn.createStatement();
st.execute(sql);
conn.commit();
System.out.println(this.getName()+"子线程执行完成");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
conn.setAutoCommit(true);
conn.close();   //close变成了还链接
} catch (Exception e2) {
e2.printStackTrace();
}

}




}
   
}




3代理类
package com.cgm.threadpool;

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.util.ArrayList;
import java.util.List;

public class ConUtils1 {

private static List<Connection> pool=new ArrayList<Connection>();
static{
try {

Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
String user="scott";
String passWord="tiger";
for (int i = 0; i < 3; i++) {
final Connection conn=  DriverManager.getConnection(url, user, passWord);
//产生被代理对象对conn进行代理
Object  connObj=Proxy.newProxyInstance(
ConUtils1.class.getClassLoader(),
new Class[]{Connection.class},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {

  //method.getName()拦截目标类别的所有方法
if (method.getName().equals("close")) {
System.out.println("不能关啊,还要链接");
}else{
System.out.println(method.getName());
return method.invoke(conn, args);
}


synchronized (pool) {
//这个peoxy就是    connObj
pool.add((Connection) proxy);
//加进去了就放行
pool.notify();
}

return null;
}
});


pool.add((Connection) connObj); //加被代理对象能拦截啊,只能拦截代理对象
}
} catch (Exception e) {
throw  new RuntimeException();
}
}

/*
* 提供一个静态工厂方法 返回一个链接
*/
public static  Connection getCon(){
  synchronized (pool) {
 
  if (pool.size()==0) {  //发现没有----等待
try {
//Thread.sleep(1000);
pool.wait();  //没有就等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return  getCon();  //递归 直到拿到为止
}
 
 
  Connection conn=pool.remove(0); //返回一个代理的Connection类
return  conn;
}
}
}



4.测试类

package com.cgm.util;

public class ThreadDemo  {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 30; i++) {
new MyThread().start();
}

}
}
   
分享到:
评论

相关推荐

    自己写的java数据库连接池

    数据库连接池用在网站后台架构中,非常有利于提高用户请求的响应速度。为此,我编写了一个...经过上千个多线程同时访问的数据库连接池程序 。 资源包括一个接口,两个实现。一个测试类。 大家可以使用它,修改它。

    java高性能数据库连接池V2.0

    数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...

    java高性能数据库连接池V5.0

    数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...

    R2高性能数据库连接池v1.5源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发,CPU磁盘占用情况 1.数据库连接池 2.Durid介绍(官方文档) 3.编码,问题,常规并发操作 3.1.JDBCUtil....

    Java网络编程-多线程,连接池

    Java网络编程-多个例子,多线程,连接池,文件传输

    JAVA多线程实现数据库之间的数据互导、连接池、及多表插入数据库功能

    NULL 博文链接:https://chensijie88888.iteye.com/blog/829238

    R2数据库连接池高性能连接池v1.3

    v1.3改进了清理线程可能出现的减少连接池中链接而不计数的问题。 v1.2处理了oracle环境下由于服务器关闭休眠链接造成的连接池循环检测进程异常退出的情况,改为当循环周期大于服务器关闭休眠链接间隔时,后台打印...

    连接池实现,分布是数据库

    连接池是解决多线程同时访问是,不必频繁连接数据库用的。

    R2高性能数据库连接池v1.6源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在...

    Spring Boot与HikariCP:性能卓越的数据库连接池

    本文将详细介绍Spring Boot中如何使用HikariCP作为数据库连接池,包括其工作原理、优势分析、配置步骤以及代码示例。通过本文,读者将能够轻松集成HikariCP到Spring Boot项目中,从而提高数据库连接的性能和效率。 ...

    R2高性能数据库连接池v1.8改进版源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    R2高性能数据库连接池v1.3源码

    v1.3改进了清理线程可能出现的减少连接池中链接而不计数的问题。 v1.2处理了oracle环境下由于服务器关闭休眠链接造成的连接池循环检测进程异常退出的情况,改为当循环周期大于服务器关闭休眠链接间隔时,后台打印...

    R2高性能数据库连接池v1.7源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    java使用influxDB数据库的详细代码

    主要为大家介绍了java使用influxDB数据库的详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    R2高性能数据库连接池v1.8源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    Java多线程教程

    Thread概念 Thread实现方法 Thread生命周期 Thread的安全和锁 Concurrent包(安全集合类、安全Queue) 线程阻塞机制 线程池详解(原理,实际使用) 线程的监控,分析方法 扩展数据库连接池

    write-jdbc-deom:纯手写数据库连接池,创建多个线程的替换机制

    write-jdbc-deom:纯手写数据库连接池,创建多个线程的替换机制

    JDBC线程安全的Druid数据库连接类

    JDBC工具类使用阿里巴巴的数据库连接池Druid,支持高并发,支持多线程环境下的事务和查询测试。

    Java访问SQL数据库的优化探讨

    进而从提高访问数据库效率的角度,论述了采用数据库连接池技术、优化SQL语句格式和多线程方法等可提高Java访问数据库效率的方法。  1.概述  在软件开发中通常都会涉及到数据库的应用。而数据库的连接则是数据库...

Global site tag (gtag.js) - Google Analytics