我有一台机器在一天开始时(早上12点)创建一个新的日志文件,并在每天结束时发生任何更改时更新日志文件。
很多
答案 0 :(得分:1)
您可以使用反转时间戳记录每个新行。
由于您只需要在文件更改时进行日志记录,因此可以实现内存队列 从文件中读取并存储数据。 然后实现生产者消费者模型,其中一个线程从队列中读取并加载数据,并且消费者记录到数据库。 然后,Windows服务可以继续从队列中读取并登录到SQL Server。 (因为它是生产者消费者,所以在队列为空的情况下不会有任何忙碌的等待)
不知何故,每当完成每个日志时,您还必须通知生产者线程。这可以通过套接字/或其他方式完成,以防您有权访问正在进行日志记录的代码。
答案 1 :(得分:1)
如果您无法控制生成该文件的应用程序,那么除了轮询该文件之外您别无选择。编写定期轮询文件并将增量写入数据库的应用程序。应用程序需要记录它上次读取的高水位标记。
另一个问题是,如果应用程序在写入之间没有关闭文件,则可能不会更新上次访问的时间戳,因此检查文件的年龄可能不可靠。在这种情况下,您需要实现类似此过程的内容:
您需要确保读取的字节数与文件搜索位置一致。如果日志文件是unicode,那么它可能没有字节和字符之间的1:1映射。您可能需要以二进制模式读取文件的块,并从缓冲区转换为字符。
一旦解析了日志文件条目,就可以插入数据,或者使用SQLBulkCopy来处理更大的数据量。
如果您可以放宽延迟约束并且日志文件足够小,那么您可能只需实现一个将日志文件复制到临时区域并定期重新加载整个文件的进程。
答案 2 :(得分:0)
SQL Server计划作业调用SSIS包怎么样?