mysql集成的key-value引擎-个人翻…

As Calvin mentioned in “NoSQL to InnoDB with Memcached“, we just released a “technology preview” of the feature that makes memcached a MySQL Daemon Plugin. And this “technology preview” release demonstrates how user can go around SQL Optimizer and Query Processing and directly interact with InnoDB Storage Engine through InnoDB APIs. Here, we would like to walk with you step by step to see how to get the memcached Daemon Plugin set up and get it running.

正如上文提到的,我们只是释放出了一个技术预览版。此功能目前只是mysql的一个插件,使用memcached协议。


If you would just like to get a brief introduction on the setup steps, there is a “README-innodb_memcached” in the mysql-5.6.2-labs-innodb-memcached package. This is a more elaborated description on these steps.

如果你想获取到更多关于安装的介绍步骤,请查看README-innodb_memcached文件,这个文件在 mysql-5.6.2-labs-innodb-memcached内。里面有更详细的介绍

1) Prerequisite:服务需求

Currently, the Memcached Daemon Plugin prototype is only supported on Linux platform. And as a prerequisite, you must have libevent installed, since it is required by memcached.

目前为止memcached守护进程插件只支持linux平台,并且你需要安装libevent,因为这个是memcached所需的

If you have the source code release, then there is a libevent 1.4.3 included in the package (plugin/innodb_memcached/libevent). You can go to the directory and do autoconf, ./configure, make and make install to make the libevent installed.

如果需要你可以去plugin/innodb_memcached/libevent来安装libevent 1.4.3,只需配置./configure 然后make &make install


2) Build the server编译服务

Assuming you would like to build the server yourself (otherwise, you can just skip this section), once libevent is installed, you can just build the MySQL server as usual.

考虑到你可以更喜欢自己编译源代码来构建服务器,当然,如果不是可以跳过此章节,只要安装了libevent,你可以按之前方式编译mysql

Our source code is in the “plugin/innodb_memcached” directory. As part of server build, it will generate two shared libraries:

1) libmemcached.so: this is the memcached daemon plugin to MySQL

2) innodb_engine.so: this is an InnoDB API plugin to memcached

在plugin/innodb_memcached目录下的文件编译后会生成两个公共库

1) libmemcached.so 这个是mysql内的memcached插件

2)innodb_engine.so 这个是innodb调用memcached 的api插件

Make sure above two shared libraries are put in the MySQL plugin directory. You can find MySQL plugin directory by doing “select @@plugin_dir”:

确认将这两个文件拷贝到mysql的插件目录,你可以在mysql命令行下执行以下语句查找mysql插件保存地址

mysql> select @@plugin_dir;
+——————————————————————————-+
| @@plugin_dir                                                           |
+——————————————————————————-+
| /home/jy/work2/mysql-5.6-memcached-labs/lib/plugin |
+——————————————————————————-+
1 row in set (0.00 sec)


3) Install configuration tables:安装创建表

Next, the memcached plugin needs a bit configuration to know how to interact with InnoDB table. We have a configuration script in “scripts/innodb_memcached_config.sql”. You can just install the necessary configure tables by running  “mysql < scripts/innodb_memcached_config.sql”. If you do not like to know the detail of these configuration tables, you can just skip this section.

下一步,memcached插件需要一些配置。我们有一个配置脚本在scripts/innodb_memcached_config.sql,你可以直接用mysql执行他即可完成所有的配置。下面我们会介绍他都添加了哪些表,如果你对此没有兴趣可以跳过此章节

This configure script installs 3 tables needed by the InnoDB Memcached. These tables are created in a dedicated database “innodb_memcache”. We will go over these three tables in  a bit more detail:

这个脚本会添加三个表,这三个表是memcached插件所必须的,下面我们会详细介绍下这三个表的用途

1) “containers” – This table is the most important table for “Memcached – InnoDB mapping”. It describes the table used to store the memcached values. Currently, we can only map memcached to one table at a time. So essentially, there will be only one row in the table. In the future, we would consider making this configuration more flexible and dynamic, or user can map memcached operations to multiple tables.

1)container 数据存储表,这个表用于memcached - innodb映射,这里将保存所有memcached的映射相关值,目前这个表只有一个,且数据只有一行。未来我们会考虑将这个配置的更灵活,比如用户可以根据自定规则将值存储到多个指定表。

