函数mi_dalloc的作用是:在指定的内存持续时间内分配指定的内存量,并返回一个指向所分配块的指针。
1.语法
void *mi_dalloc (size, duration)
mi_integer size;
MI_MEMORY_DURATION duration;
size要分配的字节数。
duration
指定要分配的用户内存的内存持续时间的值。持续时间的有效值如下:
值 | 含义 |
PER_ROUTINE | 在UDR的一次迭代期间 |
PER_COMMAND | 执行当前子查询的持续时间 |
PER_STATEMENT (Deprecated) | 在当前SQL语句的持续时间内 |
PER_STMT_EXEC | 在当前SQL语句的执行期间 |
PER_STMT_PREP | 在当前准备的SQL语句的持续时间内 |
PER_TRANSACTION (Advanced) | 在一次事务期间 |
PER_SESSION (Advanced) | 在当前客户端会话期间 |
PER_SYSTEM (Advanced) | 在数据库服务器执行期间 |
在客户端LIBMI应用程序中有效? | 在用户定义的例程中有效? |
是(但是,应用程序忽略内存持续时间) | 是 |
2.用法
mi_dalloc()函数为一个DataBlade API模块分配大小字节数的共享内存。mi_dalloc()函数是一个用于用户内存的构造函数。这个函数的行为与mi_alloc()完全相同,只是mi_dalloc()允许您在分配时显式地指定内存持续时间。
服务器
对于C UDR中的大多数内存分配,duration参数必须是以下公共内存持续时间常数之一:
PER_ROUTINE(或PER_FUNCTION)
指定PER_ROUTINE,数据库服务器将在UDR返回时释放分配的内存。
PER_COMMAND
指定PER_COMMAND,数据库服务器将在子查询执行完成时释放内存。
PER_STMT_EXEC
指定PER_STMT_EXEC,数据库服务器将在SQL语句执行完成时释放内存。
PER_STMT_PREP
指定PER_STMT_PREP,数据库服务器将在准备好的SQL语句终止时释放内存。
提示:只有在常规内存持续时间不能安全执行需要完成的任务时,才在C UDR中使用高级内存持续时间。这些高级内存持续时间很长,会增加内存泄漏的可能性。
在C UDR中,当引发异常时,数据库服务器自动释放通过mi_dalloc()分配的内存。
重点:在C UDR中,使用DataBlade API内存管理函数来分配内存。使用DataBlade API内存管理函数可以确保数据库服务器能够自动释放内存,特别是在出现返回值或异常的情况下,例程无法释放内存。
当不再需要mi_dalloc()分配的内存时,UDR可以使用mi_free()显式地释放mi_dalloc()分配的内存。
客户端
在客户端LIBMI应用程序中,mi_dalloc()的工作原理与malloc()完全相同:
存储分配在客户机进程的堆上。但是,数据库服务器不会自动释放此内存。因此,客户端LIBMI应用程序必须使用mi_free()函数显式地释放mi_dalloc()进行的所有分配。客户机LIBMI应用程序忽略内存持续时间。
在回调函数中,调用mi_dalloc()请求PER_COMMAND的持续时间将返回NULL。因此,回调函数必须调用mi_dalloc(),其持续时间为PER_ROUTINE。
mi_dalloc()函数返回一个指向新分配内存的指针。转换此指针以匹配您分配的用户定义缓冲区或结构的结构。
3.返回值
指向新分配内存的指针。强制转换此指针以匹配为其分配内存的用户定义缓冲区或结构。
NULL函数无法分配内存。
mi_dalloc()函数在遇到运行时错误时不会抛出MI_Exception事件。因此,该函数不会导致调用回调。