`

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数据库连接池是Java开发中一个非常重要的技术,它主要用于管理数据库连接,提高数据库操作的效率和性能。在Java应用程序中,频繁地创建和关闭数据库连接会导致大量的系统资源浪费,而连接池则可以复用已建立的...

    Java jdbc数据库连接池总结

    Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...

    轻量级java数据库连接池

    本项目提供了一个轻量级的Java数据库连接池实现,旨在简化开发过程,提高应用性能并降低资源消耗。下面将详细介绍这个轻量级Java数据库连接池的设计理念、工作原理以及如何使用。 1. **设计理念** 轻量级数据库...

    java手写数据库连接池

    数据库连接池是Java应用程序中非常重要的一个组件,它在提高应用性能、节省系统资源方面起着关键作用。本文将深入探讨如何使用Java手写数据库连接池,并基于maven进行项目构建。我们将分析四个核心类的功能,以及...

    java数据库连接池例子

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它可以提高应用程序的性能和效率。连接池在初始化时创建一定数量的数据库连接,并将它们存储起来,当应用程序需要连接时,可以从池中获取,...

    java写的数据库连接池

    数据库连接池是Java开发中非常重要的一个概念,它在处理大量并发访问数据库的应用场景中扮演着关键角色。本文将深入探讨数据库连接池的工作原理、重要性以及如何在Java中实现一个简单的连接池。 首先,数据库连接池...

    java_jdbc数据库连接池总结

    Java JDBC 数据库连接池总结 Java JDBC 数据库连接池是 Java 应用程序访问数据库的基本原理之一。Java 语言通过 JDBC 技术访问数据库,JDBC 是一种“开放”的方案,为数据库应用开发人员和数据库前台工具开发人员...

    使用JAVA中的动态代理实现数据库连接池

    数据库连接池的实现通常涉及到多线程、对象池和资源管理等概念。本篇将深入探讨如何利用Java中的动态代理技术来实现一个简单的数据库连接池。 动态代理是Java提供的一种强大特性,主要由`java.lang.reflect.Proxy`...

    Java数据库连接池

    Java数据库连接池(Java Database Connection Pool)是一种管理数据库连接的技术,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这样做可以显著提高应用性能,减少资源消耗,并提供...

    Java-jdbc数据库连接池总结.doc

    Java JDBC 数据库连接池技术是Java应用程序访问数据库的关键优化手段,尤其在Web应用程序中,它解决了传统JDBC连接方式存在的效率低下和资源浪费问题。Java JDBC(Java Database Connectivity)是Java语言与各种...

    数据库连接池配置

    ### 数据库连接池配置 #### 一、引言 在基于数据库的应用开发中,数据库连接的管理和优化至关重要。本文档详细介绍了MySQL数据库连接池的配置方法及其工作原理,并结合具体的编程场景进行了阐述。 #### 二、传统...

    Java中数据库连接池原理机制的详细讲解.pdf

    ### Java中数据库连接池原理机制详解 #### 一、引言 在现代软件开发中,尤其是在基于Java的应用程序中,数据库连接池技术是一项至关重要的技术。它能够显著提高应用程序访问数据库的效率,减少资源消耗,并简化...

    自己写的java数据库连接池

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

    java 数据库连接池

    Java数据库连接池是一种重要的技术,它在Java应用程序与数据库交互时起到了关键的作用。数据库连接池在多线程、高并发的环境下尤其重要,因为它能够有效地管理和重用数据库连接,从而提高系统性能,减少资源消耗。 ...

    java 多线程操作数据库

    2. **数据库连接管理**:在多线程环境下,正确地管理和释放数据库连接至关重要。示例代码中使用了JDBC(Java Database Connectivity)API来建立与Oracle数据库的连接,并通过`DriverManager.getConnection()`方法...

    使用JAVA中的动态代理实现数据库连接池.rar_数据库连接池_连接池

    总结,使用Java的动态代理来实现数据库连接池,可以让我们在不改变原有代码的情况下,轻松地添加监控、管理和优化功能。通过拦截数据库连接的打开和关闭操作,我们可以有效地控制资源使用,提升应用性能,同时降低了...

    Java数据库连接池 BoneCP

    Java数据库连接池(Database Connection Pool)是Java应用程序中用于管理数据库连接的一种技术,它提高了数据库访问的效率,降低了系统的资源消耗。BoneCP是一款轻量级、高性能的Java数据库连接池,设计目标是解决...

    自定义的数据库连接池

    数据库连接池是数据库管理中的重要概念,它在Java Web应用中尤其常见,主要用于优化数据库的连接管理和资源利用。自定义数据库连接池是为了更好地适应特定应用的需求,提高数据存取的效率,减少系统开销,避免频繁...

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

    通过以上知识的学习和实践,开发者可以熟练地在Java环境中实现多线程数据互导,高效使用数据库连接池,以及进行多表插入操作,提升系统的并发处理能力和性能。在实际工作中,还需要根据具体需求和场景,灵活运用这些...

Global site tag (gtag.js) - Google Analytics