首页 » java

org.springframework.data.repository.query.ParameterOutOfBoundsException: Invalid parameter index! You seem to have declared too little query method parameters!

原因是没有少了个By,30后面必须有by

Flux<MySeries> findTop30ByOrderByRatingDesc();

open feign默认不打印日志,这对debug很不方便,配置方法如下

[1]配置config

@Configuration
public class UserClientConfig {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.HEADERS;
    }
} 

[2]配置feignclient

@FeignClient(name = "User", url = "http://localhost:8080",configuration=UserClientConfig.class)
public interface UserClient {

    @RequestMapping(method = RequestMethod.GET, value = "/user")
    List<User> getAllUsers();    

}

[2]配置application.properties

logging.level..UserClient:DEBUG

Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column """BRIEF"" VARCHAR(255) ,h2 生成的默认长度是255
[1]报错如下:
Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column """BRIEF"" VARCHAR(255)": "STRINGDECODE('\uff1aDuenpatra\uff08pim\uff09\u5728\u5979\u7684\u7956\u6bcd\u4f4f\u5b85\u7684Prapim\u5f00\u4e86\u4e00\u5bb6\u81ea... (320)"; SQL statement:
insert into my_season (actors, brief, cat, cover, finish, pinyin, plays, rating, score, season_no, title, title_en, year, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [22001-199]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:455) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:427) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.table.Column.validateConvertUpdateSequence(Column.java:441) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.table.Table.validateConvertUpdateSequence(Table.java:824) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.command.dml.Insert.insertRows(Insert.java:175) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.command.dml.Insert.update(Insert.java:132) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.command.CommandContainer.update(CommandContainer.java:133) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.command.Command.executeUpdate(Command.java:267) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:200) ~[h2-1.4.199.jar:1.4.199]
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:154) ~[h2-1.4.199.jar:1.4.199]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-3.2.0.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-3.2.0.jar:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
    ... 89 common frames omitted

[2]解决办法,加上下面的声明,注意如果是内存中,需要重启,如果文件中,需要删除重新运行

@Column(length = 2000)
private String brief;

[3]或者


@Column(columnDefinition = "TEXT")
private String brief;

由于使用新的web框架webflux,来写html页面,虽然thymeleaf据说性能不如freemarker,但是对Reactive支持的好啊。

看下MVC式的调用Reatve渲染

  @GetMapping("/home")
    public String home(final Model model) {

        Flux<Post> postList = this.posts.findAll();
        model.addAttribute("posts", new ReactiveDataDriverContextVariable(postList, 100));
        return "home";
}

所以笔者准备采用thymeleaf作为模板了,谁让他支持Reactive呢,小小的性能损失不算什么,关键性能在数据库访问。样例https://github.com/hantsy/spring-reactive-sample/tree/master/mvc-thymeleaf

操作系统和JDK提供了一系列工具.

1.cpu使用率 (CPU usage)

  • CPU使用率 分为两个分类----操作系统时间 system time 和 用户时间 User time
  • 性能调优的目的是短时间内CPU的使用率越高越好,因为CPU使用率是一个数据----5秒钟,或者30秒中,cpu的使用率。如果使用率从50%到达了100%,那么程序的性能是翻倍了的。原来的10分钟时间,现在可能只需要5分钟

1.1.vmstat 1 ---每1秒打印信息

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0   4608 1862336 336860 6909040    0    0    13    28   52   34 23  7 70  0  0
 2  0   4608 1865588 336860 6909040    0    0     0     0 4421 27162  9  6 84  0  0
 0  0   4608 1864928 336860 6909040    0    0     0     0 4211 27532 10  6 84  0  0
 3  0   4608 1871600 336916 6909040    0    0     0   680 4091 24751  4  7 89  0  0
 0  0   4608 1872072 336916 6909044    0    0     0     0 3940 24003  5  6 89  0  0

第一行的信息,us 用户使用了34%,sy 系统占用了23%,表示CPU的总使用率是57%,也就是说这1秒,570毫秒,cpu在忙,剩余的430毫秒cpu空闲。空闲的原因可能有以下:

  • application 被阻塞blocked 在一个一个同步原语primitive,直到那个锁被释放
  • application 正在等待某些东西,例如数据库的返回
  • application 确实have nothing to do
  • 前两种情况,可优化锁和IO,第三种情况,CPU会话执行一部分application code。
  • 单核CPU对于批处理,cpu肯定越高越好,但是对于server类,cpu在等待request进来,如果一个request请求需要400ms,那么我们要优化他的峰值时间,占用cpu40%,即400ms内尽量都是峰值。
  • 多核CPU

1.3.CPU 运行队列(unix 叫run queue,windows 叫processor queue),-----可以运行的线程数。vmstat中的1和2列,分别是r运行中等待的线程数,b 等待io的先成熟
1.4 磁盘使用优化,以下两种都需要优化

  • application 写数据没有有效的缓冲,导致IO统计数据很低
  • application 执行的IO超过了磁盘负载,IO统计数据很高
iostat -xm 5 #x表示额外信息,m表示MB单位,5表示5秒刷新

Device            r/s     rMB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wMB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dMB/s   drqm/s  %drqm d_await dareq-sz  aqu-sz  %util
sda              1.30      0.06     0.01   0.92    0.43    48.72    3.50      0.15     3.47  49.74    1.24    42.48    0.32      0.16     0.00   0.00    0.56   525.02    0.00   0.11
sdb              0.00      0.00     0.00   0.00    7.56    36.05    0.00      0.00     0.00   0.00    2.50     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00   0.00
  • CPU使用率%system 和 w/s没秒写入次数 和wMB/s写入速率可以反映一些问题,CPU很高,写入次数很多,但是写入的速率wMB/s很低。表示有低效的事情发生
  • %util 使用率100%,就是io性能瓶颈了。

1.5关于内存交换swap,系统会把分配给application的内存,不用的那部分写道磁盘上,这对一些GUI程序很好,因为可以节省你笔记本的内存,但是对于JAVA这种堆内存就不那么友好了。因为这个性能很糟糕。

  • 我们可以用vmstat的换进si 和so换出来查看系统的磁盘和内存交换情况。
  • 我们可以使用nistat查看网络使用率,如果读取是0.22MBps,写入是0.16MBps,那么1000Mb的网卡,实际课题哦难过125Mb/s,那么网卡的使用率是(0.22+ 0.16)/125 = 0.33% 。注意网卡的使用率是没法达到100%的,40%说明网卡已经满了。

2.JAVA监控工具