Flash初哥

January 23, 2010

Python 不是 Java

Filed under: Java相關,Python — Tags: , — KAV @ 11:42 am

我最近正在看一个基于wxPython的GUI应用程序,大概45.5KLOC的样子,但我没有计算它用到的库的大小(如Twisted)。代码是由那些对Python相对生疏的Java的开发者写的,所以程序有很严重的性能问题(如三十秒的启动时间)。我在检查代码的时候发现他们写了很多对 Java有意义但是对Python却很恐怖的东西。并不是因为“Python比Java慢”,而是因为在Python中有更方便的方法去完成同样的目标,甚至在Java中不可能的事情。

所以,可悲的事就是这些可怜人事倍功半,产生了很多很多不需要写的代码,从而比相应合乎Python习惯的写法慢得多得多。我们来看一些例子:

*

在Java中一个静态的方法(static)不能翻译成一个Python的类方法(classmethod)。哦,当然,多多少少他最终产生类似的效果,但类方法的目的实际上是做了一些通常在Java中不可能的事(如继承一个非默认的构造函数)。Java静态方法的习惯翻译通常是一个模块级函数,而不是一个类方法或静态方法(staticmethod)。(同时静态封闭(final)字段应该翻译成模块级常量。)

这并不是一个性能上的问题,但是一个Python程序员要用像这些类似Java习惯的代码的话,可能就会被在该输入Foo.someFunction时却要输入Foo.Foo.someMethod这种情况给惹毛了。但是请注意:调用一个类方法将会比调用一个静态方法和函数要多一部分额外的内存。

啊,那些Foo.Bar.Baz也不是省油的。在Java中,这些点分割的名称是由编译器去查找的,所以运行时根本无所谓你有多少点。在Python中,每次运行时都要查找,所以每个点都要计算在内。(Python中一定要记住这点,“平铺比嵌套好”,尽管比起性能,他和“可读性”和“简单就是美”更靠近。)
* 要用switch语句?Python翻译将是一个哈希表,不是一堆if-then语句。用一堆if-then在Java中也不是switch语句,如果有字符串参与了呢?他其实是一个哈希表。CPython字典实现用了性能最佳—在我们宇宙中目前所知道的—的哈希表的实现之一。你自己所写的代码也不会比这个再好了,除非你是 Guido、Tim Peters和Raymond Hettinger的“私生子”——还是遗传增强了的。
*

XML不是答案。它也不是一个问题。要在正则表达式上解释Jamie Zawinski,“一些人,当遇到一个问题的时候,就想‘我知道,我要用XML’那这个时候,他们就有两个问题了。”

和 Java比这个一个不同的情况,因为比起Java代码,XML是轻巧而且有弹性的。但比起Python的代码来,XML就是一个船锚,一个绊脚石。在 Python中,XML是用来做交换,而不是你的核心功能,因为你不需要这么做。在Java中,XML可能是你的大救星因为他让你实现了特定领域的语言并 “不通过编码”提高了你的应用程序的适应性。在Java中,避免编码是一个很大的优势,因为编码意味着重新编译。但在Python中,更常见的是,写代码比写XML更方便简单。同时Python处理代码要远远比处理XML快。(不仅仅是这个,你必须书XML处理代码,同时Python自身就已经为你准备好了。)

如果你是一个Java程序员,对于你是否要在你的Python核心应用中使用XML作为一部分,不要相信你的本能。如果你不是因为信息交互的原因去实现一个已经存在的XML标准或是建立某种导入、导出格式或者建立某种XML编辑器或处理工具,那么就不要这么做。一次也别。甚至连想都不要想。现在,扔掉那个XML模式把你的手解放吧!如果你的应用程序或者平台要被Python开发者使用,他们只会感谢你不要在他们的工作量中添加使用XML的负担。

(这里唯一的例外是如果你的受众的的确确,确确实实需要XML,出于某种奇怪的理由。像,他们拒绝学习 Python并只对你使用了XML而付钱给你,或者你打算给他们一个编辑XML的GUI,同时这个写XML的GUI呢是另一个人写的,同时你得到免费使用的权利。还有一些很少见的架构上的原因需要用到XML。相信我,他们不会出现在你的程序中。如果有疑问,对一个资深的Python开发员解释你的用例。或者,如果你脸皮厚的话,试试向一个Lisp程序解释你的程序为什么要用XML!)
*

Getter 和setter是坏蛋。坏蛋,魔鬼!Python对象不是Java Bean。不要写什么getter和setter,然后还把它们包装在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,否则,不要写getter和setter。它们是CPU时间的浪费,更要紧的是,它们还是程序员宝贵时间的极大浪费。不仅仅对于写代码和测试的人,对于那些要阅读和理解它们的人也是。