The mapping is done through specifying corresponding column values in the table:

  • “db_schema” and “db_table” columns describe the database and table name for storing the memcached value.
  • “key_columns” describes the column (single column) name for the column being used as “key” for the memcached operation
  • “value_columns” describes the columns (can be multiple) used as “values” for the memcached operation. User can specify multiple columns by separating them by comma (such as “col1, col2″ etc.)
  • “unique_idx_name_on_key” is the name of the index on the “key” column. It must be a unique index. It can be primary or secondary.

    这个映射配置内有很多设置对应如下:
  • db_schema and db_table行用来说明存储memcached的值,table是指保存数据的表,而schema是存储数据库名
  • key_column 表内哪列用于key标识
  • value_columns 表内哪列用于保存key对应的值
  • unique_idx_name_on_key 这个是key_column指定的数据表内的key的索引名,必须是唯一索引,当然可以使用主键或二级索引

Above 5 column values (table name, key column, value column and index) must be supplied. Otherwise, the setup will fail.

Following are optional values, however, to fully comply with memcached protocol, you will need these column values supplied too.

  • “flags” describes the columns used as “flag” for memcached. It also used as “column specifier” for some operations (such as incr, prepend) if memcached “value” is mapped to multiple columns. So the operation would be done on specified column. For example, if you have mapped value to 3 columns, and only want the “increment” operation performed on one of these columns, you can use flags to specify which column will be used for these operations.
  • “cas_column” and “exp_column” are used specifically to store the “cas” and “exp” value of memcached.

    上面的5个设置必须提供,否则会失败,下面的几个选项可以选填
  • flag表示类似memcached的flag,他的用途用来表示某“列”比方说当memcached 映射的值包含多列。比如我们有三列,我们只想incr操作其中的一列,你可以通过flags指定哪行进行此操作
  • case_column以及exp_column是用来保存cas以及exp设置(这俩你知道的……查下cas以及超时)

2. Table “cache_policies” specifies whether we’ll use InnoDB as the data store of memcached (innodb_only) or use memcached’s “default engine” as the backstore (cache-only) or both (caching). In the last case, only if the default engine operation fails, the operation will be forwarded to InnoDB (for example, we cannot find a key in the memory, then it will search InnoDB).

2. 表“cache_policies”制定了我们是否使用innodb保存数据,我们可以指定使用那种方式进行数据保存,如:使用innodb(innodb_only),使用memcached默认引擎(default engine)并且不保存在innodb,或者使用memcached保存并使用innodb保存(caching)。在最后一个选项内,当默认引擎查询失败,查询将会在innodb内查询(如内存内没有这个key的数据,他将会自动查询innodb)

3) Table “config_options”, currently, we only support one config option through this table. It is the “separator” used to separate values of a long string into smaller values for multiple columns values. For example, if you defined “col1, col2″ as value columns. And you define “|” as separate, you could issue following command in memcached to insert values into col1 and col2 respectively:

set keyx 10 0 19

valuecolx|valuecoly

So “valuecol1x” will send to col1 and valuecoly will send to col2.

3.表"config_options"目前我们只在这提供了一个配置选项,此选项用于拆分"separator",当我们有一个很长的字符串,我们可以通过此功能把他拆分成多列内保存。比如定义“列1,列2”为value_COLUMNS 。"|"符号为分隔符的时候,我们可以使用下面命令把列1和列2内容分别插入

set keyx 10 0 19

列1|列2

这时列1值和列2值将会分别存在两个对应顺序的字段内


4) Example tables

Finally, as part of the configuration script, we created a “demo_test” in the “test” database as an example. It also allows the Daemon Memcached to work out of box, and no need to for any additional configurations.

As you would notice, this “demo_test” table has more columns than needed, so it would need the entries in the “container” table to tell which column is used for what purpose as described above.

4)示例表

最后,在我们的配置脚本内,他会自动建立一个 demo_test在test数据库内。

当然这个可以直接使用,无需其他特殊配置

可能你会发现,这个表内有很多列超过了我们的需要。我们可以再container内自行更改下配置只保留我们用的


4) Install the Daemon Plugin(安装守护插件)

The final step would be installing the daemon plugin. It is the same as installing any other MySQL plugin:

最后一步就是安装守护插件,这个步骤和安装其他mysql插件一样执行以下命令

mysql> install plugin daemon_memcached soname “libmemcached.so”;

If you have any memcached specific configure parameters, although it takes effect when the plugin is installed, you would need to specify it during MySQL  server boot time or enter them in the MySQL configure files.

如果你有任何附加的memcached插件配置参数,你可以把他放在mysql的配置文件。重启mysql即可生效

For example, if you would like the memcached to listen on port “11222″ instead of the default port “11211″, then you would need to add “-p11222″ to MySQL system configure variable “daemon_memcached_option”:

