Java动态代理连接数据库,模拟连接池

从SolidWorks到URDF:插件使用、关节配置与PyBullet仿真避坑指南 本文提供了一份从SolidWorks导出URDF模型并导入PyBullet进行仿真的完整实战指南。详细讲解了SolidWorks插件的正确安装与配置、关节类型的选择与坐标系对齐的核心技巧,并针对PyBullet仿真中常见的模型散架、路径错误、物理属性异常等问题提供了深度避坑解决方案,帮助机器人开发者高效完成从设计到仿真的全流程。 阅读详情

经常操作数据库的关闭,连接,很浪费系统资源,导致系统运行效率低,本人做了一个模拟连接池的程序,使用代理模式,代理数据库的关闭方法,当用户点击关闭连接时,数据库连接并没有关闭,而是被挂起,等待另一个用户来拿,这样,就减少了用户频繁的操作数据库的关闭,连接,下面是我自己写的代码。请各位看看有什么不好的地方,麻烦各位大虾指出

1. 代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口; (在此我没有写抽象角色,直接代理真实对象)
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

数据库实体ConnBean.java

 

package com.sve.proxydb;

public class ConnBean {
 
/* private String url = null; 
 private String driver = null;
 private String user = null;
 private String password = null;
 
 */
 public String getUrl() {
  return "jdbc:oracle:thin:@192.168.1.24:1521:ora10g";
 }
 public String getDriver() {
  return "oracle.jdbc.driver.OracleDriver";
 }
 public String getUser() {
  return "scott";
 }
 public String getPassword() {
  return "sa";
 }
 
}

(这个可以使用xml记录这些值,本人认为使用xml会更好,可是我用了老是报错,所以我就没有用了)

 

真实角色Strategy.java

 

package com.sve.proxydb;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;


public class Strategy {
 
 public static int maxConn = 0;   //最大连接数
 public static int minConn = 0;   //最小连接数
 public static int initConn = 0;  //初始化连接
 public static int freeConn = 0;  //空闲连接
 public static int currentConn = 0;  //当前连接
 
 public ConnBean connBean = new ConnBean();
 ProxyDB proxyDB = new ProxyDB();
 //定义list存放释放的数据库连接
 public static LinkedList<Connection> connlist = new LinkedList<Connection>();
 //构造方法,获得最大连接值,初始化多少连接数
 public Strategy(int maxConn, int initConn){
  this.maxConn = maxConn;
  this.initConn = initConn;
  //初始化连接
  init();
 }
 public Strategy(){}
 //初始化数据库连接
 public void init(){
  for(int i = 0; i < this.initConn; i++){
   connlist.addLast(createConn());
   //获得连接  
   this.freeConn++;  //增加空闲连接数      
  }
  for(int i = 0; i < this.initConn; i++){
   System.out.println(connlist.get(i));
  }
 }
 /**
  * 创建连接
  * @return 返回新创建的连接
  * @throws ClassNotFoundException
  * @throws SQLException
  */
 public Connection createConn(){
  proxyDB = new ProxyDB(new Strategy());
  Connection conn = null;
  try{
  Class.forName(connBean.getDriver());
     conn = DriverManager.getConnection(connBean.getUrl(),
    connBean.getUser(), connBean.getPassword());
  }catch(Exception e){
   e.printStackTrace();
  }
  //判断当前连接是否小于最大连接
  if(this.currentConn <= this.maxConn)
   return proxyDB.getConnInstance(conn);
  return null;
 }
 /**
  * 获得连接
  * @return 返回连接
  */
 public Connection getConn(){
  //判断空闲连接是否大于当前连接
  //System.out.println(connlist.size()  + "     "  + connBean.currentConn + "     "+connBean.freeConn);
  if(this.freeConn >= this.currentConn){
   this.freeConn--;
   this.currentConn++;
   System.out.println(connlist.size()  + "     "  + this.currentConn + "     "+this.freeConn);
   return connlist.removeFirst();
  }
  this.currentConn++;
  System.out.println(connlist.size()  + "     "  + this.currentConn + "     "+this.freeConn);
  return createConn();
 }
 
}

 

代理角色ProxyDB.java

package com.sve.proxydb;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;

public class ProxyDB implements InvocationHandler{
 
