ngrinder默认的数据库是
H2
,但代码中是支持H2
和cubrid
的,老实讲,这2个数据库,我第一次看见项目中有用到,恕我孤陋寡闻了,查了一下,才知道是2个开源的关系型数据库,鉴于平时自己99%用mysql
,对mysql
甚是喜欢,所以换一下更好开展工作呢,虽然我现在还没有解读透ngrinder的源码~~~
网上也有教程,自己又实践了,有一些不同,但总体流程是一样的,这里仅作记录
- 添加
mysql
依赖
在ngrinder-controller/pom.xml
添加既可,一般rlt+insert
可进行搜索添加
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
import maven build
没错即可,一般都无错!
- 本地新建
mysql
数据库,并进行初始化
进入本地服务器,创建数据库,建用户密码并授权,刷新权限
create database ngrinder;
GRANT ALL ON ngrinder.* TO 'ngrinder'@'%' IDENTIFIED BY 'ngrinder'
flush privileges;
- 初始化
我在3.5的源码包里找的建表语句,先用
ngrinder-ngrinder-3.5.2-20200929\tools\migrator
create table if not exists AGENT (
id bigint auto_increment unique,
approved char(1) not null,
hostName varchar(255),
ip varchar(255),
primary key (id)
);
#########################################################
create table if not exists NUSER (
id bigint auto_increment unique,
created_date timestamp NULL DEFAULT NULL,
last_modified_date timestamp NULL DEFAULT NULL,
authentication_provider_class varchar(255),
description varchar(255),
email varchar(255),
enabled char(1) not null,
is_external char(1),
mobile_phone varchar(255),
password varchar(255),
role_name varchar(255) not null,
timeZone varchar(255),
user_id varchar(255) not null unique,
user_language varchar(255),
user_name varchar(255),
created_user bigint,
last_modified_user bigint,
primary key (id)
);
#########################################################
create table if not exists PERF_TEST (
id bigint auto_increment unique,
created_date timestamp NULL DEFAULT NULL,
last_modified_date timestamp NULL DEFAULT NULL,
agent_count int,
description text,
distribution_path varchar(255),
duration bigint,
errors bigint,
finish_time timestamp NULL DEFAULT NULL,
ignore_sample_count int,
ramp_up_init_count int,
ramp_up_init_sleep_time int,
last_progress_message text,
mean_test_time double,
peak_tps double,
port int,
ramp_up_step int,
ramp_up_increment_interval int,
processes int,
progress_message text,
run_count int,
scheduled_time timestamp NULL DEFAULT NULL,
script_name varchar(255),
script_revision varchar(255),
send_mail char(1),
start_time timestamp NULL DEFAULT NULL,
status varchar(255),
stop_request char(1),
tag_string varchar(255),
target_hosts text,
test_comment text,
test_error_cause varchar(255),
name varchar(255),
test_time_standard_deviation double,
tests bigint,
threads int,
threshold varchar(255),
tps double,
use_rampup char(1),
vuser_per_agent int,
created_user bigint,
last_modified_user bigint,
region varchar(255),
safe_distribution char(1) default 'F',
sampling_interval int default 1,
param varchar(256) default '',
ramp_up_type varchar(10) default 'PROCESS',
scm varchar(30) default 'svn',
ignore_too_many_error char(1) default 'F',
primary key (id)
);
#########################################################
create table if not exists PERF_TEST_TAG (
perf_test_id bigint not null,
tag_id bigint not null,
primary key (perf_test_id, tag_id)
);
#########################################################
create table if not exists TAG (
id bigint auto_increment unique,
created_date timestamp NULL DEFAULT NULL,
last_modified_date timestamp NULL DEFAULT NULL,
tagValue varchar(255),
created_user bigint,
last_modified_user bigint,
primary key (id)
);
#########################################################
create table if not exists SHARED_USER (
owner_id bigint not null,
follow_id bigint not null,
primary key (owner_id, follow_id)
);
NUSER会执行失败,原因是,user_id太长了,库是utf8mb4,mysql索引长度不能超767,长度要*4<767才可以,所以这里最大只能填191,而不能填255
- 添加mysql数据源选择
ngrinder-controller/org.ngrinder.infra.config.database.java database枚举类
/**
* mysql
*/
mysql(com.mysql.jdbc.Driver.class, org.hibernate.dialect.MySQL5Dialect.class, "jdbc:mysql://%s?%s") {
@Override
protected void setupVariants(BasicDataSource dataSource, PropertiesWrapper databaseProperties) {
dataSource.setUrl(String.format(getUrlTemplate(),
databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_URL),
StringUtils.trimToEmpty(databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_URL_OPTION))));
dataSource.setUsername(databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_USERNAME));
dataSource.setPassword(databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_PASSWORD));
}
};
- 配置数据源连接
ngrinder-ngrinder-3.4.2-20180830\ngrinder-controller\src\main\resources\ngrinder_home_template\database.conf
默认的注释掉
# H2 / cubrid can be set
#database.type=H2
#database.type=cubrid
database.type=mysql
# for cubrid. You should configure the following.
# database.url=localhost:33000:ngrinder
database.url=192.168.53.100:3306/ngrinder
database.url_option=useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&nullNamePatternMatchesAll=true&nullCatalogMeansCurrent=true
database.username=ngrinder
database.password=ngrinder
-
重新打包
mvn clean install -Dmaven.test.skip=true
-
测试
上传到服务器上,执行[root@52-118 ngrinder]# java -jar ngrinder-controller-3.4.2.war
很不幸,报错,
liquibase.exception.DatabaseException: Error executing SQL CREATE TABLE `DATABASECHANGELOG` (`ID` VARCHAR(63) NOT NULL, `AUTHOR` VARCHAR(63) NOT NULL, `FILENAME` VARCHAR(200) NOT NULL, `DATEEXECUTED` DATETIME NOT NULL, `ORDEREXECUTED` INT NOT NULL, `EXECTYPE` VARCHAR(10) NOT NULL, `MD5SUM` VARCHAR(35) NULL, `DESCRIPTION` VARCHAR(255) NULL, `COMMENTS` VARCHAR(255) NULL, `TAG` VARCHAR(255) NULL, `LIQUIBASE` VARCHAR(20) NULL, CONSTRAINT `PK_DATABASECHANGELOG` PRIMARY KEY (`ID`, `AUTHOR`, `FILENAME`)): Specified key was too long; max key length is 767 bytes
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:62)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:104)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:70)
at liquibase.database.AbstractDatabase.checkDatabaseChangeLogTable(AbstractDatabase.java:504)
at liquibase.Liquibase.checkDatabaseChangeLogTable(Liquibase.java:576)
at org.ngrinder.infra.init.LiquibaseEx.update(LiquibaseEx.java:76)
at org.ngrinder.infra.init.DatabaseUpdater.init(DatabaseUpdater.java:86)
at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:800)
at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:444)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:791)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294)
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
at org.eclipse.jetty.server.Server.start(Server.java:387)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
at org.eclipse.jetty.server.Server.doStart(Server.java:354)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.ngrinder.NGrinderControllerStarter.run(NGrinderControllerStarter.java:236)
at org.ngrinder.NGrinderControllerStarter.main(NGrinderControllerStarter.java:310)
Caused by:
java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
- 是老问题,试着解决
于是,我用tomcat容器启动了服务,结果报错:3.4.2还是springmvc,没有内置容器,所以还是要额外配置tomcat
- 发现是jdk1.8+ api都不支持这个
sun.net.spi.nameservice.NameServiceDescriptor
这个项目要用jdk1.7编译才能成功,idea修改file-project structure
再次build,成功
- 接下来,轮到真正的添加一个tomcat容器了,这个网上搜,不提供细节
- 启动tomcat报错
27-Nov-2020 14:55:56.163 警告 [main] org.apache.catalina.core.AprLifecycleListener.init The APR based Apache Tomcat Native library failed to load. The error reported was [E:\apache-tomcat-8.5.32\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform]
java.lang.UnsatisfiedLinkError: E:\apache-tomcat-8.5.32\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
删除E:\apache-tomcat-8.5.32\bin\tcnative-1.dll
解决
- 再报错
27-Nov-2020 14:58:44.143 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
27-Nov-2020 14:58:44.144 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [/ngrinder_controller_war_exploded] startup failed due to previous errors
[2020-11-27 02:58:44,198] Artifact ngrinder-controller:war exploded: Error during artifact deployment. See server log for details.
我看了2天,并没有解决这2个问题:
- 启动时报转库建表语句中索引长度超长,启动失败
- 本地idea中增加tomcat容器启动失败
因为临时接到任务,要去搞APP自动化,所以目前ngrinder暂时放一放,感觉好难。springmvc源码看上去认识,但实际却还没有吃进去。