在Java中,你必须使用getter和setter因为公共字段不允许你以后改变想法再去使用 getter和setter。在Python中,这样做很傻,因为你可以以一个普通特性开始并可以在任何时间改变你的想法,而不用影响到这个类的任何客户。所以不要写getter和setter。
*

代码重复在Java中常常是一个不得不要的魔鬼,你必须经常一遍一遍写同一个方法而只有一点点的变化(通常是因为静态类型约束)。在Python中这样做是没有必要的也是不值得的(除了极少数一些特定的场合需要内联一些要求性能的函数)。如果你发现自己一遍一遍在写同样的代码而且变化很少,你就需要去学一下闭包。他们并不是真的很可怕。

这就是你要做的。你写了一个包含了函数的函数。这里内部的函数就是你要一遍遍写的函数的模版,但是在里面加入了针对不同情况的函数要使用变量。外部的函数需要刚刚提高的那种变量作为参数,并且将内部的函数作为结果返回。然后,每次你要写另一种略微不同的函数的时候,你只要调用这个外部的函数,并且把返回值赋给你要让“重复”函数出现的名字。现在,如果你需要改变这个工作方式,你只要改变一个地方:这个模版。

在我所看过的应用程序/平台中,只有一个很微不足道的程序使用了这个技术之后可以去掉数百行重复代码。事实上,自从开发者使用了特别的样板文件来为这平台开发插件,这会节省很多很多第三方开发人员的代码,同时也使那些程序员要学习的东西简化了。

这只是Java->Python思维方式转变的冰山一角而已,现在我可以让他转变成正确的而不用钻研这个程序的细节。本质上,如果你曾经用过一段时间Java,而且对Python比较陌生,不要太相信自己的本能。你的本能已经为Java调节,而不是Python。向后退一步,最重要的,不要写这么多代码了。

要这样做,让自己觉得更加需要Python。假装好像Python是可以做任何你想做的魔棒,却让你无须动一个手指。问一下,“Python是怎样解决我的问题的?”还有“Python语言的哪个特点和我的问题最相似?”你绝对会惊讶于你需要的东西其实已经有了某种固定形式。事实上,这种现象实在是太普遍了,甚至在很有经验的Python程序员中也会出现,以至于Python社区中给这种现象起了个名字。我们称之为“GUIDO的时间机器” (GUIDO是美语中太空飞行工程师的意思),因为有时候看上去得到我们所需要的东西好像只有他知道的一种方法,但当我们自己知道了就不一样了。

所以,如果你不能感到你在使用Python时至少比用Java要多出10倍的生产力,!(同时如果你还怀念你的Java IDE,考虑一下这种可能性:因为你写的Python程序比他所需要的要复杂得多)

附录:(翻译自此篇文章的评论)

确实,哈希表==字典。举个最简单的例子,从Python

标准库中检出“pickle”和“copy”模块,这两个模块会从字典中查找类型并调用相应的函数。另一个有些诡异的例子是范型函数,我已经在最近的Blog中写了一下。

关于闭包的例子,我这里给出一个很笨的例子。假设你要写很多这样的函数:

def addOne(x): return x+1
def addTwo(x): return x+2

然后你可以这样写:

def makeAdder(addend):
... def add_it(x): return x+addend
... return add_it

并且这样使用:

addOne = makeAdder(1)
addTwo = makeAdder(2)

这样就可以等同于原来的定义了。

相关资料:http://www.razorvine.net/python/PythonForJavaProgrammers

[Python]略谈Python语言

Filed under: 未想到分類 — Tags: — KAV @ 11:27 am

对于许多程序员来说,Python的大名应该有所耳闻。而对于Python的评论大多褒贬不一。有的甚至说Python是以其慢速运行而闻名于世。在此我并不是要去评论别人的对于错,我只是站在一个比较客观的角度来谈谈Python这一计算机语言。
Python是一种解释性语言,而且属于OpenSource的项目。但是,你可以将其用于商业用途。并且可以将其放在商业的产品光盘中一同发售。当然,人们也可以从www.Python.org或者OpenSource的网站上免费获得其安装程序或者源代码。Python最初是在苹果计算机上被编译成功的,但现在他已经可以运行于世界上主流的操作平台之上了。他不只有Windows版本的。同时还有Linux,Unix等很多平台上都可以使用他,在RedHat9中,还将其作为开发必须的一项语言被安装。对于Python的代码类型,基本可分为3种,分别是字节代码,二进制代码,优化代码。他们的后缀名分别是.py .pyc .pyo 这些代码都可以直接运行。无需做任何的编译或者连接。而在使用这些类型的代码上,Python会更具不同的情况选择不同的类型。如下:

