Jedis的连接是非线程安全的

下面是set命令的执行过程,简单分为两个过程,客户端向服务端发送数据,服务端向客户端返回数据,从下面的代码来看:从建立连接到执行命令是没有进行任何并发同步的控制

  1. public String set(final String key, String value) {
  2. checkIsInMulti();
  3. // 执行set命令,其实是发送set命令和其参数到server端,实际是调用下面的SendCommond(…)方法,发送数据
  4. client.set(key, value);
  5. // 等待服务器响应
  6. return client.getStatusCodeReply();
  7. }

set 命令的数据发送过程

  1. public static void sendCommand(final RedisOutputStream os, final Command command,
  2. final byte[]... args) {
  3. sendCommand(os, command.raw, args);
  4. }
  5. private static void sendCommand(final RedisOutputStream os, final byte[] command,
  6. final byte[]... args) {
  7. try {
  8. os.write(ASTERISK_BYTE);
  9. os.writeIntCrLf(args.length + 1);
  10. os.write(DOLLAR_BYTE);
  11. os.writeIntCrLf(command.length);
  12. os.write(command);
  13. os.writeCrLf();
  14. for (final byte[] arg : args) {
  15. os.write(DOLLAR_BYTE);
  16. os.writeIntCrLf(arg.length);
  17. os.write(arg);
  18. os.writeCrLf();
  19. }
  20. } catch (IOException e) {
  21. throw new JedisConnectionException(e);
  22. }
  23. }

set命令接收服务端响应过程

  1. private static Object process(final RedisInputStream is) {
  2. final byte b = is.readByte();
  3. if (b == PLUS_BYTE) {
  4. return processStatusCodeReply(is);
  5. } else if (b == DOLLAR_BYTE) {
  6. return processBulkReply(is);
  7. } else if (b == ASTERISK_BYTE) {
  8. return processMultiBulkReply(is);
  9. } else if (b == COLON_BYTE) {
  10. return processInteger(is);
  11. } else if (b == MINUS_BYTE) {
  12. processError(is);
  13. return null;
  14. } else {
  15. throw new JedisConnectionException("Unknown reply: " + (char) b);
  16. }
  17. }

JedisPool是线程安全的

Jedis客户端支持多线程下并发执行时通过JedisPool实现的,借助于commong-pool2实现线程池,它会为每一个请求分配一个Jedis连接,在请求范围内使用完毕后记得归还连接到连接池中,所以在实际运用中,注意不要把一个Jedis实例在多个线程下并发使用,用完后要记得归还到连接池中

MySQL的连接是线程安全的

在一些简单情况下,我是不用DataSource的,一般都会采用单例的方式建立MySQL的连接,刚开始我也不晓得这样写,看别人这样写也就跟着这样写了,突然有一天我怀疑这样的写发是否可选,一个MySQL的Connection是否在多个线程下并发操作是否安全。

在JDK中定义java.sql.Connection只是一个接口,也并没有写明它的线程安全问题。查阅资料得知,它的线程安全性由对应的驱动实现:

java.sql.Connection is an interface. So, it all depends on the driver's implementation, but in general you should avoid sharing the same connection between different threads and use connection pools. Also it is also advised to have number of connections in the pool higher than number of worker threads.