 public Connection saveConn = null; //存入数组的空闲连接
 public Connection conn = null;  //用于获得对象的连接
 public Strategy staStrategy;
 //在构造方法里获得staStrategy对象
 public ProxyDB(Strategy staStrategy){
  this.staStrategy = staStrategy;
 }
 public ProxyDB(){}
 //获得连接实例
 public Connection getConnInstance(Connection conn){
  this.conn = conn;
  saveConn = (Connection) Proxy.newProxyInstance(this.getClass().getClassLoader()
    , new Class[]{Connection.class }, this);
  return saveConn;
 }
 //处理代理的方法
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  // TODO Auto-generated method stub
  //判断是否是执行关闭命令
  if("close".equals(method.getName())){
   staStrategy.currentConn--;
   staStrategy.freeConn++;
   staStrategy.connlist.add(saveConn);  //将释放的连接放入list
   //System.out.println(staStrategy.connlist.size()  + "     "  + staStrategy.currentConn + "     "+staStrategy.freeConn);
   return null;
  }
  return method.invoke(conn, args);
 }
}

 


好了,可以测试了,(*^__^*) 嘻嘻……

Java系统访问管理器策略代理远程数据库 我们还定义了一个受保护的资源,使用正则表达式"/remote-database-url/.*"匹配所有对远程数据库的访问。最后,我们定义了一个策略规则,即只有具有"admin"角色的用户才能访问远程数据库。请确保将"remote-database-url"替换为实际的远程数据库主机名或IP地址,"port"替换为数据库端口号,"service-name"替换为数据库服务名称。如果您有任何进一步的问题,请随时提问。接下来,我们将创建一个简单的Java应用程序,该应用程序使用JSAM策略代理访问远程数据库 阅读详情

相关推荐

【Bug已解决】Context window exceeded / Token limit reached — Claude Code 上下文窗口超限解决方案

Claude Code 长会话中报上下文窗口/Token 超限,本质是对话历史、文件内容、工具结果累积超过 200K 上限。文中给出 /clear、/compact、分批读大文件、限制工具输出、配置 autoCompact 等完整方案。

一键难忘的博客 6605

preparestatement方法用多次_如何用java 5分钟实现一个最简单的mysql代理服务器?

java8基于vert.x3 快速实现一个最简单的mysql代理服务器,只需要5分钟时间。什么是mysql 代理?mysql代理是介于client端和mysql服务端中间层服务,如下图所示:这里写图片描述为什么要使用代理?大部人都知道使用代理的好处,毕竟,随着互联网越来越普及,互联网系统越来越庞大、复杂,性能要求越来越高,为了让整个系统具有更好的扩展性、更高的性能、解藕等多种特性,在数据库层面引...

weixin_39638304的博客 351

头歌educoder教学实践平台计算机组成原理运算器设计(HUST).zip

头歌educoder教学实践平台计算机组成原理运算器设计(HUST),第1关—第11关。源代码txt格式。第1关 8位可控加减法电路设计第2关 CLA182四位先行进位电路设计第3关 4位快速加法器设计第4关 16位快速加法器设计第5关 32位快速加法器设计第6关 5位无符号阵列乘法器设计第7关 6位有符号补码阵列乘法器第8关 乘法流水线设计第9关 原码一位乘法器设计第10关 补码一位乘法器设计第11关 MIPS运算器设计

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

2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在 互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者...

weixin_34007886的博客 134

待学习文章

使用JAVA中的动态代理实现数据库连接池 http://www.oschina.net/question/12_4528

wsswss1123的博客 125

java mysql proxy_JAVA 动态代理(实现自定义数据库连接池

JAVA 动态代理(实现自定义数据库连接池)环境:JDK1.8MAVENIDEA 2018.2jar包:mysql-connector-java-5.1.38实现思路:首先通过资源文件读取数据库连接必要信息(driver,url,user,password),获取数据库连接,然后通过动态代理模式阻止连接真正被关闭而是放回集(连接池)合中。Maven导包mysqlmysql-connector-ja...

weixin_32921593的博客 859

线程池实战——实现数据库连接池

面对高并发场景下数据库连接难题,通过 CountDownLatch 与等待超时模式,协调线程、避免阻塞,运用动态代理构建线程安全连接池,实现高效连接管理,为高并发下资源管理提供实用方案。

JIGUANGDI 1107

手写数据库连接池实战

外链图片转存中…(img-WcHPyIJ0-1712416220757)]

2401_84132401的博客 971

Mapper文件的动态代理实现