#!/usr/bin/python
#MyPython.py
class python:
def __init__(self):
self.name=’python’
def yourname(self):
print self.name

#!/usr/bin/python
#main.py
import MyPython
py=MyPython.python
py.yourname()

在运行时,Python会检测在main.py的当前目录中有没有MyPython.pyc文件,如果没有那么导入MyPython.py并且同时生成MyPython.pyc为下次更快的导入做好准备。这样,可以减少不少初始化的时间。而且,这一切无需用户介入,Python会自动完成。对于其语法,不的不承认,他的语法是众多其他语言中相对简单的,他排除了许多繁琐的思索。如下:

#!/usr/bin/python
a=2003
print a
a=’Hello python’
print a
a=[2,0,0,3]
print a[0]

以上的代码可以被正常运行,其结果如下:

2003
Hello python
2

如果是C++至少需要声明3组变量。而对于Python一个变量就可以了。不但如此,Python的对代码块的管理也有他的独特之处。下面是Python与C++对于同样一个While循环的比较

#!/usr/bin/python
#python source
a=0
while (a< =10):
a=a+1
print 'The number is '+a
print 'while is end'

//Build by G++ or VC++
//C++ Source
#include
int main()
{
while(a< =10)
{
a=a+1;
cout<<"The number is "< }
cout<<"while is end";
return 0;
}

对于以上代码的比较,可以看出,C++等语言是以{}来管理块的,而Python是以缩进来管理的。这样做的确有他的优越性。相信许多程序员都有过漏去{}的经历。如果,使用的编译器或者解释器优秀的话,你的确可以非常容易的加上漏去的{}。但是,如果不是这样,我想你会在复杂的代码中开始漫游了。因为,可能你的编译器会告诉你一个错误的错误信息,这个错误的位置可能会离你真正错误的地方很远(大概有十万八千里吧)。相对于此,以缩进管理方式的 Python来说,程序员几乎不用考虑这种问题。其次以缩进方式区分块的Python在进行复杂的嵌套中,Python代码就显得明了许多了。如下面的 Python与C++在嵌套上的比较:

#!/usr/bin/python
#python source
class python:
def Hello(self):
print 'Hello'
def count(n):
in=0
while(in<=n):
in=in+1
print in

//buile by G++ or VC++
//C++ Source
#include
int main()
{
class python
{
public:
void Hello(void)
{
cout< <"Hello"< }
void count(int n)
{
int in=0;
while(in<=n)
{
in=in+1;
cout< }
}
};
return 0;
}

相比较来看,Python的代码更能分清其层次,而对于C++这样的代码虽然能够编译成功。但是,对于其日后的维护,会造成无尽的痛苦。同时,就在我刚才写C++Source的时候,也差点漏了};。由此,可以看出Python的语法简洁。同时,他的出错能力也非常强。在一般情况下,Python的解释器能够准确指出错误的位置和原因。如下面的代码:

#!/usr/bin/python
import A
a=0
print _a
_a=b

运行以上的代码Python将抛出如下的错误信息:
Traceback (most recent call last):
File "E:\source.py", line 1, in ?
import A
ImportError: No module named A

Traceback (most recent call last):
File "E:\source.py", line 3, in ?
print _a
NameError: name '_a' is not defined

