Posts
JieChen.Me
Cancel

需要对现有的类进行功能改进,但是又不想破坏现有类的结构,同时修改现有类有可能会引入bug,所以可以通过适配器的方式,把希望改进的功能挪到适配器中。属于事后弥补。 现有的类 一个发送纯文本短消息的接口和类。 public interface IMessageSender { public void Send(string words); } class TextSender : ...

最近在复习线性数据结构的时候,顺便拿了Java的ArrayList做了分析比较。ArrayList的本质是动态数组,当新加如的数据逼近数组容量时,自动扩容,删除数据后,自动收缩。这么做,虽然效率比较低,但是一定程度上能优化内存分配。 自动扩容 ArrayList内部有个elementData的Object数组,初始容量在Java 8中为10。当第11个数据需要添加时候,扩容1.5倍。这个...

诊断Java线程问题时,一直要求提供客户Java的线程堆。大部分时间都在指导客户怎么抓数据,非常浪费时间。曾经写了一个非常方便的脚本,但是用户一般都会纠结于参数的选择,效果不明显。 有兴趣的可以使用我的脚本 ajs2.sh #!/bin/bash #---------------------------------------------------------------------...

今天偶尔看JDBC驱动的问题,发现了一个有意思的事情,就是Class.forName()和SPI动态注册,原理居然是一样的,新瓶装旧酒。 老派的手工注册 JDBC很早以来一直采用驱动管理显式的注册方法,就是驱动类的使用者,显式地使用Class.forName()加载驱动类。 Class.forName("oracle.jdbc.driver.OracleDriver"); Connec...

When to run SQLView? If you have any issue of SQL data related, or you have to analyze SQL execution time, then use SQLView. The case could be like: No expected data from Search Duplicated r...

在给客户处理问题时候,用到了file命令,后来对file命令产生了兴趣,所以拿它和Java类文件的魔术判断做实验,这里记下一些实验的收货。 Java Class文件通过魔数来标识自身的编译版本。在Linux中,通过 xxd,可以看到十六进制头部信息。 $ xxd CookieExample.class | head -2 0000000: cafe babe 0000 0034 00e...

本周有个客户报数据库出现大量的INACTIVE SESSION,数据库无法及时清除,导致超出进程限制,应用的其他请求无法得到响应。整个排错的思路很清晰,记录之。 System parameters with non-default values: processes = 1000 ORA-00020: maximum number of processe...

产品的故障诊断,都需要依靠日志文件中的异常栈来判断。很多时候,我不得不需要客户提供真实的数据库,一点点去调试。而客户提供的日志文件,很多时候都没有参考价值。原因就在于我们的代码中,Exception捕获的处理方式太随意,不注重后续跟踪。 Exception处理很容易被程序员忽略,大家都不注重,以为只要抛出来就对了,因为觉得它太简单了,too simple 所以 nobody cares。我...

今天为客户解决了一个奇葩的SSL问题。通过Java代码使用HttpURLConnection去连接https系统时候总是报错handshake_failure。而使用浏览器访问一切正常。记录下诊断的过程。 HttpURLConnection的调用非常简单。 HttpURLConnection connection = (HttpURLConnection)m_url.openConn...

我一般用Python处理数据文件,比如分析日志,转换文件等。比如我开发的Oracle内部使用的SQLView工具就是基于Jython/Python,对产生的Weblogic JDBC分析并生成最直接可视的报表。套用现在最装B的说法,就是数据可视化。 SQLView的脚本比较复杂,它需要对不同行进行交叉引用分析。而下面的这个例子,是把一个CSV文件转换成HTML文件。将复杂的数据生成彩色的H...