微软针对Windows Azure发布新PHP开发工具
微软最近宣布了一个新工具,Windows Azure Companion。更新了Windows Azure Tools for Eclipse for PHP和Windows Azure Command-line Tools for PHP,并在9月19日-21日举办的Open Source India会议上带来了Windows Azure SDK for PHP的第二个版本,所有这些工具都是针对PHP开发人员和那些对Windows Azure上部署应用程序感兴趣的管理员。
只有Windows Azure Companion是全新的工具,其他的都是更新或者老工具/SDK的新版本。Windows Azure Companion能用来在Azure上安装PHP平台组件(PHP运行时、扩展)或者PHP Web应用程序。

Windows Azure Companion使用Atom订阅源作为配置文件,其中包含了想要运行的Web应用程序所需组件的名称和URL。Vijay Rajagopalan,微软互操作策略部门(Interoperability Strategy)的首席构架师说道:Companion的早期版本主要针对PHP的,不过它可以扩展成部署“任何开源组件或应用程序到Windows Azure中运行”。Rajagopalan没有解释哪些非PHP Web应用程序可以部署到Azure中,不过似乎通过编辑订阅源和使用Companion就可以实现。

Windows Azure for Eclipse for PHP September CTP更新了Eclipse插件,以支持在2010年6月发布的Windows Azure SDK 1.2中的最新增强,也为11月最终版做好准备。
新特性有:
◆在启用了SSL的HTTP端点上托管PHP应用程序
◆在PHP编辑器中支持Windows Azure的代码模板
◆Windows Azure诊断支持
◆集成开源的AppFabric SDK for PHP Developers
◆支持在Worker Role中执行PHP脚本
◆SQL CRUD Application Wizard for PHP的集成
◆增强了项目文件转换功能
◆可管理应用程序部署
◆可以在Web Role应用中暴露php.ini和PHP文件夹
◆Windows Azure Drive for PHP developers的支持
◆为Storage Exploer使用帐号名称
Windows Azure Command-line Tools for PHP让管理员可以通过命令行界面打包PHP应用程序并部署到Azure中。9月的CTP版本将添加对Web和Worker Role的支持。这个工具无法兼顾到所有部署情况,有些还是需要靠Companion来解决。
Windows Azure SDK for PHP能让开发人员在他们的应用程序中利用Azure的服务——大文件存储、表、队列等。在这个2.0版本中的一些新特性有:
◆可以调用Windows Azure Blobs、Tables和Queues功能的PHP类(可完成CRUD操作)
◆用于HTTP传输、AuthN/AuthZ、REST和错误管理的辅助类
◆可管理性、设施和日志支持
◆支持在Azure Table Storage中存储PHP会话
MySQL 5.5部分新特性首度公开