Traceback (most recent call last):
File "E:\source.py", line 4, in ?
_a=b
NameError: name 'b' is not defined
可以很容易的看出错误的原因和位置。在这种机制中当你调试复杂的程序时,你不用担心不能快速的解决问题。你只要按照Python的错误提示,一步步修正就可以了。
对于Python的应用范围,我个人大概的将其分为三类。
第一类时软件类,这我想不说大家也应该很清楚的。相对于C++等语言,Python的优势在于他的快速开发和代码开放。对于Python,你可以开一个记事本或者Kwriter来编写代码,然后保存,运行就可以了。即使再复杂的代码也是如此。这大大减少了开发周期,加快了开发速度。相对于传统的编辑,编译,连接运行。Python可时少了不少的麻烦。三步并两一步。又由于Python的简洁的代码和短暂的培训时间,所以,对于软件的开发和维护都变得非常容易。而Python的代码解释性,对于用户而言,只要安装有Python以后,对于Python的软件就不必再安装Python了。对软件直接运行也可以,有一劳永逸的感觉。而对于开发者来说,产品的更新和修复更加容易。或许只要使用用户浏览一张网页的时间,就可以从根本上修复产品中的Bug。这要感谢Python的代码重用和灵活的代码管理。而对于再用户处发生的错误,开发者可以更具Python自带的错误诊断来得知情况。而且,在网上有很多有关Python的代码库,而且,这些都是免费的,对于开发的企业来说,可以节省一笔相当可观的开发资金。所以说,Python在软件市场也有其的特点和市场。
第二类是网络类,随着现代网络的飞速发展。各种网络服务器脚本纷纷涌现。Perl,PHP,ASP等等都占一席之地。而Python自然也能应用于此。相对于PHP和ASP。Python能够实现从服务器软件到服务器脚本的所有功能。其中ZOPE服务器软件便是很好的例子。对于网络,Python有一组模块是专门针对它的。其中有Socket CGI和SocketServer等等,当然,Python也能够和一些大规模数据库很好的支持。甚至可以直接与他们连接无需通过其他的中间插件。应用 Python强大的支持和Python简洁的代码。相信你可以在断时间内写出出色的动态网站。
第三类是教育类。Python最初就是为了教育而开发的一种语言。应用于教育当然是情理之中的事情。在程序员中,如果你询问他们的入门语言是什么,我想许多都会说Basic更多的人说VB。其实,Basic并非最好的入门级语言。暂且不论Basic没有OOP的编程思想。在代码运行的时候还要编译和连接,虽然Basic和Python一样是解释性语言。而其语法实在让人无法忍受,比如在判断语句后要加then代替C++中的{}的确有些落伍了。对于学习编程更主要的是学习如何去用语言去思索。明白程序是如何运作的,更要知道,一些程序的基本编程思想。这一切是Python所能做到的。Python的编程思路和语法更像C++而且,支持类编程和代码重用。不论从何种角度来看,Python在让初学者了解编程是怎么一回事上是最好的语言。而Python另一个功能——即时运行。也为初学者学习编程增加不少的方便。如下在运行Python解释器后,如下运行:
>>>print ‘Hello Python’
Hello Python
这个对于初学者很重要,因为他们可以运用这种机制一行行输入代码,看看代码发生了什么作用。了解程序是如何运行的。这个对于深入编程是很重要的。而且,对于初学者的疑问,这种机制可以方便的解决其疑问。而对于初学者的独特想法,这种机制能够让初学者更快的得到这种想法的可行性。在资金上,如果对于普通的中小学高中等为了让学生学一些编程思想就花几千元卖一套VisualBasic实在是大材小用了。而且,VisualBasic必须运行于Windows这样,大家又要为每台计算机花一千多卖操作系统。这样一来教学机构可是要花费相当可观的一笔资金。而Python是免费的,许多资源都是免费的。而且 Python也可以运行于免费的Linux系统上。所以,总体来说比使用VB的资金投入就更小了。
当然,任何事物都有它的两面性。人们不是常说,科学是一把双刃剑么?不错Python也有他不足的地方。首先,是函数的定义,代码如下:

def myfunction(number):
return number+10

这段代码只看函数的定义时不能知道myfunction返回是什么类型的数据,而number也不知道是什么数据类型。只有深入代码本身才可以了解这一切。再看看如下的代码:

#!/usr/bin/python
class myclass:
def __init__(self):
self.name=’myclass’
def nothing(self):

print ‘end’

看来这个代码一切正常,nothing方法什么都不做。但在运行时Python会提示nothing有错误,并会波及到下面的代码。所以,不得不如此定义:

#!/usr/bin/python
class myclass:
def __init__(self):
self.name=’myclass’
def nothing(self):
return

print ‘end’

同时,我在最初所说的速度慢也是一个事实。不过,根据Python官方网站的报道。最新的Python2.3在速度上由于采用新的算法。所以,比以前的版本快30%左右。对于Python自带的GUI模块Tkinter,其中文支持相当不好。必须对其中显示和接收的中文转成unicode的才可以。不过,由于Python的众多库的支持。GUI也可以用wxPython写。他对中文的支持非常好,而且功能非常强大,几乎可以取代Python自带的Tkinter成为流行的GUI。最后是Python没有优秀的IDE环境,虽然这对于熟悉Python的人来说并不重要,但是对于吸引人们使用Python的确少些说服力。
对于Python的未来,我觉得非常看好。首先,Python的代码运行机制非常类似于Java语言。同样可以拥有字节代码和二进制代码的运行方法。甚至比Java在代码的运行上更灵活。再来,Python的语法更为稳定,由于Python是一个解释器中的老前辈,所以,在多年的开发中成为一个相对稳定和完善的语言。Python的模块也不像Java那么复杂,编写也更为快捷。所以,Python未来将向Java这一方向发展。可能将会用于移动设备的开发。同时,网络的支持也自然会提高,虽然,Python的网络支持已经相当完善甚至超越了现在许多的网络脚本。但是,网络的日新月异Python必须更加更新才可以。比如XML技术,虽然现在的Python也支持,但是XML模块的运行速度还是比较慢。在程序的开发上,Python有其优势。不单是由于他的本地程序的支持非常好,对于网络的支持也超乎许多人的意料。在教学方向,Python以其简洁易懂的代码能够成为学习就算机语言的流行语言之一。
(more…)

