如何使MySQL前后端连接SESSION变量保持一致

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使MySQL前后端连接SESSION变量保持一致相关的知识,希望对你有一定的参考价值。

参考技术A 最近在开发MySQL代理中间件过程中, 遇到这样一个问题: 当前后端连接不是一一对应的关系时, 对前端连接设置SESSION级别的变量时, 如何能使前端后变量的值保持一致?

一个直观的实现方式是, 拦截SET语句, 判断scope是SESSION时, 将变量的值保存在前端连接中. 当执行其他查询语句时, 在获取后端连接后, 先将前端连接中保存的变量逐一发送到后端连接, 然后执行查询语句, 释放后端连接时再将变量的值恢复.

这种实现方式存在几个显著的问题.

1 存在一定的性能损耗, 至少增加了1次与后端MySQL的交互. 但是, 这也是后端连接池方案都会遇到的问题, 前后端连接绑定不存在这种问题, 但是也就失去了连接池带来的好处.

2 需要判断参数值是否合法, 实现起来非常繁琐. 例如, 如果考虑支持字符集设置, 就要枚举出MySQL支持的所有字符集及字符序类型, 解析 SET NAMES 'utf8' COLLATE 'utf8_general_ci' 时, 对字符集和字符序进行合法性判断. 对于某些参数, 例如sql_mode, 还需要考虑MySQL版本之前的差异.

在这种实现方式下, 有几个优化点可以参考.

1 批量执行SET语句. MySQL语法层面支持 SET SESSION var1 = val1, SESSION var2 = val2; , 因此不论前端连接接收到的SET语句是单条的还是批量的, 在将这些kv值发往后端时, 可以整合成一条SQL, 从而减少与MySQL的交互次数, 提高执行效率.

2 后端连接按需重置. 当归还后端连接时, 不再重置连接, 而是在下一次获取连接时, 先判断连接中的变量值与前端连接是否全部相同, 如果全部相同, 则不需要重置, 可以直接使用, 否则, 将那些值不相同的变量设置到后端连接.

3 使用 COM_RESET_CONNECTION 命令重置连接. COM_RESET_CONNECTION命令可以将连接恢复到初始状态, 具体内容可参考文档: https://dev.mysql.com/doc/refman/5.7/en/mysql-reset-connection.html . 但是, 如果连接创建时的状态不是连接的默认状态, 就不能使用这种方式重置连接. 例如, 在启动mysql client时指定的字符集不是DEFAULT, 那么执行该命令后会错误地把连接的字符集设置成DEFAULT.

最后, 如果你有更好的解决方案, 欢迎讨论交流.

前后端连接(BootStrap_MySQL_MyEclipse)

    今天学了前后台的连接。之前脑子一团浆糊,就连后端对数据库的操作都不熟。就一点点来写吧,会多少写多少,错了以后再改吧,可能进步比较慢,但肯定会慢慢好起来的。

    以前一直对数据库连接就不太懂。先从数据库连接写起。

疑问点1:之前就是不明白为什么要有一个con,而且还是Connection类型的,

   理解:你想对数据库操作,肯定的先连上数据库吧,那就得用一个变量来告诉别人,连接情况是啥,到底连没连 上,刚开始肯定是null的呀,连上了还写啥。至于Connection,还是不太清楚,可能只有这样的类型才能获取连接吧

疑问点2:Class.forName("com.mysql.jdbc.Driver");都说是加载驱动类,怎么加载的不太清楚。

   理解:Class.forName动态加载指定的JDBC驱动,由DriverManager管理。DriverManager类用来管理数据库中的所有驱动程序,是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动程序之间建立连接。(别人说的)

然后用这个con=(Connection)DriverManager.getConnection(url, user, password);就连上了呗。数据库连接就勉强过关吧,以后工作了也许会有更深的理解,暂时都能连上了,就先不考虑了。

 

 

 

然后就出现一个很大的误区,数据库里不是有张表格嘛是这样的

然后我在后台也写了个这个

 

这下好了,我一直以为我对这些类里属性操作的就是对后台操作,(我可能是个傻子)

 

UserDao里是这样(我一直不明白为什么加个这个玩意,别人说是为了简单方便,我先这么理解吧)

package com.user.dao;

import java.util.List;
import com.user.entity.User;

public interface UserDao {
 public boolean isExist(String username,String password);//判断用户名和密码是否正确
 public boolean add(User user);
 public List<User> selectAll();
 public boolean delete(int uid);
 public User selectByUid(int uid);
 public boolean update (User user);
 //List<User> list=udi.mohuselect(namecondition);
 public List<User> mohunameselect(String namecondition);
 public List<User> mohuageselect(int minage,int maxage);
 public List<User> mohuadressselect(String adresscondition);
 public List<User> mohusexselect(String sexcondition);
}

UserDaoImp类是这样

DBCon db=new DBCon();
 //4个数据库连接对象
 Connection con=null;
 Statement stmt=null;//为了发送Sql语句
 PreparedStatement pstmt=null;//???
 ResultSet rs=null;//存放集合
 public void close()//这个方法跟理解没啥关系,就是为了关闭偷懒
 {
  try {
   if(rs!=null){
    rs.close();
   }
   if(pstmt!=null){
    pstmt.close();
   }
   if(stmt!=null){
    stmt.close();
   }
   if(con!=null){
    con.close();
   }
   
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 @Override
 public boolean isExist(String username, String password) {
  System.out.println("正在执行DAO中isExist方法");
  Boolean flag=false;
  try {
   con=db.getCon();
   if(con==null)
   {
    System.out.println("DAO中selectByName方法连接失败");
    return flag;
   }
   String sql="select * from tb_users where username=? AND password=?";//写了sql语句
   pstmt=(PreparedStatement) con.prepareStatement(sql);//???
   pstmt.setString(1, username);
   pstmt.setString(2, password);
   rs=pstmt.executeQuery();//这才是正八经将语句发给了mysql
   if(rs.next())//开始找有没有符合的
   {
    flag=true;
   }else{
    System.out.println("不能找到该人");
   }
   this.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return flag;
 }

//困了,睡觉,不明白的是找是找到了,找到了,没点显示吗?在flag=ture那写个    System.out.println("找到该人");???我自己看到了有啥用,我想给页面跳到别的页面才行啊,嗯,明天再写写。

 

以上是关于如何使MySQL前后端连接SESSION变量保持一致的主要内容,如果未能解决你的问题,请参考以下文章

Aspnet Mvc 前后端分离项目手记关于token认证

Session与Token认证机制 前后端分离下如何登录 #yyds干货盘点#

怎样保持http连接

前后端分离的项目如何实现登录状态的保持。

前后端连接(BootStrap_MySQL_MyEclipse)

如何正确的安装和连接MySQL服务