首页 > 编程知识 正文

navicat for MySQL,nginx代理mysql

时间:2023-05-06 02:19:42 阅读:152574 作者:2694

1. MySql代理后端开发人员不可避免地与数据库进行交互。 MySQL是目前非常流行的关系数据库。

假设您有一个现有的SQL语句执行器。 支持两种操作:查询和写入。

公共接口SQL executor {//读取操作objectquery(stringSQL ); //写入操作intupdate(stringSQL ); } publicclassmysqlexecutorimplementssqlexecutor { @ overridepublicobjectquery (string SQL )//查询DB.return new Object; } @ overridepublicintupdate (string SQL ) ) DB.return 1; 存在一种新的需求,需要将在SqlExecutor中执行的SQL语句输出到控制台进行调试。

怎么办? 是否直接修改MySqlExecutor? 这不符合开闭原则。

正确的方法是创建完成SQL语句输出的代理类LogProxy。

publicclasslogproxyimplementssqlexecutor { privatesqlexecutortarget; publiclogproxy (sqlexecutorexecutor ) {this.target=executor; } @ overridepublicobjectquery (string SQL ) {System.out.println ) (询问SQL: ) SQL ); returntarget.query(SQL; } @ overridepublicintupdate (string SQL ) {System.out.println ) (修改SQL: ) SQL ); returntarget.update(SQL; 如果存在重复的SQL查询,则出现了一种新的需求,即可以缓存查询结果,并在下次运行查询时直接从缓存中检索结果。

还要更改SqlExecutor的源代码吗? 别忘了那不符合开关原则。 用代理人对手增强就行了。

publicclasscacheproxyimplementssqlexecutor { privatemapstring,object cache=newconcurrenthashmap (; 私有SQL执行目标; publiccacheproxy (sqlexecutorexecutor ) {this.target=executor; } @ overridepublicobjectquery (string SQL ) if ) cache.contains key (SQL ) ) {System.out.println ) '命中缓存.); returncache.get(SQL; }Objectresult=target.query(SQL ); cache.put(SQL,result ); 返回结果; } @ overridepublicintupdate (string SQL ) {System.out.println )“缓存无效. '”cache.clear (; returntarget.update(SQL; }客户端呼叫:

public class client { publicstaticvoidmain (string [ ] args )//支持日志SQLexecutorlog=newlogproxy ) newMySQLexecutor; //缓存SQLexecutorcache支持=newcacheproxy (newmysqlexecutor (); //缓存日志sqlexecutorlogandcache=newcacheproxy (new log proxy ) NewMySQLexecutor () ); Logan dcache.query (' select * fromuserwhereid=1); Logan dcache.query (' select * fromuserwhereid=1); Logan dcache.update (update userset name=' admin ' where id=1); }输出:查询SQL : select * fromuserwhereid=1缓存命中.缓存无效. SQL :更新用户集name=' admin ' where id=1这是预配置

2 .代理模式的定义向其他对象提供代理并控制对该对象的访问。

代理模式通用类图Subject :主题抽象,RealSubject和Proxy负责实现。 RealSubject :也是具体的主题、业务的真正执行者、被代理对象。 roxy :负责扩展real subject的代理类。 原逻辑使realsubject执行。 一个代理类具体代理哪个对象,由场景类决定,一般通过构造函数指定被代理对象。

3 .代理模式的优点职责非常明确,被代理人只负责自己的业务逻辑,不关心和非本职责的事情都交给代理类,符合单一职责原则。 可扩展性非常好,只需创建一个代理类即可增强功能,代理对象还可以代理另一个代理对象以实现扩展传递。 为了增强功能,代理具有比继承更好的灵活性。 想扩展类的功能,但其功能的一部分不在该类自身的作用范围内时,可以通过制作代理类来进行。

4. JDK动态代理上述示例是典型的代理实现,需要开发人员创建代理类,实现由代理类实现的接口,重写所有方法,然后将方法的执行转发给被代理对象

JDK支持动态代理,可以使用Proxy和InvocationHandler动态生成代理对象的代理对象。 这个非常方便。

Subject和RealSubject

publicinterfacesubject { void request (; } publicclassrealsubjectimplementssubject { @ overridepublicvoidrequest () system.out.println ) realsubjectrequest . rest

publicclasssubjectproxyimplementsinvocationhandler { privatesubjecttarget; publicsubjectproxy (subject target ) {this.target=target; }public Subject getProxy () return (subject ) proxy.newproxyinstance (this.getclass ).getClassLoader ), newClasss ) ),new },@ overridepublicobjectinvoke (object proxy,Method method,Object[] args ) throwsthrowable ) bed object result=method.invoke (target,args ); after (; 返回结果; }private void before () {System.out.println ) (“前置增强”); }private void after () {System.out.println ) )后置增强); }客户端呼叫:

公共类客户端(publicstaticvoidmain (string [ ] args ) subjectproxy=newsubjectproxy ) newrealsubject ) ).getproxt )输出:前置扩展RealSubject request .后置扩展5 .总结代理模式的应用非常广泛,最典型的例子就是Spring的AOP技术。 它可以在不修改源代码的情况下对系统进行功能的扩展,基础是通过生成代理对象来完成。 如果在调试时发现代理类的类名为$Proxy0,则表示它是代理对象

总之,需要强化类,但如果强化后的功能不属于类本身的作用范畴,可以考虑使用代理模型来实现。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。