From e38aca8134570513435c003c25dc05f1ae51c9c9 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期四, 08 十月 2026 13:56:28 +0800
Subject: [PATCH] 实现 Ticket04:采集器辅助测量与登记入口,拆除开发模拟器
---
battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java b/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java
index 9141429..b78ac57 100644
--- a/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java
+++ b/battery-device-neware/src/test/java/com/battery/device/neware/ReadOnlyVendorDataSourceTest.java
@@ -158,4 +158,37 @@
assertTrue(database.statements().isEmpty());
assertEquals(3, dataSource.audit().rejectedStatements().size());
}
+
+ /** 加锁读以 select 开头却是真的会阻塞厂商写入,所以必须在到达驱动之前被单独拒绝。 */
+ @Test
+ void lockingReadsAreRejectedBeforeTheyReachTheDriver()
+ {
+ FakeVendorDatabase database = new FakeVendorDatabase();
+ ReadOnlyVendorDataSource dataSource = dataSourceOver(database);
+ for (String sql : List.of("select dev_uid from channel for update",
+ "select dev_uid from channel FOR SHARE",
+ "select dev_uid from channel lock in share mode",
+ "select dev_uid from channel with (updlock)",
+ "/* probe */ select dev_uid from channel with (tablock, holdlock)"))
+ {
+ assertTrue(ReadOnlyVendorDataSource.isQuery(sql), "加锁读仍然以查询开头:" + sql);
+ assertTrue(ReadOnlyVendorDataSource.containsLockingClause(sql), "应当识别为加锁读:" + sql);
+ assertThrows(NonQueryStatementException.class,
+ () -> dataSource.getConnection().prepareStatement(sql), sql);
+ }
+ assertTrue(database.statements().isEmpty(), "加锁读不得到达驱动");
+ assertTrue(!ReadOnlyVendorDataSource.containsLockingClause("select dev_uid from channel"));
+ assertTrue(!ReadOnlyVendorDataSource.containsLockingClause(""));
+ }
+
+ /** 连接超时与读取超时都必须由我们显式给出,且不得写入只读事务参数(5.5 不支持)。 */
+ @Test
+ void vendorJdbcUrlCarriesBothTimeoutsAndNoReadOnlySessionVariable()
+ {
+ String url = NewareMysqlAdapterFactory.jdbcUrl("26.1.2.3", 3306, "bts63");
+
+ assertTrue(url.contains("connectTimeout="), url);
+ assertTrue(url.contains("socketTimeout="), url);
+ assertTrue(!url.contains("transaction_read_only"), url);
+ }
}
--
Gitblit v1.7.1