[Python]Python處理Big5

Filed under: Python,未想到分類 — Tags: — KAV @ 11:24 am

GB码与BIG5是中国人常用的两种编码集。GB码为大陆使用,BIG5为香港与台湾使用。每个编码都由2个字符构成,高字节在前,低字节在后。下面我将使用Python实现的编码转换的程序向大家作一个介绍。关于编码的一些知识大家可以去网上查找,本人不再赘述。 GB码是大陆使用的编码集。以前使用的为GB-2312编程,它只有常用字,字数有限。后国家制定了新的GBK编码,汉字已经达到了2万多。GBK完全兼容原GB-2312编码,也就是说一个GB2312的编码在GBK上是一模一样的。这里所介绍的转换是以GBK为基础的,因此适用性很广。GBK编码中不仅包括了原GB-2312编码,同时也包括了许多简码的繁体码,同时还有许多的符号与不常用汉字。GBK编码的范围是:高字节从0×81到0xFE,低字节从0×40到0xFE,同时不包括0x7F。这样如果我们将其排成一个矩形,看上去就少了xx7F一根线。
(more…)

[Python]Python學習筆記17-Python多線程(Python Multi-Threading)

Filed under: Python — Tags: , , — KAV @ 3:03 am
?View Code PYTHON
#!/usr/bin/env python
#coding=utf-8
import threading
 
class ThreadGo:
 
 
    def Post(self,numThread,urls):
        threads = []
        threadcount = numThread
        for i in range(threadcount):
            t = threading.Thread(
                target=self.__postTopic,
                kwargs={'_url':i}
            )
            threads.append(t)
        for i in range(threadcount):
            threads[i].start()
 
        for i in range(threadcount):
            threads[i].join()
        print 'All Done'
 
 
    def __postTopic(self,**para):
        print para['_url']

eWeek 权威测试显示MySQL 4.0.1 可与Oracle 9i 媲美

Filed under: Mysql — Tags: , — KAV @ 2:42 am

eWEEK Labs/PC Labs 可以说是做基准测试的老大了,早在 1993年 10月份他们的姐妹杂志 PC Magazine 就做过同样的测试。这次和 PC Magazine 合作测试了五种数据库在 Java 应用服务器上的表现,结果显示 MySQL 最新的 4.0.1 版本性能可以和 Oracle 9i 媲美, 垫低的当然是微软的 SQL Server 2000 。 :-)
测试的这五种数据库是:IBM 的 DB2 7.2 FixPack 5,微软的 SQL Server 2000 企业版 SP2, MySQL AB 的 MySQL 4.0.1 Max, Oracle 的 Oracle9i 企业版 9.0.1.1.1 以及 Sybase 的 ASE (Adaptive Server Enterprise) 12.5.0.1。

测试兼容性也是基准测试的一个主要目的,所有的数据库都在同样的硬件条件下测试:
HP NetServer LT 6000r 带有四颗 700MHz Xeon CPU, 2GB 内存以及 24 台 10000 rpm 的 9.1GB Ultra3 SCSI 磁盘,操作系统为 Windows 2000 Advanced Server SP2。

测试的应用程序是一个叫做 Nile 的基于 Web 的书店应用。Nile 采用了 Empirix 公司的测试套件 6.0 ,能加载 50 到 10000 个并发用户。

测试采用的应用服务器是 BEA 的 WebLogic 6.1 SP1,并用 JSP 编写了 Nile 应用。

每种测试运行一个小时产生五万张订单,15 万到 20万相关的记录数,我们得到的最好的伸缩性是在两台 6路 HP NetServer LT 6000r ( 4GB 内存,千兆网卡)服务器上运行6个 WebLogic 例程。HTTP 流量均衡的分配到这六个例程中。

测试的总体结果显示 Oracle9i 和 MySQL 有最好的性能和伸缩性,但是 9i 仅仅略微比 MySQL 好一些,ASE, DB2, Oracle9i 和 MySQL 到达 550 个并发用户时已经“力不从心”了,ASE 的性能下降到了每秒 500 个页面,比 9i 和 MySQL 要低 100 个页面,DB2 在高负荷情况下,性能下降也很厉害,只有每秒 200 个页面了。

由于 JDBC 驱动存在问题,SQL Server 在整个测试中都只能达到每秒 200 个页面。

驱动,内存优化和数据库设计问题是影响性能的主要因素,经过手工细调后的性能会和没有调优的性能差两倍。