比如你想让memcached监听11222端口而非默认的11211端口,你需要指定 -p111222参数,到my.cnf内的daemon_memcached_option字段内写法如下

mysqld …. –loose-daemon_memcached_option=”-p11222″.

Of course, you can add other memcached command line options to “daemon_memcached_option” string.

The other configure options are:

1) daemon_memcached_engine_lib_name (default “innodb_engine.so”)指定默认存储引擎so文件

2) daemon_memcached_engine_lib_path (default NULL, the plugin directory).指定memcached插件lib地址

当然,你可以增加其他命令行参数到配置内如上

By default, you do not need to set/change anything with these two configure option. We have above two configure options because they allow you to load any other storage engine for memcached (such as NDB memcached engine). This opens door for more interesting exploration.

总的来说你不需要改变上面两个参数。我们提供者两个参数是为了提供其他存储引擎给memcached,如NDB 存储引擎,这样可以提供更多有趣的体验。

3) daemon_memcached_r_batch_size, batch commit size for read operation (get operations. It specifies after how many ops we will do a commit. By default, this is set as a very large number, 1048576.

守护进程的读取操作批量更新(每多少次操作后将会做一次数据提交到存储引擎,默认会设置很大如1048576)

4) daemon_memcached_w_batch_size, batch commit for any write operations (set, replace, append, prepend, incr, decr etc.) By default, this is set as 32.

多少次写操作后才会更新存储引擎,默认32

Again, please note that you will have these configuration parameter in your MySQL configure file or MySQL boot command line. And they will take effect when you load the memcached plugin.

另外,注意,当你在命令行启动mysql服务或者在配置文件内指定,都会改变memcached插件的配置


5) Start to play:

Now you have everything set up, you can start to play:

现在我们可以玩一下拉~

telnet 127.0.0.1 11211

使用telnet连11211端口(memcached协议都可以直接这么玩)

set a11 10 0 9
123456789
STORED
get a11
VALUE a11 0 9
123456789
END

You can access the InnoDB table (“demo_test”) through the standard SQL interfaces. However, there are some catches:


1) If you would like to take a look at what’s in the “demo_test” table, please remember we had batched the commits (32 ops by default) by default. So you will need to do “read uncommitted” select to find the just inserted rows:

这时你可以访问innodb表“demo_test”去看下里面的内容,另外要注意,我们上面设置了写操作执行了32次后才会保存同步一次数据到存储引擎,所以你必须使用读取未提交数据来列出

mysql> set session TRANSACTION ISOLATION LEVEL
-> read uncommitted;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from demo_test;
+——+——+——+——+———–+——+——+——+——+——+——+
| cx   | cy   | c1   | cz   | c2        | ca   | CB   | c3   | cu   | c4   | C5   |
+——+——+——+——+———–+——+——+——+——+——+——+
| NULL | NULL | a11  | NULL | 123456789 | NULL | NULL |   10 | NULL |    3 | NULL |
+——+——+——+——+———–+——+——+——+——+——+——+
1 row in set (0.00 sec)

2) The InnoDB table would be IS (shared intention) or IX (exclusive intentional) locked for all operations in a transaction. So unless you change “daemon_memcached_r_batch_size” and “daemon_memcached_w_batch_size” to small number (like 1), the table is most likely intentionally locked between each operations. So you cannot do any DDL on the table.

当innodb在提交同步事务中,他将会使用锁锁定表,所以当你把“daemon_memcached_r_batch_size” and “daemon_memcached_w_batch_size”设置的值十分低的时候(如1)将会导致innodb频繁的锁表,所以你无法做任何DDL操作到表上

Summary

Now you have everything setup. And you can directly interact with InnoDB storage engine through Memcached interfaces. In addition, as you might notice while going through this extended “README”, we still have a lot interesting options open for exploration and enhancement. This is the beginning of  opening InnoDB to the outside world, and NoSQL is a perfect place for it to play.

总结

没啥了……