在10月16日举办的Thinkinlamp&上海爱可生MySQL用户大会上,Oracle GBU MySQL技术专家杜修文披露,MySQL 5.5在将InnoDB作为默认存储引擎后,增强了“MySQL+InnoDB”组合的性能,除过去已经证实的新特性外,增加了:
1. InnoDB buffer pool实现多个“分区” 以降低内部锁数量(Multiple Buffer Pool Instances)从而提升MySQL性能。
2. 过去限制InnoDB并发的原因在于InnoDB Rollback Segments只能接受1024个并发,新的Multiple Rollback Segments并发限制提升为128*1024个,InnoDB的并发数量获得巨大提升。
3. 增加PERFORMANCE_SCHEMA状态,使用户可以查看MySQL性能参数,从而更简便的调整和提升MySQL性能。
以上MySQL 5.5新特性,将同时在MySQL社区版与企业版中体现。
4. 在MySQL企业版5.5当中,Innodb hotbackup 作为Innodb上的热备工具,将在增强后成为MySQL Enterprise Backup,从而结束了MySQL没有高性能实时热备功能的历史。
PHP举办全国四十城巡回站长交流会
10月16日,phpwind全国四十城巡回站长将入驻长春,随行的phpwind工程师,淘宝大卖家,新浪微博,成功站长将与当地站长们一起“搜索新商机,迎接新朋友”。
据悉,phpwind,是阿里巴巴旗下通用型建站软件与服务提供商。秉承“单核心多模式”研发理念而开发的phpwind 8一直将重点关注在论坛内容,在底层架构打通之后实现更多模块化功能和应用,功能模式更强化,个人中心更精彩,搜索功能更全面。
P8还有更强大的全站搜索,群组,活动,好友邀请,导航菜单,细节优化等各大功能。坚持提升网站媒体价值,走门户化的方向,这个从phpwind7.5就开始发展演绎的理念,如今被业界通用型建站软件均认同为最重要的发展方向。而如何将流量兑现成为实际的营收,phpwind也充分利用大淘宝资源,快人一步,推出服务社区网站的电子商务产品。
为将phpwind让网站更具价值的愿景带到更多站长们,将phpwind 8崭新的门户化与发展电子商务理念带给更多站长们,phpwind与新浪微博、淘宝联盟合作,为中小网站提供内容运营、电子商务等多方位资源,将举办40场全国巡回的地面交流会,把这些资源推荐给更多的中小网站,帮助中小网站建立良好的生态环境。天津,石家庄,徐州站,纷纷取得了热烈的反应与效果。
8月份以来,P8接连推出“淘链接”、“淘满意”、“房产版”、“商家导航产品”等一系列服务社区的电子商务产品。截至9月20日下午15:00,phpwind8官方站点下载数达到了1120867次。(文/飞雪)
企业如何发现自身Web安全漏洞
随着中国信息化建设的高速发展,中国已经发展成全球第二大的互联网用户,也带来了互联网网站的高速发展。当前的互联网网站已经成为信息传播、流通、交换及存储的重要手段。政府部门的信息化建设,使得电子政务的加速增长,越来越多的传统办公业务转变成依懒互联网的网站业务。
企业的B2B、B2C业务的发展更多地依靠于网站业务的正常运行。各大商业银行为了方便业务的开展,依懒于网站提供更多的在线服务方式。随着网站与网页数的与日俱增,信息安全问题变得更为严峻。由于互联网网站处于全天候的开放状态,而承载网站的应用程序具有自身无法完全克服的漏洞问题,这就为黑客的入侵提供了可乘之机。
互联网网站与网页存在一些安全问题,比如网站服务器易出现的以下问题:
◆网站脚本程序的安全问题检测,如网站的默认数据库,默认管理帐号(admin,root,manager等);
◆网站程序设计存在的安全问题检测,网站程序设计者在编写时,对相关的安全问题没有做适当的处理,如SQL注入,上传漏洞,脚本跨站执行等;
◆服务器配置不当,安全策略设置存在缺陷,可导致产品被入侵的问题检测;
◆应用服务权限设置导致系统被入侵的问题检测;
◆系统和服务的补丁未升级导致系统可被入侵的安全检测等。
利用网站的安全漏洞,尤其是Web应用程序漏洞:如SQL 注入等,黑客能够得到 Web 服务器的控制权限,随意篡改网页内容或窃取重要内部数据,更为严重的则是在网页中植入恶意代码,通过"网页挂马"感染更多的客户端用户。通过这一行为,黑客可以控制网站的访问者甚至包括网站本单位的人员的计算机,从而实现盗取银行帐号、内部机密信息等各种不可告人的目的。由于网页木马制作的简单性和网络漏洞存在的必然性,通过网站漏洞进行网页挂马已经成为当前最流行的网站攻击方法和最受黑客青睐的木马散播方式。2007年微软系统的安全漏洞,以及各种应用软件存在安全漏洞,如MS06014安全漏洞、MS07004安全漏洞、Open9.0-9.2安全漏洞、PPS安全漏洞、Web迅雷安全漏洞、Ani指针安全漏洞、暴风播放器安全漏洞、JetAudio 7.x安全漏洞、百度插件安全漏洞、PPlive安全漏洞、雅虎安全漏洞、MS07055安全漏洞、迅雷5安全漏洞、超星的安全漏洞等安全漏洞问题。各种漏洞生成的相应的漏洞利用网马并进行挂马,使得网页挂马事件得到快速的发展。
网络信息化建设的不断发展、核心应用业务迅速网络化以及互联网用户的飞速增长,我们面临的安全威胁也日益增多和复杂。根据CNCERT的最新统计数据,2007年CNCERT共接到网络安全事件报告4390件。2007年我国大陆被篡改网站总数达到了61228个,同比增长1.5倍;其中政府网站(.gov.cn)被篡改3407个,占大陆被篡改网站的7%。CNCERT统计显示,大陆地区约有4.3万个IP地址主机被植入木马,约有362万个IP地址主机被植入僵尸程序。从以上数据可以看出,提高业务网站的安全防护,是保障业务正常进行的必然前提。
国内被篡改的网站为政府、学校、信息综合门户、知名企业等影响力高、受众面广的网站,而一些中小企业的网站更是易被侵入篡改。网站被篡改带来的不良影响,不仅仅是单位组织的形象和声誉遭到破坏,而且会直接影响以网站运营为主的业务,带来一定的经济上的损失。如何保护网站的安全性,是众多网站管理员及单位组织关注的事情。除了网络管理员提供日常管理维护,还需要专业的安全人员对网站及相关服务器的安全性进行检测。
网站是否存在Web 应用程序漏洞,往往是被入侵后才能察觉;而网站是否已经被挂马,通常是在被访问者投诉或被监管部门查处才能察觉,但这个时候损失已经发生;如何在攻击发动之前主动发现Web应用程序漏洞以及网站在挂马发生之后迅速获悉,已成为构筑Web安全的上上策。目前解决这一问题的通常方式就是网站的运维管理人员购买专业的Web扫描工具,同时学习专业的安全知识,并对网站进行常规扫描、高频度检测,但专业的扫描工具往往不能解决木马问题,并且开销巨大,同时面对Web网站复杂的安全需求,也有自身的一些局限性。那么,能否设计一种具有这种功能的产品或服务,既能够预先扫描Web系统,防患于未然,又能够发现已经存在的网页木马,从而提醒网站管理者进行相应的应急处理呢?
使用SQL子选择来合并查询
子选择的理念很简单:一个选择查询安置在另一个查询内部,创建一个在单一声明搜索中不可用的资源。子选择允许查询的合并,结果组比较的责任落到了数据库中而不是应用软件代码中。
使用这个功能的一个途径是对两个表格中的可比数据专栏中的值进行定位。例如,我的一个数据库有两个表格,Album和Lyric。我可以很容易地通过下面的子查询声明来找到每一个Metallica的歌曲中包含“justice”的歌名:
SELECT song_name FROM Album
WHERE band_name = ‘Metallica’
AND song_name IN
(SELECT song_name FROM Lyric
WHERE song_lyric LIKE ‘%justice%’);
这个例子是很简单的,我从Album表格中选择了所有Metallica的歌曲,接着,我在lyric表格中选择所有包含“justice”的歌曲,最后,我使用IN关键字来从Lyric表格结果组中显示的Album表格中返回歌曲名称。
我使用Lyric表格结果组来给Album表格中的结果做限定。WHERE子句中的子选择部分是完全自包含的,因此我不需要使用例如Album.song_name和Lyric.song_name等完整的专栏名称。我没有从最终结果组的Lyric表格中返回任何值,如果我需要歌曲的Lyric,我会使用一个JOIN声明。
使用NOT IN排除结果
你可以使用NOT IN关键字来获得明确地不被包含在另一个结果组中的结果。例如,我想要通过下面的代码来返回Metallica在“And Justice for All”专辑中不包含单词“justice”的歌曲:
SELECT song_name FROM Album
WHERE album_name = ‘And Justice for All’
AND band_name = ‘Metallica’
AND song_name NOT IN
(SELECT song_name FROM Lyric
WHERE song_lyric LIKE ‘%justice%’);
在前面的SQL代码中,我选择了Metallica的“And Justice for All,”专辑中的所有歌曲,接着是带有歌词中带有“justice”所有歌曲,最后从在Lyric结果组中没有出现的Album结果组返回了所有歌曲。较之于返回两个查询并使用代码来比较数组,你通过一个单独的声明就可以得到确切的结果。
使用EXISTS来相关结果
有时你可以通过多种途径来访问相同的数据,而且你需要对你的结果进行匹配(或相关)来得到值的交叉区。例如,我可以通过搜索Album表格来得到Metallica的歌曲列表,可是,我也可以从我的Cover表格中得到由Damage, Inc表演的Metallica的歌曲的列表,我可以在两个表格中直接比较查询结果来对值作相关。
SELECT Album.song_name FROM Album
WHERE Album.band_name = ‘Metallica’
AND EXISTS
(SELECT Cover.song_name FROM Cover
WHERE Cover.band_name = ‘Damage, Inc.’
AND Cover.song_name = Album.song_name);
在SQL代码中,我使用完整的专栏名称,这是因为我直接对两个表格作比较,而不仅仅是将结果组作为一个被动资源来使用。我并不从Cover表格中返回结果。一些数据库支持NOT EXISTS关键字来确保你并没有匹配。
使用合计函数来比较
除了使用子选择在相关的表格中检查数据,你还可以在一个WHERE子选择中使用合计函数来确定主结果组。例如,我想要核实每一个Metallica歌曲在Album表格中的条目。而且,我还想返回缺少歌曲的专辑的名称。很方便地,AlbumInfo表格包含的一个专栏(album_tracks)给出了应该有多少首歌曲方面的信息。
SELECT AlbumInfo.album_name FROM AlbumInfo
WHERE AlbumInfo.band_name = ‘Metallica’
AND album_tracks <>
(SELECT COUNT(*) FROM Album
WHERE Album.album_name = AlbumInfo.album_name);
现在我已经成功地返回了所有Metallica的专辑中,应有的曲目数量与Album表格中实际的歌曲条目数量不符的专辑名称。
返回子选择结果
如果我还是关心每一张专辑的曲目数量并需要得到一个比较报告怎么办?你可以将一个子选择的结果作为最终结果组的一部分来返回。这个功能经常被合计函数所使用。通常地,对其他表格的访问可以作为你的查询的一部分。下一个例子将返回每一张Metallica的专辑,应该包括的曲目数量和在Album表格中包括的条目数量:
SELECT AlbumInfo.album_name, album_tracks,
(SELECT COUNT(*) FROM Album
WHERE Album.album_name = AlbumInfo.album_name)
FROM AlbumInfo
WHERE AlbumInfo.band_name = ‘Metallica’;
另一个强有力的例子涉及了在AlbumInfo表格中将album_tracks值改变为在Album表格中实际的条目数量:
UPDATE AlbumInfo SET album_tracks =
SELECT COUNT(*) FROM Album
WHERE AlbumInfo.album_name = Album.album_name)
WHERE AlbumInfo.band_name = ‘Metallica’;
在上两个例子中的子选择声明被看作一个自包含单位来执行。
子选择比较关键字(ALL, SOME, ANY)
除了使用标准查询功能,还有三个关键字可以使你将一个表达式值和一个单栏子选择声明结果组作比较,这些关键字返回TRUE或FALSE的Boolean值。ALL关键字要求子选择中所有值都遵守比较运算符。SOME和ANY关键字则要求至少一对。这里是ALL关键字的一个简单实例。
SELECT * FROM AlbumSales
WHERE album_gross >
ALL (SELECT album_costs FROM AlbumProduction);
上面的例子将从AlbumSales表格返回在AlbumProduction表格里面付出总额大于成本而生产最昂贵的专辑的所有记录。如果用ANY替代ALL,声明将返回所有付出总额大于最低专辑成本的专辑记录。声明= ANY与IN关键字意义是相同的。声明<> ALL与NOT IN关键字是对等的。关键字ANY和SOME也是等同的。数据库生产商中对这些关键字的支持情况是不同的,因此在出现问题时要相信查阅生产商方面的资料
C++学习:从零开始学编程
程序,即过程的顺序,准确地说应该是顺序排列的多个过程,其是方法的描述。比如吃菜,先用筷子夹起菜,再用筷子将菜送入嘴中,最后咀嚼并吞下。其中的夹、送、咀嚼和吞下就被称作命令,而菜则是资源,其状态(如形状、位置等)随着命令的执行而不断发生变化。上面就是吃菜这个方法的描述,也就是吃菜的程序。
任何方法都是为了改变某些资源的状态而存在,因此任何方法的描述,也就是程序,也都一定有命令这个东西以及其所作用的资源。命令是由程序的执行者来实现的,比如上面的吃菜,其中的夹、送等都是由吃菜的人来实现的,而资源则一定是执行者可以改变的东西,而命令只是告诉执行者如何改变而已。
电脑程序和上面一样,是方法的描述,而这些方法就是人期望电脑能做的事(注意不是电脑要做的事,这经常一直混淆着许多人),当人需要做这些事时,人再给出某些资源以期电脑能对其做正确的改变。如计算圆周率的程序,其只是方法的描述,本身是不能发生任何效用的,直到它被执行,人为给定它一块内存(关于内存,请参考《C++从零开始(三)》),告诉它计算结果的精度及计算结果的存放位置后,其才改变人为给定的这块内存的状态以表现出计算结果。
因此,对于电脑程序,命令就是CPU的指令,而执行者也就由于是CPU的指令而必须是CPU了,而最后的资源则就是CPU可以改变其状态的内存(当然不止,如端口等,不过一般应用程序都大量使用内存罢了)。所以,电脑程序就是电脑如何改变给定资源(一般是内存,也可以是其他硬件资源)的描述,注意是描述,本身没有任何意义,除非被执行。
何谓编程
编程就是编写程序,即制订方法。为什么要有方法?方法是为了说明。而之所以要有说明就有很多原因了,但电脑编程的根本原因是因为语言不同,且不仅不同,连概念都不相通。
人类的语言五花八门,但都可以通过翻译得到正解,因为人类生存在同一个四维物理空间中,具有相同或类似的感知。而电脑程序执行时的CPU所能感受到的空间和物理空间严重不同,所以是不可能将电脑程序翻译成人类语言的描述的。这很重要,其导致了大部分程序员编写出的拙劣代码,因为人想的和电脑想的没有共性,所以他们在编写程序时就随机地无目的地编写,进而导致了拙劣却可以执行的代码。
电脑的语言就是CPU的指令,因为CPU就这一个感知途径(准确地说还有内存定位、中断响应等感知途径),不像人类还能有肢体语言,所以电脑编程就是将人类语言书写的方法翻译成相应的电脑语言,是一个翻译过程。这完全不同于一般的翻译,由于前面的红字,所以是不可能翻译的。
既然不可能翻译,那电脑编程到底是干甚?考虑一个木匠,我是客人。我对木匠说我要一把摇椅,躺着很舒服的那种。然后木匠开始刨木头,按照一个特殊的曲线制作摇椅下面的曲木以保证我摇的时候重心始终不变以感觉很舒服。这里我编了个简单的程序,只有一条指令——做一把摇着很舒服的摇椅。而木匠则将我的程序翻译成了刨木头、设计特定的曲木等一系列我看不懂的程序。之所以会这样,在这里就是因为我生活的空间和木工(是木工工艺,不是木匠)没有共性。这里木匠就相当于电脑程序员兼CPU(因为最后由木匠来制作摇椅),而木匠的手艺就是CPU的指令定义,而木匠就将我的程序翻译成了木工的一些规程,由木匠通过其手艺来实现这些规程,也就是执行程序。
上面由于我生活的空间和木工(指木工工艺,不是工人)没有共性,所以是不可能翻译的,但上面翻译成功了,实际是没有翻译的。在木工眼中,那个摇椅只是一些直木和曲木的拼接而已,因为木工空间中根本没有摇椅的概念,只是我要把那堆木头当作摇椅,进而使用。如果我把那堆木头当作凶器,则它就是凶器,不是什么摇椅了。
“废话加荒谬加放屁!”,也许你会这么大叫,但电脑编程就是这么一回事。CPU只能感知指令和改变内存的状态(不考虑其他的硬件资源及响应),如果我们编写了一个计算圆周率的程序,给出了一块内存,并执行,完成后就看见电脑的屏幕显示正确的结果。但一定注意,这里电脑实际只是将一些内存的数值复制、加减、乘除而已,电脑并不知道那是圆周率,而如果执行程序的人不把它说成是圆周率那么那个结果也就不是圆周率了,可能是一个随机数或其他什么的,只是运气极好地和圆周率惊人地相似。
上面的东西我将其称为语义,即语言的意义,其不仅仅可应用在电脑编程方面,实际上许多技术,如机械、电子、数学等都有自己的语言,而那些设计师则负责将客户的简单程序翻译成相应语言描述的程序。作为一个程序员是极其有必要了解到语义的重要性的(我在我的另一篇文章《语义的需要》中对代码级的语义做过较详细的阐述,有兴趣可以参考之),在后续的文章中我还将提到语义以及其对编程的影响,如果你还没有理解编程是什么意思,随着后续文章的阅读应该能够越来越明了。
电脑编程的基础知识——编译器和连接器
我从没见过(不过应该有)任何一本C++教材有讲过何谓编译器(Compiler)及连接器(Linker)(倒是在很老的C教材中见过),现在都通过一个类似VC这样的编程环境隐藏了大量东西,将这些封装起来。在此,对它们的理解是非常重要的,本系列后面将大量运用到这两个词汇,其决定了能否理解如声明、定义、外部变量、头文件等非常重要的关键。
前面已经说明了电脑编程就是一个“翻译”过程,要把用户的程序翻译成CPU指令,其实也就是机器代码。所谓的机器代码就是用CPU指令书写的程序,被称作低级语言。而程序员的工作就是编写出机器代码。由于机器代码完全是一些数字组成(CPU感知的一切都是数字,即使是指令,也只是1代表加法、2代表减法这一类的数字和工作的映射),人要记住1是代表加法、2是代表减法将比较困难,并且还要记住第3块内存中放的是圆周率,而第4块内存中放的是有效位数。所以发明了汇编语言,用一些符号表示加法而不再用1了,如用ADD表示加法等。
由于使用了汇编语言,人更容易记住了,但是电脑无法理解(其只知道1是加法,不知道ADD是加法,因为电脑只能看见数字),所以必须有个东西将汇编代码翻译成机器代码,也就是所谓的编译器。即编译器是将一种语言翻译成另一种语言的程序。
即使使用了汇编语言,但由于其几乎只是将CPU指令中的数字映射成符号以帮助记忆而已,还是使用的电脑的思考方式进行思考的,不够接近人类的思考习惯,故而出现了纷繁复杂的各种电脑编程语言,如:PASCAL、BASIC、C等,其被称作高级语言,因为比较接近人的思考模式(尤其C++的类的概念的推出),而汇编语言则被称作低级语言(C曾被称作高级的低级语言),因为它们不是很符合人类的思考模式,人类书写起来比较困难。由于CPU同样不认识这些PASCAL、BASIC等语言定义的符号,所以也同样必须有一个编译器把这些语言编写的代码转成机器代码。对于这里将要讲到的C++语言,则是C++语言编译器(以后的编译器均指C++语言编译器)。
因此,这里所谓的编译器就是将我们书写的C++源代码转换成机器代码。由于编译器执行一个转换过程,所以其可以对我们编写的代码进行一些优化,也就是说其相当于是一个CPU指令程序员,将我们提供的程序翻译成机器代码,不过它的工作要简单一些了,因为从人类的思考方式转成电脑的思考方式这一过程已经由程序员完成了,而编译器只是进行翻译罢了(最多进行一些优化)。
还有一种编译器被称作翻译器(Translator),其和编译器的区别就是其是动态的而编译器是静态的。如前面的BASIC的编译器在早期版本就被称为翻译器,因为其是在运行时期即时进行翻译工作的,而不像编译器一次性将所有代码翻成机器代码。对于这里的“动态”、“静态”和“运行时期”等名词,不用刻意去理解它,随着后续文章的阅读就会了解了。
编译器把编译后(即翻译好的)的代码以一定格式(对于VC,就是COFF通用对象文件格式,扩展名为。obj)存放在文件中,然后再由连接器将编译好的机器代码按一定格式(在Windows操作系统下就是Portable Executable File Format——PE文件格式)存储在文件中,以便以后操作系统执行程序时能按照那个格式找到应该执行的第一条指令或其他东西,如资源等。至于为什么中间还要加一个连接器以及其它细节,在后续文章中将会进一步说明。
也许你还不能了解到上面两个概念的重要性,但在后续的文章中,你将会发现它们是如此的重要以至于完全有必要在这唠叨一番。
Java报表工具参数下拉框的值通过公式编辑
我们在使用Java报表的过程当中,经常会有对年报、月报、日报的制作,需要通过下拉框选择查询的年和月。现在报表工具的年份设置,通常是连续的从某年至今年,而月份是固定的12个月。像这种情况怎样来定义参数下拉框的值呢?您可能会使用自定义来达到目的,但这种方法需要手动输入所需要的值,比较繁琐。此时可以使用公式来定义下拉框的值。具体设置如下
1. 定义两个参数:year和month
2. 参数控件设置
设置参数year的控件类型为下拉框,使用公式编辑,输入公式:
range(1997,year(today()))
设置参数month的控件类型为下拉框,使用公式编辑,输入公式:range(1,12)
3.查看效果
保存模板,并分页预览
Oracle大量数据插入之性能优化理解
在学习Oracle中,我们使用SQL和ODBC链接进行数据插入,单独插入少量数据时,没有问题。但是在插入大量数据时,就会出现异常,内存溢出错误。
如何解决在进行大量数据插入时,java程序能够有效快速的进行数据处理。这就是数据库中性能优化的问题。
为什么要进行性能优化。
首先,在大量数据处理中 一般常规的方式会造成程序处理效率和时间低下。达不到产品上线要求。
其次,没有性能优化在产品维护时也会出现很多错误,带来麻烦。
如何进行性能优化。
一般软件都会进行大量数据测试,对性能做个整体评估,然后找出最好的方法来编写需要的代码。
同时再次进行测试达到最佳的性能点。
对于Oracle大量数据插入的性能优化我们采用如下方法进行
先采用常规方式编写代码,如在放入数据时就直接使用list接口方法进行。
插入数据中不进行批处理使用。
发现,在插入10万数据中 内存溢出,而且数据库使用时间非常长。
于是,我们先采用数据库批处理命令 采用每1000条数据再进行一次提交
使用addBAEACH 方法,和excutbeach 方法来处理
代码为
ps.addBatch();
if(i!=0&&i%10000==0) {
ps.executeBatch();
con.commit();
ps.clearBatch();
}
同时也使用预编译语句进行插入。
但是在仍然不能解决虚拟机内存溢出问题
于是我们使用
String[] fileList = new File(uploadDir).list();
ArrayList array = new ArrayList;
array.clear();
来解决读取文件后如何放入数据库中再使用SQL语句进行插入。
经过反复测试。最后找到最优点。在插入100万数据情况下 每次1万条数据提交。性能最优。
Java实现右键弹出菜单例子
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//左键弹出菜单
public class JPopMenuDemo extends JFrame {
JRadioButtonMenuItem items[]; //菜单项
Color[] colors={Color.blue,Color.pink,Color.yellow,Color.red,Color.orange}; //颜色数组
JPopupMenu popupMenu; //弹出菜单
public JPopMenuDemo()
{
super( "右键弹出菜单" ); //调用父类构造函数
ChangeColorAction action = new ChangeColorAction(); //菜单项事件处理
String[] str = {"Blue","Pink","Yellow","Red","Orange"}; //菜单项名称
ButtonGroup colorGroup=new ButtonGroup(); //实例化按钮组
popupMenu=new JPopupMenu(); //实例化弹出菜单
items=new JRadioButtonMenuItem[5]; //初始化数组
for (int i=0;i items[i]=new JRadioButtonMenuItem(str[i]); //实例化菜单项
popupMenu.add(items[i]); //增加菜单项到菜单上
colorGroup.add(items[i]); //增加菜单项到按钮组
items[i].addActionListener(action); //菜单项事件处理
}
addMouseListener(new MouseAdapter(){ //窗口的鼠标事件处理
public void mousePressed( MouseEvent event ) { //点击鼠标
triggerEvent(event); //调用triggerEvent方法处理事件
}
public void mouseReleased( MouseEvent event ) { //释放鼠标
triggerEvent(event);
}
private void triggerEvent(MouseEvent event) { //处理事件
if (event.isPopupTrigger()) //如果是弹出菜单事件(根据平台不同可能不同)
popupMenu.show(event.getComponent(),event.getX(),event.getY()); //显示菜单
}
});
getContentPane().setBackground(Color.white); //窗口的默认背景色为白色
setSize(230,160); //设置窗口大小
setVisible(true); //设置窗口为可视
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); //关闭窗口时退出程序
}
class ChangeColorAction implements ActionListener { //菜单项事件处理
public void actionPerformed(ActionEvent event) {
for (int i=0;i if (event.getSource()==items[i]) { //判断事件来自于哪个菜单项
getContentPane().setBackground(colors[i]); //设置窗口背景
repaint(); //重绘窗口
return;
}
}
}
public static void main( String args[]) {
new JPopMenuDemo();
}
}
运行结果:
.net调用java webService返回类型是空的解决方法
.net调用java webService返回类型是空。在java中自定义类型是不被.net认同的,所以接收不到。
解决办法:
1.自定义类型必须实现java.io.Serializable结构。
2.将返回类型与web service放到同一package。用Java开发的人可能就会习惯的将返回类型与web service存放在不同的package中.我就是将返回的类型存在下xx.xx.domain目录下,而将web service存在xx.xx.service目录下,在用eclipse生成 webservice服务时就把它们放到不同的命名空间中,导致.net客户端无法获取自定义类型的值。
- 默认分类(20)
- J2EE(25)
- Java(56)
- PHP(55)
- SEO(10)
- 网页设计(20)
- 网站建设(37)
- 数据库(7)
- JavaScript(17)
- JQuery(6)
- MySQL(20)
- SQL Server(6)
- Access(1)
- Oracle(6)
- office(6)
- Dreamweaver(4)
- Photoshop(12)
- Flash(9)
- Fireworks(13)
- CSS(14)
- HTML(4)
- .NET(7)
- ASP(2)
- DB2(1)
- Ajax(2)
- Linux(12)
- Struts(7)
- Hibernate(8)
- Spring(2)
- Jsp(22)
- Asp(8)
- C#(3)
- C++(1)
- 网络安全(5)
- 软件工程(7)
- XML(1)
- English(2)
- 计算机等级考试(2)
- 计算机病毒(4)
- 个人日志(76)
- 互联网(15)
- ActionScript(10)
- Android(3)
- 数据结构与算法(1)
- 游戏策略(3)
- 美文翻译(2)
- 编程开发(19)
- 计算机应用(4)
- 计算机(10)
- Unity3d(6)
- 其他(1)
- egret(1)