1)基于wireshark插件的方式,比如用Lua来作为胶水获取信息,然后连接到mysql
2) 或者脱离wireshark,使用基于winpcap的开发包对截包做分析,当然,一种是winpcap的开发包,那个就需要你自己去分析每个截包,然后自己类似wireshark的http插件一样构造高层的解析了,要么就是基于一些更强大的开发包(包括了对http的解析的)来处理,比如pcap.net这个包 ,在微软网站上,是基于.net对winpcap的封装并且还做了一些高层协议的扩展。 pcapdotnet.codeplex.com
批量写入,提高效率,最简单直接的办法就是:将txt文本作为一个数据源处理,而不是文件读取,这样,通过数据源,就可以直接批量读取为一个recordset,然后,直接写入数据库了。ps:这要求文本文件格式非常规律,如果不行,自己尝试在内存里面构建recordset吧。这个是需要做一些设置的。主要设置 rewriteBatchedStatements参数。原理如下:MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)。不过,驱动具体是怎么样批量执行的? 你是不是需要看一下内幕,才敢放心地使用这个选项? 下文会给出答案。
另外,有人说rewriteBatchedStatements只对INSERT有效,有人说它对UPDATE/DELETE也有效。为此我做了一些实验(详见下文),结论是: 这个选项对INSERT/UPDATE/DELETE都有效,只不过对INSERT它为会预先重排一下SQL语句。
注:本文使用的mysql驱动版本是5.1.12
实验记录:未打开rewriteBatchedStatements时
未打开rewriteBatchedStatements时,根据wireshark嗅探出的mysql报文可以看出,
batchDelete(10条记录) => 发送10次delete 请求
batchUpdate(10条记录) => 发送10次update 请求
batchInsert(10条记录) => 发送10次insert 请求
也就是说,batchXXX()的确不起作用
实验记录:打开了rewriteBatchedStatements后
打开rewriteBatchedStatements后,根据wireshark嗅探出的mysql报文可以看出
batchDelete(10条记录) => 发送一次请求,内容为”delete from t where id = 1delete from t where id = 2delete from t where id = 3….”
batchUpdate(10条记录) => 发送一次请求,内容为”update t set … where id = 1update t set … where id = 2update t set … where id = 3 …”
batchInsert(10条记录) => 发送一次请求,内容为”insert into t (…) values (…) , (…), (…)”
对delete和update,驱动所做的事就是把多条sql语句累积起来再一次性发出去;而对于insert,驱动则会把多条sql语句重写成一条风格很酷的sql语句,然后再发出去。 官方文档说,这种insert写法可以提高性能(”This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements”)
一个注意事项
需要注意的是,即使rewriteBatchedStatements=true, batchDelete()和batchUpdate()也不一定会走批量: 当batchSize <= 3时,驱动会宁愿一条一条地执行SQL。所以,如果你想验证rewriteBatchedStatements在你的系统里是否已经生效,记得要使用较大的batch.
更多细节看这个帖子:
blog.yemou.net/article/query/info/tytfjhfascvhzxcyt397
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)