我在使用1000个INSERT语句之间运行性能比较:
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES ('6f3f7257-a3d8-4a78-b2e1-c9b767cfe1c1', 'First 0', 'Last 0', 0)
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES ('32023304-2e55-4768-8e52-1ba589b82c8b', 'First 1', 'Last 1', 1)
...
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES ('f34d95a7-90b1-4558-be10-6ceacd53e4c4', 'First 999', 'Last 999', 999)
Run Code Online (Sandbox Code Playgroud)
..versus使用具有1000个值的单个INSERT语句:
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES
('db72b358-e9b5-4101-8d11-7d7ea3a0ae7d', 'First 0', 'Last 0', 0),
('6a4874ab-b6a3-4aa4-8ed4-a167ab21dd3d', 'First 1', 'Last 1', 1),
...
('9d7f2a58-7e57-4ed4-ba54-5e9e335fb56c', 'First 999', 'Last 999', 999)
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,结果与我的想法相反:
测试直接在MSSQL Management …
关于部分内容已经说了很多(并且写在SO上),但不是全面,完整的方式,所以我们可以有一个"终极,覆盖所有"的解决方案供所有人使用.
我有一个Oracle DB,我存储全局事件的日期+时间+时区,因此必须保留原始TZ,并根据请求传送到客户端.理想情况下,它可以很好地使用标准的ISO 8601"T"格式,可以使用"TIMESTAMP WITH TIME ZONE"列类型("TSTZ")很好地存储在Oracle中.
像"2013-01-02T03:04:05.060708 + 09:00"这样的东西
我需要做的就是从DB中检索上述值并将其发送到客户端而无需任何操作.
问题是Java缺乏ISO 8601(或任何其他日期+时间+ nano + tz数据类型)的支持,情况更糟,因为Oracle JDBC驱动程序(ojdbc6.jar)对TSTZ的支持更少(相对于Oracle DB本身得到了很好的支持).
具体来说,这是我不应该或不能做的:
那么,这是我留下的选项:
使用JDBC getString(),并对其进行字符串操作以修复并使ISO 8601兼容.这很容易做到,但如果Oracle更改内部硬编码的getString()格式,则存在死亡的危险.另外,通过查看getString()源代码,似乎使用getString()也会导致一些性能损失.
使用Oracle DB"toString"转换:"SELECT TO_CHAR(tstz ...)EVENT_TIME ...".这很好,但有两个主要的不利因素:
使用Oracle的TIMESTAMPTZ java类并从其内部(记录的)字节数组结构中手动提取相关值(即实现我自己的toString()方法,Oracle忘记在那里实现).如果Oracle改变内部结构(不太可能)并且需要相对复杂的功能来实现和维护,这是有风险的.
我希望有第四个,很棒的选择,但是从整个网络上看也是如此 - 我看不到任何东西.
想法?意见?
UPDATE
下面给出了很多想法,但看起来没有正确的方法来做到这一点.就个人而言,我认为使用方法#1是最短且最易读的方式(并保持良好的性能,而不会丢失亚毫秒或基于SQL时间的查询功能).
这是我最终决定使用的:
String iso = rs.getString(col).replaceFirst(" ", "T");
Run Code Online (Sandbox Code Playgroud)
谢谢大家好的答案,
B.
.NET允许两种非常类似的方式从网络"读取"(假设TCP连接):
1. TcpClient.GetStream().Read()
2. TcpClient.Client.Receive()
Run Code Online (Sandbox Code Playgroud)
通过查看NetworkStream源代码 - 它似乎是底层套接字的额外包装器,最终调用Socket方法.
问题:使用"间接"NetworkStream变体(#1)的好处是什么,而不是使用Socket实现提供的直接包装器?
谢谢你,鲍里斯.
我写了一个在具有两个网络接口的系统(Win7)上运行的工具,每个网络接口链接到一个不同的子网,每个接口都有自己的网关,然后将其链接到两个单独的远程网络(每个网关后都有出站防火墙)。我正在通过使用Socket.Bind(在之前Connect)到每个相关NIC的IP地址来通过两个NIC启动传出TCP连接。第一个NIC工作正常,但是对于第二个NIC,我得到SocketException:“尝试对不可达的网络进行套接字操作”。
我最初的理解是,由于套接字绑定到具体的NIC本地端点(已定义网关),因此应该将连接路由到此网关,因此应该可以正常工作。但是,似乎源IP地址已被忽略,并且路由正在根据本地路由表运行(即,第二个NIC的连接请求转到第一个,默认,网络,并且由于子网错误而被拒绝)。
调整本地路由表会有所帮助,但这使我想知道套接字绑定到特定本地IP的能力背后的全部原因。
做一些额外的阅读后,我发现确实存在诸如“源IP路由”之类的东西,但是DisableIPSourceRouting由于安全原因,Windows默认情况下(通过注册表设置)将其禁用,例如:
问题:
Socket.Bind应该足够)–为什么不修改路由表就无法正常工作?Socket.Bind忽略并使用路由)–拥有Socket.Bind有什么意义?为什么要这么做?非常感谢。
我正在使用 .NET 1.1 兼容模式进行未处理的异常处理。问题是,当 LegacyUnhandledExceptionPolicy 设置为“1”(这是我想要的)时,我无法捕获并吞下 ThreadAbortException。
示例代码:
应用程序配置:
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
代码:
class Program {
static void Main(string[] args) {
AppDomain.CurrentDomain.UnhandledException += _onBackgroundThreadCrash;
var t = new Thread(_worker) { IsBackground = true };
t.Start();
Thread.Sleep(1000);
t.Abort();
Console.ReadLine();
}
private static void _worker() {
try {
while (true);
} catch (ThreadAbortException) {
// expected thread exit, don't rethrow
}
}
private static void _onBackgroundThreadCrash(object sender, UnhandledExceptionEventArgs e) {
Console.WriteLine(e.ExceptionObject as Exception);
}
}
Run Code Online (Sandbox Code Playgroud)
当遗留异常处理为“0”(OFF)时,上面的代码会如预期的那样安静地吞下 ThreadAbortException。
但是,当遗留异常处理为“1”时,上面的代码将 ThreadAbortException …