Oracle 和 MySQL 的驱动具有完整的 JDBC 特色和稳定性(MySQL的员工采用了Mark Matthews 编写的 JDBC 驱动,因为他们没有自己的 JDBC 驱动程序)。

为各种数据库找到最好的内存配置是一件具有挑战性的工作,我们在这个问题上花了好几天。

SQL Server 和 MySQL 的配置最简单,而 Oracle9i 是最复杂的。 9i 采用了很多独立的内存缓冲,每个数据库连接需要消耗很大的内存(大约 400KB),而 DB2 只需要 177 KB, SQL Server, MySQL 和 ASE 都只需要 50KB 就够了,结果是 9i 的数据和执行计划的缓冲就比别的数据库要小。

MySQL 的高性能源自采用了内存内的查询结果集缓冲,这是 4.0.1 的新特色,我们不采用这个缓冲的话, MySQL 的性能会下降三分之二。另外, MySQL 的员工还根据表的不同采用不同的数据库引擎。

所有的订单表采用 MySQL 的 InnoDB 引擎(支持事务,行锁,多版本同步),目录和用户表则不需要事务支持,采用了 MySQL 的轻量的,非事务的 MyISAM 引擎。

MySQL 4.0.1 的新引入的高速查询缓冲引人注目,其他的数据库没有这个特色。如果查询的文本具有和缓冲中一模一样的匹配的话,MySQL 能直接从缓冲去数据,而不需要编译查询语句,取锁或者搜索索引,这项技术在表不被经常更新的情况下十分有用。

微软的 SQL 2000 虽然在 Java 平台上没有上好表现,但是当我们用 ASP.Net 重写基准测试,并采用 IIS 5.0 ,和 OLE DB 连接,得到的结果或许会让 Bill Gates 松口气,每秒 870 个页面。

在测试前,我们邀请五家公司派员参与测试,只有 MySQL 和 Sybase 欣然前往,IBM 只是答应通过电子邮件交流,微软和 Oracle 都拒绝参加。因此他们的数据库调整都是我们代劳的。

在测试中,我们惊奇的发现驱动程序是问题的最大根源。

在五种被测试的数据库中,只有 9i 和 MySQL 能连续运行 Nile 8个小时,DB2 的 JDBC 驱动不支持可更新的结果集,因此我们只能打开所有的结果集(采用 CONCUR_READ_ONLY),采用 SQL update 语句来更新,最终还是通过了 8个小时的稳定性测试。

在采用 Sybase 的 JConnect 5.5 驱动时,我们发现当应用请求的结果集包含双向游标时,JConnect 把整个结果集存储在客户端的内存里来增加后续游标的命令处理速度,这项工作在低负荷时还马马虎虎,但是当用户达到上百时,应用服务器消耗了几百兆的内存。 结果不到 8 个小时,我们的 6个 应用服务器进程统统挂起了。

为了解决这个问题,我们把应用的浏览逻辑重新改写,只采用前向游标(JConnect 不在客户端内存缓冲),为了保证查阅到前面的图书,我们需要把相同的查询运行两遍,得到图书的总数然后得到图书的数据,这样就影响了 ASE 的性能。

但是,这样做的结果是 ASE 的能整夜的跑基准测试,客户端能从 C/S 结构的应用中获益,但是对于应用服务器而言,这是一个可怜的选择。

微软的 JDBC 设计有缺陷,在 WebLogic 的控制台上我们发现每次 Java 虚拟机作garbage collection,释放出来的内存就少了一些,所以微软的 JDBC 驱动用不到 8 小时就歇菜了。

从 PHP 代码分析 PHP 的 GC(垃圾回收) 机制

Filed under: PHP — Tags: — KAV @ 2:37 am

永久链接: 从 PHP 代码分析 PHP 的 GC(垃圾回收) 机制
Email/MSN/Gtalk: hy0kle@gmail.com
Time: 2009.11.07

众所周知, PHP 引擎本身是用 C 写的,提到 C 不能不提的就是 GC(垃圾回收).通过 PHP 手册我 们了解到, PHP 引擎会自动进行 GC 动作.那么我们不禁要问,到底它是怎么回收的, & 引用操作是不是指针, unset()了一个变量时它是不是真的被回收了呢?这些看似手册有提及的问题,如果仔细分析会发现,远没有那么简单泛泛.也许有人会跳出来说:看 PHP源码不就知道了.是的,等你通读了 PHP 源码后这个问题肯定不在话下了,然本篇要仅从 PHP本身来分析这些看似平常却被忽视的小细节,当然了,其中难免水平所限,有所疏漏,热烈欢迎广大 phper 来共同讨论.
(more…)

Oracle为什么不会干掉MySQL(转自IT168)

