以前一直用数据库、JDBC、Hibernate。只知道事务有四个特性而没有深入探究一下
最近想测试一下他们到底是什么样的,还有各种各样的并发效果是什么样的。就自己搞了一个测试。
因为常规的JDBC插入数据、读取数据都基本上算是“瞬时”的,效果感觉很难扑捉,就想到了使用插入读取大对象(CLOB/BLOB)。并且使用 SocketInputStream 进行对象的“入库”(可以通过限制SocketInputStream 传输速度使一个JDBC事务延长到几秒、几十秒、等等)。 然后在“出库”时也进行了输入流的手动延阻。
最终效果什么的都实现了、 测试也挺不错。 但是这个 SocketInputStream 却遇到了好几个问题。。。
第一个就是代理了、 因为实验室的网使用了代理,需要使用Proxy 。这个很容易了
第二个就是网络主机的屏蔽网络爬虫 。。。 这个问题在我琢磨了之后,感觉网络主机理论上除了通过请求参数判断我是否是爬虫之外没有其他的办法屏蔽我的, 通过模仿火狐请求的头参数也顺利通过了
第三个就是网络主机返回的数据是压缩的gzip,刚开始没有注意,只见每次得到的数据都是乱码。后来查资料才明白是java不能解析gzip 格式而导致的。
第四个问题现在还不太明白, 就是测试多了之后,突然出现了网络主机给我500错误 , 我把请求参数更改之后问题问题又没了。。。。挺蛋疼的
/**
* 获取网络输入流、 异常随意抛了
**/
public static InputStream getInputStream() throws Exception {
final String CONN_URL = "http://www.iteye.com";
// 配置代理。。。
SocketAddress proxyAddress = new InetSocketAddress("172.20.92.22",3129);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
URL url = new URL(CONN_URL);
URLConnection conn = url.openConnection(proxy);
// 设置请求参数。如果没有参数,经常会被主机服务器当做网络爬虫拒绝请求
conn.addRequestProperty("Host", "www.iteye.com");
conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0");
conn.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
conn.addRequestProperty("Accept-Language", "zh-cn,zh;q=0.5");
// conn.addRequestProperty("Accept-Encoding", "gzip, deflate");
conn.addRequestProperty("Accept-Charset", "utf-8;q=0.7,*;q=0.7");
conn.addRequestProperty("Connection", "keep-alive");
return conn.getInputStream();
}