这是MySQL的驱动实现,可以看到它在执行时,是采用排它锁来保证连接的在并发环境下的同步。

  1. public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
  2. // 在使用连接过程中是采用排它锁的方式
  3. synchronized(this.getConnectionMutex()) {
  4. this.checkClosed();
  5. Object pStmt = null;
  6. boolean canServerPrepare = true;
  7. String nativeSql = this.getProcessEscapeCodesForPrepStmts()?this.nativeSQL(sql):sql;
  8. if(this.useServerPreparedStmts && this.getEmulateUnsupportedPstmts()) {
  9. canServerPrepare = this.canHandleAsServerPreparedStatement(nativeSql);
  10. }
  11. ...
  12. ...

一般情况下,为了提高并发性,建议使用池技术来解决单链接的局限性,比如常用的一些数据源:C3P0等

Jedis 与 MySQL的连接线程安全问题的更多相关文章

  1. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  2. 关于MySQL用户会话及连接线程

    0.概念理解:用户会话和连接线程是什么关系? 用户会话和用户连接线程是一一对应的关系,一个会话就一个用户连接线程. 问题描述: 如果系统因为执行了一个非常大的dml或者ddl操作导致系统hang住,我 ...

  3. mysql交互式连接&非交互式连接

    交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议. 非交互式操作:就是你在你的项目中进行程序调用.比如一边是tom ...

  4. Mysql的连接状态

    对应mysql的连接,任何时刻都有一个状态.表示mysql当前正在做什么. command里面的状态: sleep:线程正在等待客户发送新的请求. query:正在执行查询或者正在将结果发送客户端 这 ...

  5. PAIP.MYSQL SLEEP 连接太多解决

    PAIP.MYSQL SLEEP 连接太多解决 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.n ...

  6. javaweb回顾第六篇谈一谈Servlet线程安全问题

    前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题. 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例 ...

  7. MySQL服务器的线程数查看方法

    mysql重启命令:/etc/init.d/mysql restart MySQL服务器的线程数需要在一个合理的范围之内,这样才能保证MySQL服务器健康平稳地运行.Threads_created表示 ...

  8. MySQL MySql连接数与线程池

    MySql连接数与线程池 by:授客 QQ:1033553122 连接数 1.  查看允许的最大并发连接数 SHOW VARIABLES LIKE 'max_connections'; 2.  修改最 ...

  9. 谈谈MySQL无法连接的原因和分析方法

    [可能的原因] MySQL无法连接的原因有很多,比如: 1.数据库的请求量突增,实例连接数超过max_connections,或用户连接数超过max_user_connections, 这种情况连接时 ...

随机推荐

  1. idea操作 clone项目、 import项目所有注解全部报错

    操作:从现有的git上边clone项目,前提是开发工具,开发环境都一样错误类型:所有的注解全部报错 原因: 是选择了Create from existing source 一路Next下去,Maven ...

  2. platform平台总线

    一.何为平台总线 (1)相对于usb.pci.i2c等物理总线来说,platform总线是虚拟的.抽象出来的.(2)CPU与外部通信的2种方式:地址总线式连接和专用协议类接口式连接.平台总线,是扩展到 ...

  3. 学习笔记 - Ford-Fulkerson & EK

    Ford-Fulkerson & EK - 学习笔记 之前网络流什么的快忘完了 老师讲课的时候一脸懵逼--开始系统复习,从最大流开始 标签:网络流-最大流 『预备』 首先复习了网络流的概念-- ...

  4. 10.安装使用jenkins及其插件

    持续集成 1.安装jenkins 安装依赖 [root@git ~]# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel rpm包下载: ...

  5. 用jQuery实现(全选、反选、全不选功能)

    在jQuery选择器的基础下我们实现一个全选,反选,全不选功能! <script type="text/javascript">        $(function ( ...

  6. Windows 安装 MongoDB 并开启认证

    下载 可以自行上官网找需要的版本,Windows系统各个64位版本下载地址: http://dl.mongodb.org/dl/win32/x86_64 安装 正常的软件安装流程,这里就不细讲了. 配 ...

  7. jquery输入框动态查询l<li></li>列表

    1.html代码如下: 2.js代码如下: $('#search').bind('input propertychange', function () { searchKpoint(); }); fu ...

  8. 移动端网站通用模板 单位rem

    html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...

  9. python反射怎么用

    反射: 通过字符串的形式对 对象 进行增删改查 setattr 设置某个属性的值 class A(object): def __init__(self): self.name = "sath ...

  10. delphi 2010以上 安装 第三方控件

    delphi-“can't be installed because it is not a design time package. 一定要先装 dcl*.dpk ----------------- ...