我关注的案例如下。有三个表:
CREATE TABLE Transaction(
Id DECIMAL(13,0),
User_Name CHAR(50)
PRIMARY KEY (Id)
);
--
CREATE TABLE Attachment(
Id DECIMAL(13, 0),
Transaction_Id DECIMAL(13, 0),
Description CHAR(200),
PRIMARY KEY (Id),
FOREIGN KEY (Transaction_Id) REFERENCES Transaction(Id)
);
--
CREATE TABLE Transaction_Data(
Transaction_Id DECIMAL(13, 0),
Json BLOB(32M),
PRIMARY KEY (Transaction_Id),
FOREIGN KEY (Transaction_Id) REFERENCES Transaction(Id)
);
对于每个事务,可以有0个或更多附件,0或只有一个用BLOB编写的JSON。我需要获取与特定交易相关的所有数据。为此,我编写了以下SELECT查询:
SELECT t.Id, t.User_Name, a.Id, a.Description, d.Json
FROM Transaction t
LEFT JOIN Attachment a
ON a.Transaction_Id = t.Id
LEFT JOIN Transaction_Data d
ON d.Transaction_Id = t.Id
WHERE t.Id = 100;
在结果表中,我得到的BLOB值(JSON)重复次数与事务的附件一样多。我需要在我的Java应用程序中使用结果集。应用程序远程与数据库通信。所以,我的问题是,结果集中提到的BLOB值重复是否会影响通过网络传输的数据量,处理此类案例的常见做法是什么?
我正在使用IBM DB2数据库,以及驱动程序db2jcc4-4.9.78或Maven依赖项:
<dependency>
<groupId>db2jcc4</groupId>
<artifactId>db2jcc4</artifactId>
<version>4.9.78</version>
</dependency>
答案 0 :(得分:1)
结果集中提到的BLOB值重复是否会影响通过网络传输的数据量
像这样的JDBC问题的答案通常取决于特定JDBC驱动程序的实际实现。在不知道您正在使用什么JDBC驱动程序的情况下,我无法确定复制是否会影响通过线路传输的数据量,但快速测试显示它肯定可以影响该量。
我在MySQL中创建了一个名为transaction_data
的表,在名为json
的列中有一个1.7 MB的LONGBLOB。我创建了一个小的Java测试来使用mysql-connector-java-5.1.41查询该数据库,其中包含默认的连接属性,ResultSet属性等。另外值得一提的是我刚刚做过ResultSet rs = ps.executeQuery()
;我没有遍历ResultSet并使用json
显式检索getBlob
值。 (事实上,我根本没有从ResultSet中检索任何值。)
当我执行一个影响具有一(1)个附件的事务的SELECT查询,因此相关的json
值仅包含在一行中,Wireshark告诉我该查询的总网络流量(两个方向)是1877488字节,或1.8 MB。
在向该事务添加九(9)个附件后,相关的json
值包含在十(10)行中,Wireshark告诉我该查询的总网络流量(两个方向)为18766790字节,或17.9 MB。
所以是的,在这种情况下,重复的json
BLOB被拉过电线十(10)次。
现在MySQL Connector / Java因其默认行为&#34; slurping&#34;而闻名。整个ResultSet一次性下载到客户端,因此其他JDBC驱动程序可能采取不同的行为。您可能应该使用您打算使用的实际JDBC驱动程序进行一些测试。