个人水平有限,翻译了以下mysql5.6.2内的innodb实现keyvalue方式存储的介绍文章
考虑到可能会有纰漏,把原文和翻译对照一起敲下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 activiti-explorer 和 mysql集成示例工程使用过程图解: 1. 下载并解压 activiti-explorer.war 文件,将其放入 Tomcat 服务器的 webapps 目录下。 2. 创建一个名为 activiti 的数据库,并将以下 SQL 语句执行: ``` CREATE TABLE `ACT_RE_DEPLOYMENT` ( `ID_` varchar(64) NOT NULL, `NAME_` varchar(255) DEFAULT NULL, `DEPLOY_TIME_` datetime DEFAULT NULL, PRIMARY KEY (`ID_`) ); CREATE TABLE `ACT_RE_PROCDEF` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `CATEGORY_` varchar(255) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `KEY_` varchar(255) DEFAULT NULL, `VERSION_` int(11) DEFAULT NULL, `DEPLOYMENT_ID_` varchar(64) DEFAULT NULL, `RESOURCE_NAME_` varchar(4000) DEFAULT NULL, `DGRM_RESOURCE_NAME_` varchar(4000) DEFAULT NULL, `DESCRIPTION_` varchar(4000) DEFAULT NULL, `HAS_START_FORM_KEY_` tinyint(4) DEFAULT NULL, `HAS_GRAPHICAL_NOTATION_` tinyint(4) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_PROCDEF_DEPLOYMENT` (`DEPLOYMENT_ID_`), CONSTRAINT `ACT_FK_PROCDEF_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_GE_BYTEARRAY` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `BYTES_` longblob, `DEPLOYMENT_ID_` varchar(64) DEFAULT NULL, `GENERATED_` tinyint(4) DEFAULT NULL, PRIMARY KEY (`ID_`), KEY `ACT_IDX_BYTEARRAY_DEPLOYMENT` (`DEPLOYMENT_ID_`), CONSTRAINT `ACT_FK_BYTEARR_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_HI_ACTINST` ( `ID_` varchar(64) NOT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `PROC_INST_ID_` varchar(64) DEFAULT NULL, `EXECUTION_ID_` varchar(64) DEFAULT NULL, `ACT_ID_` varchar(255) DEFAULT NULL, `TASK_ID_` varchar(64) DEFAULT NULL, `CALL_PROC_INST_ID_` varchar(64) DEFAULT NULL, `ACT_NAME_` varchar(255) DEFAULT NULL, `ACT_TYPE_` varchar(255) DEFAULT NULL, `ASSIGNEE_` varchar(255) DEFAULT NULL, `START_TIME_` datetime DEFAULT NULL, `END_TIME_` datetime DEFAULT NULL, `DURATION_` bigint(20) DEFAULT NULL, `DELETE_REASON_` varchar(4000) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_HI_ACT_INST_PROC_INST` (`PROC_INST_ID_`), KEY `ACT_IDX_HI_ACT_INST_EXECUTION` (`EXECUTION_ID_`), KEY `ACT_IDX_HI_ACT_INST_TASK` (`TASK_ID_`), CONSTRAINT `ACT_FK_HI_ACTINST_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_HI_PROCINST` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_HI_ACTINST_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_HI_ACTINST` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_HI_PROCINST` ( `ID_` varchar(64) NOT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `BUSINESS_KEY_` varchar(255) DEFAULT NULL, `START_TIME_` datetime DEFAULT NULL, `END_TIME_` datetime DEFAULT NULL, `DURATION_` bigint(20) DEFAULT NULL, `START_USER_ID_` varchar(255) DEFAULT NULL, `END_ACT_ID_` varchar(255) DEFAULT NULL, `DELETE_REASON_` varchar(4000) DEFAULT NULL, `SUPER_PROCESS_INSTANCE_ID_` varchar(64) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_HI_PRO_INST_BUSKEY` (`BUSINESS_KEY_`), KEY `ACT_IDX_HI_PROC_INST_START` (`START_TIME_`), KEY `ACT_IDX_HI_PROC_INST_END` (`END_TIME_`), KEY `ACT_IDX_HI_PROC_INST_SUPER` (`SUPER_PROCESS_INSTANCE_ID_`), CONSTRAINT `ACT_FK_HI_PROCINST_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_HI_TASKINST` ( `ID_` varchar(64) NOT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `TASK_DEF_KEY_` varchar(255) DEFAULT NULL, `PROC_INST_ID_` varchar(64) DEFAULT NULL, `EXECUTION_ID_` varchar(64) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `PARENT_TASK_ID_` varchar(64) DEFAULT NULL, `DESCRIPTION_` varchar(4000) DEFAULT NULL, `OWNER_` varchar(255) DEFAULT NULL, `ASSIGNEE_` varchar(255) DEFAULT NULL, `START_TIME_` datetime DEFAULT NULL, `CLAIM_TIME_` datetime DEFAULT NULL, `END_TIME_` datetime DEFAULT NULL, `DURATION_` bigint(20) DEFAULT NULL, `DELETE_REASON_` varchar(4000) DEFAULT NULL, `PRIORITY_` int(11) DEFAULT NULL, `DUE_DATE_` datetime DEFAULT NULL, `FORM_KEY_` varchar(255) DEFAULT NULL, `CATEGORY_` varchar(255) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_HI_TASK_INST_PROC_DEF` (`PROC_DEF_ID_`), KEY `ACT_IDX_HI_TASK_INST_PROC_INST` (`PROC_INST_ID_`), KEY `ACT_IDX_HI_TASK_INST_EXEC` (`EXECUTION_ID_`), KEY `ACT_IDX_HI_TASK_INST_DELETE` (`DELETE_REASON_`), KEY `ACT_IDX_HI_TASK_INST_END` (`END_TIME_`), KEY `ACT_IDX_HI_TASK_INST_NAME` (`NAME_`), KEY `ACT_IDX_HI_TASK_INST_PRIORITY` (`PRIORITY_`), CONSTRAINT `ACT_FK_HI_TASKINST_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_HI_PROCINST` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_HI_TASKINST_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_HI_TASKINST_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_RU_EXECUTION` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `BUSINESS_KEY_` varchar(255) DEFAULT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `ACT_ID_` varchar(255) DEFAULT NULL, `IS_ACTIVE_` tinyint(4) DEFAULT NULL, `IS_CONCURRENT_` tinyint(4) DEFAULT NULL, `IS_SCOPE_` tinyint(4) DEFAULT NULL, `IS_EVENT_SCOPE_` tinyint(4) DEFAULT NULL, `PARENT_ID_` varchar(64) DEFAULT NULL, `SUPER_EXEC_` varchar(64) DEFAULT NULL, `PROC_INST_ID_` varchar(64) DEFAULT NULL, `ROOT_PROC_INST_ID_` varchar(64) DEFAULT NULL, `REV_PARENT_TASK_` varchar(64) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `LOCK_TIME_` datetime DEFAULT NULL, `IS_COUNT_ENABLED_` tinyint(4) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `CACHED_ENT_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_EXEC_BUSKEY` (`BUSINESS_KEY_`), KEY `ACT_IDX_EXEC_PROCINST` (`PROC_INST_ID_`), KEY `ACT_IDX_EXEC_SUPER` (`SUPER_EXEC_`), KEY `ACT_IDX_EXEC_ROOT_PROC` (`ROOT_PROC_INST_ID_`), KEY `ACT_IDX_EXEC_ACT` (`ACT_ID_`), KEY `ACT_IDX_EXEC_PARENT` (`PARENT_ID_`), CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_RU_TASK` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `PARENT_TASK_ID_` varchar(64) DEFAULT NULL, `DESCRIPTION_` varchar(4000) DEFAULT NULL, `TASK_DEF_KEY_` varchar(255) DEFAULT NULL, `OWNER_` varchar(255) DEFAULT NULL, `ASSIGNEE_` varchar(255) DEFAULT NULL, `DELEGATION_` varchar(64) DEFAULT NULL, `PRIORITY_` int(11) DEFAULT NULL, `CREATE_TIME_` datetime DEFAULT NULL, `DUE_DATE_` datetime DEFAULT NULL, `CATEGORY_` varchar(255) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_TASK_PROCINST` (`PROC_INST_ID_`), KEY `ACT_IDX_TASK_EXEC` (`EXECUTION_ID_`), KEY `ACT_IDX_TASK_NAME` (`NAME_`), KEY `ACT_IDX_TASK_ASSIGNEE` (`ASSIGNEE_`), KEY `ACT_IDX_TASK_CREATE_TIME` (`CREATE_TIME_`), KEY `ACT_IDX_TASK_OWNER` (`OWNER_`), CONSTRAINT `ACT_FK_TASK_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_TASK_PARENT` FOREIGN KEY (`PARENT_TASK_ID_`) REFERENCES `ACT_RU_TASK` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_GE_PROPERTY` ( `NAME_` varchar(64) NOT NULL, `VALUE_` varchar(300) DEFAULT NULL, `REV_` int(11) DEFAULT NULL, PRIMARY KEY (`NAME_`) ); ``` 3. 修改 activiti-explorer.war 文件下 WEB-INF/classes 目录下的 db.properties 文件,将其中的数据库配置改为: ``` db=mysql jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/activiti?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true jdbc.username=root jdbc.password=root ``` 其中,jdbc.url 中的数据库名应改为自己创建的数据库名称,jdbc.username 和 jdbc.password 应改为自己的数据库用户名和密码。 4. 启动 Tomcat 服务器,访问 http://localhost:8080/activiti-explorer 即可使用 activiti-explorer 示例工程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值