小编Bor*_*rka的帖子

多个INSERT语句与具有多个VALUES的单个INSERT

我在使用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)

令我惊讶的是,结果与我的想法相反:

  • 1000 INSERT语句:290毫秒.
  • 1个带有1000个值的INSERT语句:2800毫秒.

测试直接在MSSQL Management …

sql t-sql sql-server performance sql-server-2008

117
推荐指数
3
解决办法
10万
查看次数

Oracle/JDBC:以ISO 8601格式检索TIMESTAMP WITH TIME ZONE值

关于部分内容已经说了很多(并且写在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本身得到了很好的支持).

具体来说,这是我不应该或不能做的:

  • 从TSTZ到Java Date,Time,Timestamp(例如通过JDBC getTimestamp()调用)的任何映射都不起作用,因为我丢失了TZ.
  • Oracle JDBC驱动程序没有提供将TSTZ映射到Java Calendar对象的任何方法(这可能是一个解决方案,但它不存在)
  • JDBC getString()可以工作,但是Oracle JDBC驱动程序返回格式为
    '2013-01-02 03:04:05.060708 +9:00'的字符串,这不符合ISO 8601(没有"T",TZ没有尾随0)等).此外,此格式在Oracle JDBC驱动程序实现中是硬编码的(!),它还忽略了JVM区域设置和Oracle会话格式设置(即它忽略了NLS_TIMESTAMP_TZ_FORMAT会话变量).
  • JDBC getObject()或getTIMESTAMPTZ()都返回Oracle的TIMESTAMPTZ对象,这实际上没用,因为它没有任何转换到Calendar(只有Date,Time和Timestamp),所以我们再次丢失TZ信息.

那么,这是我留下的选项:

  1. 使用JDBC getString(),并对其进行字符串操作以修复并使ISO 8601兼容.这很容易做到,但如果Oracle更改内部硬编码的getString()格式,则存在死亡的危险.另外,通过查看getString()源代码,似乎使用getString()也会导致一些性能损失.

  2. 使用Oracle DB"toString"转换:"SELECT TO_CHAR(tstz ...)EVENT_TIME ...".这很好,但有两个主要的不利因素:

    • 现在每个SELECT都必须包含TO_CHAR调用,这是一个令人头疼的记忆和写入
    • 现在每个SELECT都必须添加EVENT_TIME列"别名"(例如,需要自动将结果序列化为Json)
      .
  3. 使用Oracle的TIMESTAMPTZ java类并从其内部(记录的)字节数组结构中手动提取相关值(即实现我自己的toString()方法,Oracle忘记在那里实现).如果Oracle改变内部结构(不太可能)并且需要相对复杂的功能来实现和维护,这是有风险的.

  4. 我希望有第四个,很棒的选择,但是从整个网络上看也是如此 - 我看不到任何东西.

想法?意见?

UPDATE

下面给出了很多想法,但看起来没有正确的方法来做到这一点.就个人而言,我认为使用方法#1是最短且最易读的方式(并保持良好的性能,而不会丢失亚毫秒或基于SQL时间的查询功能).

这是我最终决定使用的:

String iso = rs.getString(col).replaceFirst(" ", "T");
Run Code Online (Sandbox Code Playgroud)

谢谢大家好的答案,
B.

java database timezone datetime jdbc

15
推荐指数
2
解决办法
2万
查看次数

TcpClient.GetStream().Read()vs. TcpClient.Client.Receive()

.NET允许两种非常类似的方式从网络"读取"(假设TCP连接):

1. TcpClient.GetStream().Read() 
2. TcpClient.Client.Receive()
Run Code Online (Sandbox Code Playgroud)

通过查看NetworkStream源代码 - 它似乎是底层套接字的额外包装器,最终调用Socket方法.

问题:使用"间接"NetworkStream变体(#1)的好处是什么,而不是使用Socket实现提供的直接包装器?

谢谢你,鲍里斯.

.net c# sockets

6
推荐指数
1
解决办法
7558
查看次数

具有多个本地网络接口的Socket.Bind和IP源路由

我写了一个在具有两个网络接口的系统(Win7)上运行的工具,每个网络接口链接到一个不同的子网,每个接口都有自己的网关,然后将其链接到两个单独的远程网络(每个网关后都有出站防火墙)。我正在通过使用Socket.Bind(在之前Connect)到每个相关NIC的IP地址来通过两个NIC启动传出TCP连接。第一个NIC工作正常,但是对于第二个NIC,我得到SocketException“尝试对不可达的网络进行套接字操作”

我最初的理解是,由于套接字绑定到具体的NIC本地端点(已定义网关),因此应该将连接路由到此网关,因此应该可以正常工作。但是,似乎源IP地址已被忽略,并且路由正在根据本地路由表运行(即,第二个NIC的连接请求转到第一个,默认,网络,并且由于子网错误而被拒绝)。

调整本地路由表会有所帮助,但这使我想知道套接字绑定到特定本地IP的能力背后的全部原因。

做一些额外的阅读后,我发现确实存在诸如“源IP路由”之类的东西,但是DisableIPSourceRouting由于安全原因,Windows默认情况下(通过注册表设置)将其禁用,例如:

问题:

  1. 如果我的最初理解是正确的(即Socket.Bind应该足够)–为什么不修改路由表就无法正常工作?
  2. 如果我的理解不正确(即被Socket.Bind忽略并使用路由)–拥有Socket.Bind有什么意义?为什么要这么做?
  3. 另外,我想更好地理解,启用源IP路由的实际风险是什么(最好是带有可能的利用示例)?
  4. 在不手动修改本地路由表的情况下解决需求的任何想法将不胜感激。

非常感谢。

sockets windows routing tcp

4
推荐指数
1
解决办法
2948
查看次数

LegacyUnhandledExceptionPolicy 不允许捕获(并吞下)ThreadAbortException?

我正在使用 .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 …

.net multithreading threadabortexception

4
推荐指数
1
解决办法
6884
查看次数