# java11 mysql示例
本示例为您展示了Java runtime的mysql使用示例。
在本示例中,mysql数据库配置在函数的环境变量配置中(参考s.yaml),initializer 回调函数从环境变量中获取数据库配置,创建mysql连接,preStop 回调函数负责关闭mysql连接。
本示例使用MySQL Connector/J 8.0版本,支持MySQL 5.7 and 8.0,版本兼容详情见 https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html 。
> MySQL Connector/J 8.0 Developer Guide: https://dev.mysql.com/doc/connector-j/8.0/en/
## 准备开始
- 一个可用的mysql数据库,可以参考以下sql创建表并插入测试数据
```sql
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`age` tinyint(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `users` (`id`, `name`, `age`) VALUES
(1, '张三', 18),
(2, '李四', 28);
```
- [可选] 安装并配置 Serverless Devs 工具。(https://help.aliyun.com/document_detail/195474.html)
## 快速开始
### 方式一、使用 Serverless Devs 工具编译部署
#### 1. 修改 s.yaml 配置
- 根据需要修改 access 配置
- 修改 environmentVariables 配置,填入 JDBC_URL, JDBC_USER 和 JDBC_PASSWORD
- 使用 initialize 和 prestop 回调,需要在 s.yaml 中配置
```yaml
initializationTimeout: 60
initializer: example.App::initialize
instanceLifecycleConfig:
preStop:
handler: example.App::preStop
timeout: 60
```
#### 2. 安装依赖并部署
在 pom.xml 中添加 mysql 依赖,如下所示(在示例pom.xml中已添加该依赖)
```xml
mysql
mysql-connector-java
8.0.28
```
编译部署代码包
```shell
s deploy
```
> 注意: `s.yaml` 文件中有配置 `pre-deploy` 脚本, 该脚本会在部署前会调用 `mvn package` 编译。
#### 3. 调用测试
```shell
s invoke
```
调用函数时收到的响应如下所示:
```bash
========= FC invoke Logs begin =========
FC Initialize Start RequestId: 9fe60072-7fe2-4f62-9d13-xxxxxxx
[Name] Register [com.aliyun.serverless.runtime.classloader.FunctionClassLoader@58372a00] as [com.aliyun.serverless.runtime.classloader.FunctionClassLoader@com.aliyun.serverless.runtime.classloader.FunctionClassLoader@/code/HelloFCJava-1.0-SNAPSHOT.jar/code/original-HelloFCJava-1.0-SNAPSHOT.jar]: hash [8bbd2e0] (normal mode)
2022-07-19 04:21:54.577 [INFO] [9fe60072-7fe2-4f62-9d13-62fc04156f77] database connection time cost: 397ms
FC Initialize End RequestId: 9fe60072-7fe2-4f62-9d13-xxxxxxx
FC Invoke Start RequestId: 7581b7c4-bb40-4690-90d6-xxxxxxx
2022-07-19 04:21:59.539 [INFO] [7581b7c4-bb40-4690-90d6-xxxxxxx] Success - 1 rows affected.
2022-07-19 04:21:59.613 [INFO] [7581b7c4-bb40-4690-90d6-xxxxxxx] get user: {name=王五, id=3, age=5}
FC Invoke End RequestId: 7581b7c4-bb40-4690-90d6-xxxxxxx
Duration: 108.03 ms, Billed Duration: 109 ms, Memory Size: 128 MB, Max Memory Used: 109.13 MB
========= FC invoke Logs end =========
FC Invoke instanceId: c-62d63161-a82af772bxxxxxxx
FC Invoke Result:
{name=王五, id=3, age=5}
End of method: invoke
```
### 方式二、使用控制台创建
#### 1. 编译打包
```shell
# 编译部署
mvn package
# 打包文件
cd target && zip -r java11-mysql.zip *
```
#### 2. 创建函数
选择服务(或创建服务)后,单击创建函数,如图所示
- 选择 `从零开始创建`
- 填入函数名称
- 选择运行环境 java11/java8
- 选择函数触发方式:通过事件请求触发
- 其他设置使用默认
> 详细创建函数流程见文档: [使用控制台创建函数](https://help.aliyun.com/document_detail/51783.html)
#### 3. 设置initializer/preStop回调函数配置和环境变量配置
回调函数配置

环境变量配置

#### 4. 测试函数
返回结果如下所示
```bash
{name=王五, id=3, age=5}
```
## 数据库访问限制
当使用云数据库时,一般都会有访问控制,比如阿里云数据库RDS中的白名单设置( [RDS白名单设置说明](https://help.aliyun.com/document_detail/43185.html?spm=5176.19908528.help.dexternal.6c721450iLu0jH) )。
如果仅仅作为测试,可以将白名单配置成 `0.0.0.0/0`。(不要在生产环境使用!)
在生产环境,可以使用以下两种方式访问:
1. VPC方式(**推荐**)
参考文档:https://help.aliyun.com/document_detail/84514.html
2. 代理方式
参考文档:https://help.aliyun.com/document_detail/91243.html
## 备注
1. 本示例不是连接池方式,若要使用连接池,可以参考文档 [Connection Pooling with Connector/J](https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-j2ee-concepts-connection-pooling.html)