Mapper文件的动态代理实现

hu10131013的博客 237

Java 模拟数据库连接池 + 模拟ORM框架

模拟数据库连接池 JDBC六部曲中,获取连接的步骤是最为耗时的,最慢的;所以,数据库连接池就是为了解决这个很慢的问题 先想一下下面的问题: 一个连接Connection不能被多个用户同时共用(以防产生数据紊乱)【锁】 对于某一个连接,用户如何知道当前这个连接是否可用?【标记:给连接标记一个状态】 但是怎么把连接和标记放在一起呢? 第一个方案:创建一个类(有Connection属性和状态属性) 第二个方案:创建一个数组Connection[],在创建一个数组byte[],两者分别存放连接和状态,并且互相对应

Zhangguohao666的博客 958

简单的数据库连接示例 基于等待超时模式

描述:使用等待超时模式来构造一个简单的数据库连接池,在示例中模拟连接池中获取、使用和释放连接的过程。客户端获取连接的过程被设计成等待超时模式 1 /* 2 连接池的定义。通过构造函数初始化连接的最大上限,通过双向队列维护连接。调用方需要先调用fetchConnection(long) 3 方法来指定在多少毫秒内超时获取连接,当连接使用完时,需要调用releaseConnec...

weixin_30655219的博客 120

动态代理&模拟一个数据库连接池

数据库连接池:说白了就是在一个池子中(容器)中放了很多的数据库连接,当用户需要的时候就从中取出来一个用,用完了就放回连接池中。优点:极大的提高了数据库的效率。对于自定义的数据库连接池我们使用一个LinkedList做数据库连接池.这个集合的特点是增删快,查询慢。自定义一个数据库连接池的步骤:1.自定义一个类实现DataSource接口。2.定义一个List&lt;Connection&gt; li...

李卫康的博客 1069

JDK API动态代理模拟数据库连接池

JDK API动态代理模拟数据库连接池 实现:在MyDataSource类中,编写静态方法getConnection,使该方法能够返回一个Connection的代理对象,该代理对象对Connection的close方法进行增强,使close方法不再直接关闭数据库连接而是将数据库连接返回到MyDataSource的连接池(链表或是其他的数据结构)中。 这样,外部通过MyDataSource获取Con...

My Blog 249

数据库连接池DataSource

一:数据库连接池介绍 什么是数据库连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据

搁浅记忆的博客 6435

动态代理模拟连接池

package 动态代理实现连接池; /**  * 动态代理自定义连接池:  * 技术难题:1.增强close方法,使得close方法不在 关闭连接而是归还连接  * 解决办法:使用动态代理增强close方法  * 2.归还连接后,连接未真正关闭,那么原来指向该连接的变量con仍可以掉用该连接的方法  * 解决办法:在代理上添加标记,通过判断标记来决定原来指向该连接的con是否可以继续

xiaosadream的博客 248

JAVA动态连接数据库

JAVA动态连接数据库 数据库配置 这里配置了两个数据库default db 和 dev db 都继承了BaseDBConfig package com.springcloud.web.config.dataSource; import lombok.Getter; import lombok.Setter; @Getter @Setter public class BaseDBConfig { private String username; private String url;

qq_40260565的博客 2458

Java连接数据库的几种方式

【代码】Java连接数据库的几种方式。

myli92的博客 2849

java 根据接口的参数动态切换数据库连接

您可以使用 Java 的反射机制来实现这个功能。 首先,你需要创建一个接口,然后为该接口定义一个方法,该方法用于根据参数动态切换数据库连接。然后,你可以实现这个接口,在实现类中实现这个方法。 最后,你可以使用反射机制动态加载实现类,并调用其中的方法来实现根据参数动态切换数据库连接的功能。 例如: public interface DatabaseConnection { void switch...

weixin_35751412的博客 755

java连接数据库的5种方式

一个疑问:为什么不写`Class.forName("com.mysql.cj.jdbc.Driver");

thulium_kyg的博客 9977

数据库Java如何连接数据库JDBC(代码详解)

JDBC是一套接口(面向接口写实现类,能够解耦合,提高代码的扩展力) 因为每个数据库底层的实现原理是不同的,如果没有接口 访问不同数据库就要不同的代码

m0_57248981的博客 3696
上一篇: 说说java与.NET
下一篇: Struts2拦截器说明
lingtianweiyena
博客等级 码龄16年 35粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值