Filed under: 未想到分類 — Tags: — KAV @ 2:32 am

曾经有人推断Oracle通过收购SUN进而取得近年表现得越来越勇的开源数据库MySQL,从而可以顺理成章地将其处死,但MySQL的前任首席执行官Mårten Mickos却有不同的看法,相反Oracle急需MySQL。

Oracle首席执行官拉里埃利森可能会成为开源的朋友,因为MySQL可以用来对付Oracle的长期敌人微软。SUN去年以10亿美元的价 格收购了MySQL,传言Oracle也是其中的投标人,不过现在Oracle却从SUN手中明显捡了个便宜(除了现金和债务外,Oracle只给了 SUN 56亿美元)。

以下是上周一《财富》杂志对Mickos的采访记录。

财富:你对于Oracle收购SUN这一事件的第一反应是什么?

Mickos:有点吃惊,但不是非常吃惊,Oracle公司有钱,也是一家具有长期战略眼光的公司,它们进入应用程序领域与SAP展开竞争,从目前来看似乎已经成功了,现在它们又想与微软展开竞争了。

微软的数据库业务增长速度非常惊人,Oracle可以使用MySQL拉拢规模非常庞大的开发者社区。但这并不会危害到Oracle的数据库业 务,虽然MySQL的增长速度接近疯狂,但MySQL主要用于基于Web的应用程序,而Oracle主要用于老的,传统的应用程序。

不可否认Oracle可以干掉MySQL,但我认为他们肯定不会这么做,拉里埃利森可是个聪明的人,当我离开的时候MySQL每天的下载量达到了7万次,对年轻开发人员特别有吸引力,对于Oracle来说MySQL业务发展有着重要的意义。

财富:这笔交易对MySQL开发者社区有何影响?

Mickos:任何流行的开发项目都有多个社区,他们不在乎谁拥有它,他们在乎的是社区是否能够使用,MySQL的装机量已经达到了1200万,也许只有你和我会注意这件事情,但很多开发人员甚至不知道现在MySQL已经属于SUN了。

InnoDB(2005年已将其收购)仍然非常流行,Oracle可能会独立运作MySQL,MySQL的力量是它的开放性,而Oracle不 同,它们没有公开它们的bug数据库,如果MySQL将来也不公开,那将会逐渐失去其市场优势。MySQL的一个优势是它的商业模式,但我相信 Oracle的管理人员能够懂得这一点。

财富:那拉里的反开源叫嚣是虚张声势吗?

Mickos:是的,我认为他已经喜欢上开源了,我只是猜测,但他是一个可以跳出盒子思考的思想家,他一定会用MySQL与微软展开有力的竞争,微软一直是拉里最喜欢的敌人。

Borland被Micro Focus收购了!

Filed under: 未想到分類 — Tags: — KAV @ 1:08 am

Borland被Micro Focus收购了!突然在网上看到这样一条消息。虽然Borland这家曾经辉煌的公司淡出我的视线很久了,但是当真的看到被收购的消息,还是多少有些不 敢相信。2008年,也就是一年前的今天,以那么无奈的名字存活的原Borland IDE 业务子公司 CodeGear 被 Embarcadero以2300万美元收购收购了。今日Borland自己终于也还是没有走出困境。
(more…)

Oracle收购SUN后,10大值得关注焦点

Filed under: Java相關 — Tags: , — KAV @ 12:54 am

[ZDNet李宁报道]oracle收购sun,已经在业界引起了轩然大波,下面我整理了认为值得关注的10个焦点。

1 MySQL是死是活?

MySQL作为SUN在业绩不好的情况下,仍然挥霍10亿美金购得的资产前途如何?有人分析,干掉MySQL可以让Oracle数据库得到更多的市场机会。但Oracle数据库主要走高端路线,MySQL是中小型市场的选择。干掉MySQL,就意味着Oracle要说服中小型用户去选择昂贵的Oracle数据库产品,或者等于把潜在用户赶到微软SQL Server 数据库的怀抱。所以,让MySQL和Oracle数据库分别在低端和高端市场平衡前行才是一个不坏的选择。

2 Java 社区发扬光大?

Java作为SUN的计算机语言,10多年来已经成为软件社区的一个品牌和开放的产业标准。SUN在近些年什麽都可以改变,就是Java牢牢地攥着自己的手里。Oracle通过收购得到Java,绝对是一笔大大的财富。不仅因为Oracle的很多产品都是基于Java平台,更主要是因为Oracle可以挺直腰板和.net说不,可以根正苗红的跟IBM说Java。所以,Oracle绝对有理由,也有资源继续支持Java社区,但关键是Oracle是一家比SUN更加封闭的商业公司,在忙着赚钱的时候,Oracle还有多少心思做学问,去推动Java呢?

