精华内容
下载资源
问答
  • Spring多线程支持

    万次阅读 多人点赞 2017-07-24 16:17:52
    JDK给我们提供了非常方便的操作线程的API,JDK5之后更是新增了JUC包的支持,并发编程大师Doug Lea(JDK并发的作者)也是一直在为我们使用线程做着不懈的努力。 为什么还要使用Spring来实现多线程呢?这是句废话!...

    在我们的应用系统中,经常会处理一些耗时任务,自然而然的会想到使用多线程。JDK给我们提供了非常方便的操作线程的API,JDK5之后更是新增了JUC包的支持,并发编程大师Doug Lea(JDK并发的作者)也是一直在为我们使用线程做着不懈的努力。

    为什么还要使用Spring来实现多线程呢?这是句废话!实际有两个原因,第一使用Spring比使用JDK原生的并发API更简单。第二我们的应用环境一般都会集成Spring,我们的Bean也都交给Spring来进行管理,那么使用Spring来实现多线程更加简单,更加优雅。(更多的可能是在环境中就要这么用!!)

    在Spring3之后,Spring引入了对多线程的支持,如果你使用的版本在3.1以前,应该还是需要通过传统的方式来实现多线程的。从Spring3同时也是新增了Java的配置方式,而且Java配置方式也逐渐成为主流的Spring的配置方式,因此后面的例子都是以Java的配置进行演示。

    废话有点多,下面具体说说该如何在Spring中实现多线程,其实非常简单,只需要在配置类中添加@EnableAsync就可以使用多线程。在希望执行的并发方法中使用@Async就可以定义一个线程任务。通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线程池。下面举个例子来说明

    首先定义配置类

    如果对Java配置方式不了解的童鞋,可以参考这篇文章《初识SpringJava配置》

    package com.hy.spring.test7;
    
    import java.util.concurrent.Executor;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    @Configuration
    @ComponentScan("com.hy.spring.test7")
    @EnableAsync  // 启用异步任务
    public class ThreadConfig  {
    
         // 这里是声明一个bean,类似于xml中的<bean>标签。
         // Executor 就是一个线程池
         @Bean
         public Executor getExecutor() {
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
              executor.setCorePoolSize(5);
              executor.setMaxPoolSize(10);
              executor.setQueueCapacity(25);
              executor.initialize();
              return executor;
         }
    }

    定义要执行的任务

    package com.hy.spring.test7;
    
    import java.util.Random;
    import java.util.UUID;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;
    
    @Service // 注解的方式把AsyncService交给Spring来管理
    public class AsynTaskService {
    
         // 这里可以注入spring中管理的其他bean,这也是使用spring来实现多线程的一大优势
         
         @Async    // 这里进行标注为异步任务,在执行此方法的时候,会单独开启线程来执行
         public void f1() {
              System.out.println("f1 : " + Thread.currentThread().getName() + "   " + UUID.randomUUID().toString());
              try {
                  Thread.sleep(new Random().nextInt(100));
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
         }
    
         @Async
         public void f2() {
              System.out.println("f2 : " + Thread.currentThread().getName() + "   " + UUID.randomUUID().toString());
              try {
                  Thread.sleep(100);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
         }
    }

    测试类

    package com.hy.spring.test7;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
         public static void main(String[] args) {
              AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ThreadConfig.class);
              AsynTaskService service = context.getBean(AsynTaskService.class);
    
              for (int i = 0; i < 10; i++) {
                  service.f1(); // 执行异步任务
                  service.f2();
              }
              context.close();
         }
    }

    输出结果

    f1 : ThreadPoolTaskExecutor-5   20e6ba88-ae51-42b9-aac6-ed399419fe6d

    f2 : ThreadPoolTaskExecutor-2   0d7b1da4-e045-4d58-9054-e793f931cae1

    f2 : ThreadPoolTaskExecutor-4   17b8d7c7-24e3-4bcf-b4da-822650a8f0be

    f1 : ThreadPoolTaskExecutor-3   a9b32322-1c9b-4fc7-9c2a-1f7a81f2b089

    f1 : ThreadPoolTaskExecutor-1   13a85fde-73c7-4c9b-9bb2-92405d1d3ac4

    f2 : ThreadPoolTaskExecutor-3   8896caaf-381c-4fc3-ab0f-a42fcc25e5fd

     

    可以看到我们两个任务是异步进行的。

     

    下面关于线程池的配置还有一种方式,就是直接实现AsyncConfigurer接口,重写getAsyncExecutor方法即可,代码如下

     

    package com.hy.spring.test7;
    
    import java.util.concurrent.Executor;
    
    import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    @Configuration
    @ComponentScan("com.hy.spring.test7")
    @EnableAsync
    public class ThreadConfig implements AsyncConfigurer {
    
         @Override
         public Executor getAsyncExecutor() {
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
              executor.setCorePoolSize(5);
              executor.setMaxPoolSize(10);
              executor.setQueueCapacity(25);
              executor.initialize();
              return executor;
         }
    
         @Override
         public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
              return null;
         }
    
    }

    使用Spring实现多线程是不是非常简单。

     

    展开全文
  • Springmvc实现jsonp的支持

    千次阅读 2018-10-01 23:32:28
    我们资源的访问都是通过url,即域名+各种 参数。 当域名,端口号,协议不同时,即为跨域。 这种情况下就要使用jsonp来进行跨域请求。 jsonp的原理是利用src能跨域请求资源的特性来实现的,细心的...

    跨域问题

    提到jsonp首先就要提一下跨域。因为只有遇到跨域问题才会使用jsonp。

    现在的项目一般都是分布式项目,既然是分布式项目肯定就会涉及到跨域请求资源的问题,那么什么是跨域。

    我们对资源的访问都是通过url,即域名+各种 参数。

    当域名,端口号,协议不同时,即为跨域。

    这种情况下就要使用jsonp来进行跨域请求。

    jsonp的原理是利用src能跨域请求资源的特性来实现的,细心的人能够发现,我们在用src引入网络上的而非本地文件的jquery.js时能够正常引入和使用,而网络上的jquery资源域名,端口号,协议和我们的项目都不同,也就是跨域,但是能正常使用,也就证明了src可以跨域请求资源。

    ajax使用jsonp标识了dataType后就是告诉jquery要使用跨域请了,赶紧准备好callback函数,即在Ajax请求的地址后面加上:?callback=xxx,

    例如:http://localhost:8080/xxx/xx?callback=xxx

    那么后台在拿到请求后需要根据请求参数中是否有callback参数,来判断返回值是否要包裹callback函数。

    如何使用Jsonp?

    jquery的ajax可以很方便的使用jsonp,只需要在dataType上标识为jsonp即可。

    $.ajax({
              type : "post",
              url: "http://localhost:8080/xxx/xxx/xxx",
              data:data,
              dataType : "jsonp",//数据类型为jsonp   
              jsonpCallback:"callback",
              success : function(data){
               
              },
              error:function(){
              }
          }); 
    

    后台controller

    @RequestMapping(value="getResult",method=RequestMethod.GET)
    	public ResponseEntity<String> getResult(int limit,int offset,String search,HttpServletRequest request){
    		try {
    			EasyUIResult result=userService.queryAllUsers(limit,offset+1,search);
    			String callback=request.getParameter("callback");
    			
    			if("".equals(callback)){
    				return ResponseEntity.status(HttpStatus.OK).body(result.toString());
    			}else{
                            //包裹callback函数,给js解析。
    			return ResponseEntity.ok(callback+"("+result+")");
    			}
    			
    			
    		} catch (Exception e) {
    			
    			e.printStackTrace();
    		}
    		return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    	}

    但是我们发现如果一个项目中跨域请求太多,那么后端需要在controller层中给每个jsonp请求进行callback函数包裹。显然太麻烦。我们可以给spring扩展一下,使其统一支持jsonp。

    编写一个类继承自spring的MappingJackson2HttpMessageConverter类,

    package cn.itcast.usermanage.util;
    
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.http.HttpOutputMessage;
    import org.springframework.http.converter.HttpMessageNotWritableException;
    import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import com.fasterxml.jackson.core.JsonEncoding;
    import com.fasterxml.jackson.core.JsonProcessingException;
    
    public class CallBackMappingJackson2HttpMessageConvert extends MappingJackson2HttpMessageConverter {
    	//做jsonP统一支持标识
    	private String callbackName;
    	@Override
    	protected void writeInternal(Object object, HttpOutputMessage outputMessage)
    			throws IOException, HttpMessageNotWritableException {
    		HttpServletRequest request=((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
    		String callbackParam=request.getParameter(callbackName);
    		if(StringUtils.isEmpty(callbackParam)){
    			super.writeInternal(object, outputMessage);//调用父类方法直接返回。
    		}else{
    			JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
    			try {
    				String result =callbackParam+"("+super.getObjectMapper().writeValueAsString(object)+");";
    				IOUtils.write(result, outputMessage.getBody(),encoding.getJavaName());
    			}
    			catch (JsonProcessingException ex) {
    				throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
    			}
    		}
    		
    		super.writeInternal(object, outputMessage);
    	}
    	
    }

    使用该扩展类,在springmvc.xml里配置刚刚写的消息转化器。

    <!-- 注解驱动,升级版的默认配置,不配置此项,springmvc也会自动加载相关默认配置,但是都是废弃的不建议使用的 -->
    	<mvc:annotation-driven>
    		<mvc:message-converters>
    			<bean class="cn.itcast.usermanage.util.CallBackMappingJackson2HttpMessageConvert">
    				<property name="callbackName" value="callback"></property>
    			</bean>
    		</mvc:message-converters>
    	</mvc:annotation-driven>

    然后controller层就可以修改成原来返回json的形式,不需要在controller里判断是否请求里是否含有callback参数,因为配置完成后spring会自动处理。

    展开全文
  • GCC四精度浮点型的支持

    万次阅读 2012-09-02 20:04:07
    既然有了__float128类型,就要提供这种类型的输入输出的支持。GCC扩展了C语言的标准,增加了以Q结尾的__float128类型的数值常量。比如下面的例子: __float128 a = 1.23456789012345Q; 还提供了两个函数...

    C语言标准中只提供了float型和double 型两种浮点类型。但是有些情况下,我们需要比double 型更大数据范围或更多的有效位数,为此,GCC 为我们提供了__float128型浮点类型。这种扩展类型可以表示的数据范围非常大,大约为-10e4932到10e4932,可以表示的最接近0的数大约为3.36*e-4932,可以表示的10进制有效位大约为33位。比起double 类型,无论是数据范围还是精度都有了一个极大的提升。当然,由于现在日常使用的计算机的CPU的浮点处理器不能直接对__float128进行运算,所以即使是两个简单的__float128型变量相加运算都要耗费CPU的相当多条指令来完成。因此程序中使用__float128 型后运算速度会降低很多。


    除了对__float128数据类型的支持之外,GCC还提供一个GCC Quad-PrecisionMath Library(简称为quadmath),里面提供了基本数学函数库中相应函数的__float128型的版本。


    下面简单的讲讲如何在程序中使用__float128数据和quadmath库。


    首先,__float128 型和各种相关的函数声明在了 quadmath.h 中。因此,如果要在C程序中使用__float128 型浮点数就要包含这个头文件。相应的处理函数打包在了 libquadmath.o 中,为此,在最后链接(link)阶段要包括这个库文件,也就是加入链接命令行参数 -lquadmath。


    除了 __float128 型,还有 __complex128 型,它是complex 型向4精度浮点型的升级。


    基本输入输出

    既然有了__float128类型,就要提供对这种类型的输入输出的支持。GCC扩展了C语言的标准,增加了以Q结尾的__float128类型的数值常量。比如下面的例子:


    __float128 a = 1.23456789012345Q;

    还提供了两个函数以支持__float128类型与字符串间的转换:

    __float128 strtoflt128 (const char *s, char **sp)
    int quadmath_snprintf (char *str, size_t size, const char *format, ...)

    strtoflt128 函数是 strtod 函数的__float128类型版本,参数类型与strtod 函数完全一样,只不过返回值是__float128类型。

    quadmath_snprintf 函数是snprintf的__float128类型版本。通过在传统的解析字符串中增加了字符Q来表示__float128类型,比如“%f”表示的读取一个浮点数,“%Qf”则是读取一个__float128类型的数据。除了“%Qf”之外,还可以用“%QF”、“%Qe”、“%QE”、“%Qg”、“%QG”。

    Quadmath 库中包含的数学函数如下,基本上就是对应的double 类型的函数的函数名后加了后缀q。因此,每个函数的含义就不一一解释了。

    __float128 acosq (__float128)
     __float128 acoshq (__float128)
     __float128 asinq (__float128)
     __float128 asinhq (__float128)
     __float128 atanq (__float128)
     __float128 atanhq (__float128)
     __float128 atan2q (__float128, __float128)
     __float128 cbrtq (__float128)
     __float128 ceilq (__float128)
     __float128 copysignq (__float128, __float128)
     __float128 coshq (__float128)
     __float128 cosq (__float128)
     __float128 erfq (__float128)
     __float128 erfcq (__float128)
     __float128 expq (__float128)
     __float128 expm1q (__float128)
     __float128 fabsq (__float128)
     __float128 fdimq (__float128, __float128)
     int finiteq (__float128)
     __float128 floorq (__float128)
     __float128 fmaq (__float128, __float128, __float128)
     __float128 fmaxq (__float128, __float128)
     __float128 fminq (__float128, __float128)
     __float128 fmodq (__float128, __float128)
     __float128 frexpq (__float128, int *)
     __float128 hypotq (__float128, __float128)
     int isinfq (__float128)
     int ilogbq (__float128)
     int isnanq (__float128)
     __float128 j0q (__float128)
     __float128 j1q (__float128)
     __float128 jnq (int, __float128)
     __float128 ldexpq (__float128, int)
     __float128 lgammaq (__float128)
     long long int llrintq (__float128)
     long long int llroundq (__float128)
     __float128 logq (__float128)
     __float128 log10q (__float128)
     __float128 log2q (__float128)
     __float128 log1pq (__float128)
     long int lrintq (__float128)
     long int lroundq (__float128)
     __float128 modfq (__float128, __float128 *)
     __float128 nanq (const char *)
     __float128 nearbyintq (__float128)
     __float128 nextafterq (__float128, __float128)
     __float128 powq (__float128, __float128)
     __float128 remainderq (__float128, __float128)
     __float128 remquoq (__float128, __float128, int *)
     __float128 rintq (__float128)
     __float128 roundq (__float128)
     __float128 scalblnq (__float128, long int)
     __float128 scalbnq (__float128, int)
     int signbitq (__float128)
     void sincosq (__float128, __float128 *, __float128 *)
     __float128 sinhq (__float128)
     __float128 sinq (__float128)
     __float128 sqrtq (__float128)
     __float128 tanq (__float128)
     __float128 tanhq (__float128)
     __float128 tgammaq (__float128)
     __float128 truncq (__float128)
     __float128 y0q (__float128)
     __float128 y1q (__float128)
     __float128 ynq (int, __float128)
    
    
    /* Prototypes for complex functions */
     __float128 cabsq (__complex128)
     __float128 cargq (__complex128)
     __float128 cimagq (__complex128)
     __float128 crealq (__complex128)
     __complex128 cacosq (__complex128)
     __complex128 cacoshq (__complex128)
     __complex128 casinq (__complex128)
     __complex128 casinhq (__complex128)
     __complex128 catanq (__complex128)
     __complex128 catanhq (__complex128)
     __complex128 ccosq (__complex128)
     __complex128 ccoshq (__complex128)
     __complex128 cexpq (__complex128)
     __complex128 cexpiq (__float128)
     __complex128 clogq (__complex128)
     __complex128 clog10q (__complex128)
     __complex128 conjq (__complex128)
     __complex128 cpowq (__complex128, __complex128)
     __complex128 cprojq (__complex128)
     __complex128 csinq (__complex128)
     __complex128 csinhq (__complex128)
     __complex128 csqrtq (__complex128)
     __complex128 ctanq (__complex128)
     __complex128 ctanhq (__complex128) 
    下面举一个简单的例子:
    #include <stdio.h>
    #include <stdlib.h>
    #include <quadmath.h>
    int main(void)
    {
        __float128 r1;
        __float128 r2;
        __float128 r3;
    
        char buf[64];
        char *pEnd = buf;
        r1 = strtoflt128 ("1.234567890123456789   9.876543210987654321e5", &pEnd);
        r2 = strtoflt128 (pEnd, NULL);
    
        quadmath_snprintf (buf, sizeof buf, "%+-#*.20Qf", 64, r1);
        puts(buf);
        quadmath_snprintf (buf, sizeof buf, "%+-#*.20Qe", 64, r2);
        puts(buf);
    
        r3 = hypotq (r1, r2);
        quadmath_snprintf (buf, sizeof buf, "%.30Qe", 64, r3);
        puts(buf);
        return 0;
    }
    


    输出的结果为:

    +1.23456789012345678900

    +9.87654321098765432100e+05

    9.876543210995370370242956091483e+05

     

    结果是否准确,我们可以用 maxima 来验算一下:

    fpprec:35$

    r1:bfloat(1.234567890123456789b0)$

    r2:bfloat(9.876543210987654321b05)$

    r3:sqrt(r1*r1+r2*r2);

    (%o4) 9.8765432109953703702429560914832608b5

     

    小数点后30位全都是正确的。说明quadmath 库的计算精度还是相当不错的,至少hypotq函数的精度相当高。

    __float128型浮点不是C语言标准类型,因此这里的介绍只对GCC编译器成立。另外,我使用的gcc的版本信息如下:

    COLLECT_GCC=gcc

    COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/lto-wrapper.exe

    mingw32

    ../gcc-4.6.1/configure--enable-languages=c,c++,fortran,objc,obj-c++ --disable-sjlj-exceptions--with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry--enable-libstdcxx-debug --enable-version-specific-runtime-libs --build=mingw32--prefix=/mingw

    win32

    gcc 4.6.1 (GCC)

     

    其他版本的GCC 运行的结果不一定与这里相同。

    如果需要更高的计算精度,就要考虑一些专用的多精度数值计算库了,比如大名鼎鼎的GMP。




    展开全文
  • mysql/Java服务端emoji的支持

    万次阅读 2014-12-26 14:09:40
    最近开发的iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题。困扰了数日,在就要绝望放弃的边缘,终于完成了转换和迁移。在此特别分析和整理,方便更多人。   问题描述...

    前言:

    最近开发的iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题。困扰了数日,在就要绝望放弃的边缘,终于完成了转换和迁移。在此特别分析和整理,方便更多人。

     

    问题描述:

    如果UTF8字符集且是Java服务器的话,当存储含有emoji表情时,会抛出类似如下异常:

    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1  
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)  
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)  
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)  
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)  
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)  
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)  
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)  
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)

    这就是字符集不支持的异常。因为UTF-8编码有可能是两个、三个、四个字节,其中Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以导致了数据插不进去。

    升级前需要考虑的问题:

    如果你的项目要进行移动产品的用户文本的存储,将你的DB字符集从UTF8/GBK等传统字符集升级到utf8mb4将是势在必行。你可以通过应用层面转换emoji等特殊字符,以达到原DB的兼容,我认为可行,但是你可能走了弯路。

    utf8mb4作为utf8的super set,完全向下兼容,所以不用担心字符的兼容性问题。切换中需要顾虑的主要影响是mysql需要重新启动(虽然mysql官方文档说可以动态修改配置,但是经过数次测试,还是需要重启才可生效),对于业务可用率的影响是需要考虑的大问题,这里就暂时不展开讨论了。

    升级步骤:

    1.utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。

    mysql版本查看命令请看:查看mysql版本的四种方法;mysql安装步骤请看:Linux中升级Mysql到Mysql最新版本的方法
    2.修改database、table和column字符集。参考以下语句:
    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    3.修改mysql配置文件my.cnf(windows为my.ini)

    my.cnf一般在etc/mysql/my.cnf位置。找到后请在以下三部分里添加如下内容:

    [client]
    default-character-set = utf8mb4

    [mysql]
    default-character-set = utf8mb4

    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    init_connect='SET NAMES utf8mb4'

    4.重启 MySQL Server、检查字符集

    1.)重启命令参考:/etc/init.d/mysql restart

    2.)输入命令:mysql,进入mysql命令行(如果提示没权限,可以尝试输入mysql -uroot -p你的密码)

    3.)在mysql命令行中输入:SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

    检查是否如下:

    +--------------------------+--------------------+
    | Variable_name            | Value              |
    +--------------------------+--------------------+
    | character_set_client    | utf8mb4            |
    | character_set_connection | utf8mb4            |
    | character_set_database  | utf8mb4            |
    | character_set_filesystem | binary            |
    | character_set_results    | utf8mb4            |
    | character_set_server    | utf8mb4            |
    | character_set_system    | utf8              |
    | collation_connection    | utf8mb4_unicode_ci |
    | collation_database      | utf8mb4_unicode_ci |
    | collation_server        | utf8mb4_unicode_ci |
    +--------------------------+--------------------+
    rows in set (0.00 sec)

    特别说明下:collation_connection/collation_database/collation_server如果是utf8mb4_general_ci,没有关系。但必须保证character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server为utf8mb4。关于这些字符集配置是干什么用的,有什么区别,请参考:深入Mysql字符集设置

    5.如果你用的是java服务器,升级或确保你的mysql connector版本高于5.1.13,否则仍然无法使用utf8mb4
    这是mysql官方release note,大家可以查看说明,并下载最新的mysql connector for java的jar包。
    这里为大家提供一个:mysql-connector-java-5.1.31-bin.jar
    同时记得修改pom配置哦~

    6.检查你服务端的db配置文件:

     

    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
    jdbc.username=root
    jdbc.password=password

     

    特别说明其中的jdbc.url配置:如果你已经升级好了mysql-connector,其中的characterEncoding=utf8可以被自动被识别为utf8mb4(当然也兼容原来的utf8),而autoReconnect配置我强烈建议配上,我之前就是忽略了这个属性,导致因为缓存缘故,没有读取到DB最新配置,导致一直无法使用utf8mb4字符集,多么痛的领悟!!

    感谢这位仁兄的分享,顺利的帮助我解决了问题,但是我直接拿maven下载的驱动5.1.31还是不好用,后来修改成5.1.13后就没有问题了。


    转自:http://segmentfault.com/blog/ilikewhite/1190000000616820

    展开全文
  • linux内核网卡驱动多队列的支持

    万次阅读 2010-02-09 21:11:00
    linux的招牌就是它强大的网络功能,稳定,高效,能随着现实的日新月异而日趋完善。众所周知,linux的网卡由结构体net_device表示... 所谓的网卡发送数据包的调度指的是多个数据包共享一个网卡的规则,当然就要拥有一
  • Android中关于APK遥控器支持的修改

    万次阅读 2013-08-27 22:14:09
    最近,Andoid中APK做了一些修改,让其支持遥控器的支持,这把人弄得焦头烂额,好不郁闷,这里特别记录下思路,留给有需要的同志。  其实Android本身是做了遥控器的上下左右按键的焦点移动控制,以及Enter键...
  • Spring和Hibernate的集成的一个要点就是事务的支持,openSession、getCurrentSession都是编程式事务(手动设置事务的提交、回滚)中重要的对象,HibernateDaoSupport则提供了更方便的声明式事务支持。  ...
  • 最近项目需要阿拉伯语做支持,之前GP上都被阿拉伯人差评,一度不再支持阿拉伯语,因为语言习惯不符合人家的,人家喜欢从右往左读的。这次老板说阿拉伯人有钱,很多是土豪,我们的APP必须支持阿拉伯语,所以了,...
  • 在看这篇blog之前,默认读者已经有了对支持向量机的基本概念的认识。 一、支持向量机的进一步理解 支持向量机的优化目标在逻辑回归优化目标基础上进一步产生的。具体优化目标不说了,参看各种svm的书籍和博客...
  • Redis事务支持(半支持)

    千次阅读 2018-07-16 13:36:45
    redis事物是半支持下面看一下Redis事务错误处理如果一个事务中的某个命令执行出错,Redis会怎样处理呢?要回答这个问题,首先要搞清楚是什么原因导致命令执行出错:语法错误 就像上面的例子一样,语法错误表示...
  • 支持向量机

    万次阅读 多人点赞 2019-02-12 10:52:13
    需要解决的问题 支持向量机是一种监督学习的方法,主要用来进行分类和回归分析,当我们一些数据进行分类的时候,可能会考虑以下问题: 怎么选择决策边界?什么样的决策边界最好? 目标函数如何求解? 对于线性不...
  • 文件断点续传中指针定位函数setfilepointer()的使用,大文件的支持
  • vs2013是目前最新版的windows平台的开发环境,确实好用,还记得很多人编程的时候,安装了一些插件,有助于编程,但是时代到了vs2013,完全不需要这些辅助工具了,呵呵,但是也带来了一些麻烦,这时候我开始微软的...
  • SpringBoot支持Https

    千次阅读 2019-08-20 15:56:52
    https简介 超文本传输安全协议(HyperText Transfer Protocol Secure),缩写:HTTPS;常称为 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一种...HTTPS 开发的主要目的,是提供网站服务器的身份认证,保护...
  • 理解支持向量机

    万次阅读 2016-03-25 17:16:21
    支持向量机是一个二类分类模型,但也可以扩展为多类分类。其基于间隔最大化和核技巧的特点可以使它可以灵活处理线性或非线性分类问题。 支持向量机可是形式化为一个凸二次规划问题,学习算法是求解基于凸二次规划的...
  • 2019年1月起Oracle要JDK8就要收费了!

    万次阅读 热门讨论 2018-12-18 15:41:23
    JDK8从2019年1月开始就要收费了,怎么办呢? 其实这个问题本身就是有问题的,因为收费的并不是JDK8 , 而是JDK8后续的update (更新) 。 什么是update? 如果你下载过JDK, 就会看到那些8u191, 8u192这样的东西,191,...
  • jdk-8u181-windows-x64.exe ...三、但如果你还希望继续使用老版本的JDK8,oracle也可以单独给你提供补丁服务,这个需要额外收费 ...总结意思是说1.8后面不开源,如果有其他问题 就要收费帮你解决的意思
  • Ubuntu 安装 texlive2013 及中文支持

    千次阅读 2014-04-09 17:33:32
    本文介绍了,texlive2013在ubuntu12.04上的完整安装和配置过程,特别是完成了中文字体的支持问题。Enjoy it !
  • 1、IE6、IE7都支持 *,但IE8终于回归正统,放弃了*的支持2、IE7、IE8、Firefox、Opera、Safari都支持 important顾名,important的优先级要高. 举例说明: body { background-color:#FF0000 !important; *...
  • 编译器设计:整型立即数支持

    千次阅读 2016-11-25 17:38:25
    上一篇文章中实现了一个文本打印工具(厚脸皮地叫compiler,^_^),这次加入立即数支持,可以return任意整型值(数据类型目前还不支持)。这次的do_compiler函数采用了闭包机制,实现如下:def do_compile(fout): ...
  • 支持向量机导论

    千次阅读 2016-07-17 20:08:13
    2. 线性可分支持向量机与硬间隔最大化 1. 函数间隔 2. 间隔最大化 3. 支持向量和间隔边界 4. 学习的对偶算法 3. 线性支持向量机与软间隔最大化  学习的对偶算法  0.  支持向量 4. 非线性支持向量机与核...
  • 支持 if 和 else 成出现的人认为:不怕一万 就怕万一认为 if 和 else 没必要成出现的人认为:不便于理解,太多没用的东西。我之前觉得也必须非要这样成,但是今天在工程中遇到了问题。就是
  • debian添加中文支持

    千次阅读 2019-03-05 18:01:56
    debian与ubuntu有很大的相似性,但是debian相对更原始,比如在语言支持这一块,如果在安装ubuntu的时候,选择的系统语言是英文,那么系统显示的肯定是英文,但是查看中文文件的时候,肯定还是能查看的,因为系统默认...
  • Git的中文支持

    千次阅读 2018-03-08 21:49:11
    Git的中文支持 Git 2014-12-11 18:12:46 发布 您的评价: 2.0 收藏 0收藏 Git的本地化做得并不完善,命令的输出及命令的帮助还只能输出英文。目前中文用户最关心的问题是:是否可以在提交说明中使用中文?是否...
  • 简单粗暴理解支持向量机(SVM)及其MATLAB实例

    万次阅读 多人点赞 2018-09-28 17:49:36
    那么我们就要训练C{2,5}=10(组合数)个SVM分类器。每个SVM分类器都可以区分出两种类别。我们把数据分别输入到这10个SVM分类器中,根据结果进行投票,依据得票数最多来确定它的类别。 QP求解 大致有下面4种...
  • 比如192.168.0.111这个地址要访问internet,它的数据包就要通过一个网关或者路由器,而网关或者路由器拥有一个能访问internet的ip地址,这样的网关和路由器就要在收发数据包时,数据包的IP协议层数据进行更改(即 ...
  • 名词解释:此动态非运行时动态,让EF动态支持新增表、动态切换数据库意在不改变项目核心框架, 通过新增或者替换组件的方式达到标题目地。   一、先来点简单的,动态支持多数据库 AppDbContext实现: ...
  • Unity对于VR的支持

    千次阅读 2017-05-25 12:35:40
    如何打开Unity对于VR的支持在edit下拉菜单里,找到Project Setting选项,然后选择Player,在Inspector中找到Other Setting,勾选Virtual Reality Supported复选框,即可获取对于VR设备的支持。 点击+号即可添加新的...
  • 监督学习——支持向量机SVM

    千次阅读 2018-07-15 17:06:13
    支持向量机属于监督学习,是一种二类分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,支持向量机包括核心技巧,这使它成为实质上的非线性分类器。支持向量机的学习策略是间隔最大化,可形式化为一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 466,613
精华内容 186,645
关键字:

对的就要支持