gpt4 book ai didi

database - Matlab数据库准备语句和绑定(bind)变量

转载 作者:太空狗 更新时间:2023-10-30 01:53:35 26 4
gpt4 key购买 nike

我是 Matlab 的新手,但我已经成功地使用它与数据库(在我的例子中是 PostgreSQL)进行交互,方法是遵循关于如何 connect to a database using JDBC drivers 的官方文档。 , 然后 executing a query with exec .但是,在后一种情况下给出的示例涉及将数据粘贴到查询中,这可能效率低下并且容易受到 SQL 注入(inject)的影响。

我真正想做的是使用绑定(bind)变量,就像在 JDBC PreparedStatement 中所做的那样.我在文档中找不到任何关于此的内容。有什么方法可以做到这一点吗?

最佳答案

是的,正如您指出的那样,这样做是可能的,但您也可以通过 Matlab Database Toolbox 来完成所有这些工作。

通过 Matlab 数据库工具箱插入数据

事实上,这个工具箱通过直接的 JDBC 连接与 PostgreSQL 一起工作。此外,datainsertfastinsert 这两种实现的数据插入方法都通过专门创建的准备语句工作。这两者之间的唯一区别在于各自准备好的语句填充数据的方式。 fastinsert 在 Matlab 中使用与您提到的完全相同的技术(通过使用不同的 setter ,如 setDoublesetBooleansetTimestamp等等以及当然是 setObject)。但事实证明,这种方式很难用于大数据量的情况,因为在这种情况下 fastinsert 变得非常慢。datainsert通过Java中的某个对象向创建的prepared statement中填充数据com.mathworks.toolbox.database.writeTheData 类。这个类实现了两个方法——doubleWritecellWritedoubleWrite 允许用数字标量数据填充准备好的语句。cellWrite 假定数据作为单元格矩阵传递,每个单元格中都有一个标量对象(对象可以是数字、逻辑 Matlab 标量、Matlab 字符串或 JDBC 驱动程序支持的标量 Java 对象,比如 org.postgresql.jdbc.PgArray 在数组的情况下)对于相应的字段和元组。因此,不是从 Matlab 调用 setObject(这可能会导致一个显着的开销)作为第一步,用必要的对象填充提到的单元格矩阵更有效然后从 Matlab Database Toolbox 调用 datainsert 作为第二步。

数据插入方法的性能

但在这种情况下,所有被插入的对象都具有 Matlab 类型(标量、字符串、矩阵、多维数组、结构和任意其他 Matlab 类型),使用特殊的高性能 PostgreSQL 至少有一种更有效的插入数据的方法客户端库 100% 用 C 语言编写并基于 libpq。它叫做PgMex .它对于大数据量(大约 1Gb 或更多)或当它是需要插入非标量数据(数组)。在这种情况下,fastinsertdatainsert 都表现出性能下降,并且由于大型数据集的 JDBC 驱动程序的限制而导致 Java 堆内存持续不足。这很容易从下面的图片可以看出:

The case of scalar numeric data The case of arrays

这里比较fastinsertdatainsertbatchParamExec的性能来自 PgMex(详见 https://pgmex.alliedtesting.com/#batchparamexec)。第一张图片是标量数值数据的情况,第二张图片是数组的情况。每个图的端点对应到一定的最大数据量通过相应的方法无误的传入数据库。数据量大于最大值(特定于每个方法)会导致“Java 堆内存不足”问题(每个实验的 Java 堆大小在每个图的顶部指定)。更多实验详情请见下文 paper with full benchmarking results for data insertion .

编辑:现在PgMex支持免费的学术许可证。

关于database - Matlab数据库准备语句和绑定(bind)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com