3 Solaris焕发青春?

开放的太晚了。这是普遍对SUN的Solaris策略的看法。SUN一直固守Space+Solaris高端市场。直到被LAMP架构挤压的市场空间不断缩小,才开放了Solaris系统。Oracle拥有了Solaris系统是一个有趣的话题。一定还记得当年Oracle苦于没有操作系统而去撬redhat的客户,推出个Oracle Linux版本的事情。所以,Oracle终于得到了在产品层面上不错的操作系统。就看它怎么玩?

4 对开源的影响?

一直以来MySQL,Java都是在开源的标志。Oracle是一家封闭的商业公司,很多人担心Oracle收购SUN,某种程度上是宣布了软件开源产业的一次失败,甚至会造成软件发展的倒退。不过,从另一个角度看,如果把开源或者说自由软件上升到一个哲学角度,毫无疑问,充满了商业味的Oracle收购学问气十足的SUN,对软件的开源是个影响。但是如果把开源看做一个商业模式的话,Oracle很早就乐于此道了。
5 SUN硬件业务前途未卜?

Oracle过去是个软件厂商,而且它也正在和HP等硬件厂商进行着合作,现在Oracle通过收购也有了自己的硬件。Oracle原有服务器市场的合作伙伴,一下子变成了竞争对手。有人大胆的预测,Oracle稳妥起见,将转手卖掉SUN的硬件部分,这样还可以减少本次收购的成本。但问题是,McNealy 和 Ellison 似乎一直被称为IT界的疯子,卖掉了SUN的硬件似乎使这件事变的没有那么有意思了。
6 服务器市场新气象?

还记得08年,OracleSUN的蜜月期,用户购买SUN指定的几款服务器,Oracle的企业版数据库软件将成为一个选件。SUN将为用户支付Oracle的License费用,用户只需要承担一定的支持维护费用。现在OracleSUN终于“结婚”了,Oracle软件+SUN的硬件服务器捆绑在一起的策略可以走的更大胆一些。现在,Oracle在服务器市场上的优势是, 操作系统(Solaris, Linux) + 数据库(Oracle, MySQL) + 中间件(Oracle Application Server, BEA, SUN Appserver), 虽然目前服务器市场份额SUN并不靠前,但是Oracle绝对可以给服务器市场带来新气象。

7 中间件市场静悄悄?

这次收购看起来并没有从技术产品角度,对中间件产品市场进行新的划分。但是一个值得注意的地方还是Java。Java是业界标准,但Java是Oracle的了。而中间件市场大户IBM同样对Java非常依赖。

8  IBM错失SUN好事坏事?

IBM与SUN谈判的破裂,成就了Oracle-SUN,从产品线角度,Oracle-SUN绝对使IBM面临不小的压力。但是IBM收购SUN也不一定就是好事,首先产品线重叠严重,芯片服务器市场:SUN 是Sparc ,IBM是Power架构,操作系统SUN 是Solaris,IBM是AIX UNIX,数据库,SUN 是MYSQL,IBM是DB2。其次,IBM近年来主要的收入已经从硬件转向了软件和服务,如果收购SUN无疑使IBM不断下滑的硬件业务又多了一个麻烦的问题。所以,虽然IBM没有收购SUN,不能说是一个坏事。
9  微软是福是祸?

有人认为Oracle-SUN的合作,将使很多硬件厂商比如HP转而考虑与微软走的更紧密些。也许吧,但从另一个角度看,一直以来,微软靠Intel这个兄弟,在企业服务器端市场打拼。先前只有IBM这么一个能提供软硬件整套服务的家伙捣下乱。现在Oracle也来了,从IT基础架构+企业应用软件。这势必进一步挤压Wintel的市场份额,失去了平台,微软本就不强的企业服务器端应用软件市更加不好活。目前看来微软只能专心的搞它的IE8,windows7,和Office 2010了。
10  裁员
不可避免,没有什么想象的空间。去年11月,SUN已经宣布裁员5000至6000人,占员工总数的18%,Oracle-SUN的合并,必然会对SUN原有结构进一步调整。不过对于一个创新公司,削减技术人员将是不明智的,还是干掉多余的销售和市场营销人员吧。

悼念一个伟大的公司——Sun

Filed under: Java相關 — Tags: — KAV @ 12:40 am

欧盟无条件批准 Oracle公司对Sun收购案的消息,实际上宣告了一个伟大公司的离去。

Java之父James Gosling在自己的博客贴出了一幅画,应该代表了许多技术人的心情:

sun被收购,收购sun

对了,他还写了一句话:So long, old friend…

再见,Sun!

(more…)

Older Posts »

Powered by WordPress