﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-bluoy</title><link>http://www.blogjava.net/bluoy/</link><description>记录工作中的技术点滴，心得</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 11:59:40 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 11:59:40 GMT</pubDate><ttl>60</ttl><item><title>用Vmware workstation 8.0+Windows2008+Sqlserver2008+starwind群集磁盘 搭建故障转移集群环境</title><link>http://www.blogjava.net/bluoy/archive/2012/06/21/381232.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Thu, 21 Jun 2012 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2012/06/21/381232.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/381232.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2012/06/21/381232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/381232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/381232.html</trackback:ping><description><![CDATA[搭建过程备注：<br />1. 虚拟机软件Vmware 8.0 Workstation，Windows 2008 Enterprise Server, Sql Server 2008 R2。<br />2. 俩个节点平台版本必须一致，都为企业版。<br />3. 与构建Windows 2003群集不同，不能使用vmware的共享磁盘机制。Windows 2008集群对存储要求很高，不支持SCSI硬盘做集群。<br />&nbsp; &nbsp; 本次使用starwind 5.4代替vmware的共享磁盘实现群集存储。<br />4. 搭建Windows集群需要3台虚拟机：2个节点+1台存储。<br />5. 搭建SqlServer 2008集群需要4替虚拟机：2个节点+1台DC+1台存储。<br /><br />搭建顺序:<br />1. 安装DC+DNS服务器。<br />2. 安装集群节点,&nbsp;配置双网卡，域登录。<br />3. 安装群集磁盘服务器<br />4. 在集群节点上配置iSCSI发起。<br />5. 在集群节点上安装&#8220;故障转移群集&#8221;功能。<br />6. 进行故障转移群集验证和创建。<br />7. 至此，Windows集群环境安装完毕。<br />8. 在集群节点上按群集方式安装SqlServer 2008。<br />9.&nbsp;SqlServer 2008集群环境构建完毕。<br /><br />参考文档：<br /><div>Windows Server 2008的故障转移群集入门: http://os.51cto.com/art/201007/210286.htm<br /><div>windows server2008虚拟机+群集: http://wenku.baidu.com/view/5e5b2be8e009581b6bd9eb1a.html</div></div><div>Windows2008+sqlserver2008集群安装：http://wenku.baidu.com/view/601dc74d2b160b4e767fcf46.html</div><a href="http://wenku.baidu.com/view/601dc74d2b160b4e767fcf46.html"></a><img src ="http://www.blogjava.net/bluoy/aggbug/381232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2012-06-21 09:23 <a href="http://www.blogjava.net/bluoy/archive/2012/06/21/381232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ProxyDroid, A proxy software for your android device.</title><link>http://www.blogjava.net/bluoy/archive/2011/09/28/359707.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Wed, 28 Sep 2011 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2011/09/28/359707.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/359707.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2011/09/28/359707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/359707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/359707.html</trackback:ping><description><![CDATA[<div><div>神一样的软件，膜拜ing...</div><div>连我这天生kernel iptable有缺陷的都能用。<br /><br />当前版本：2.04.<br />还是个Open Source的，改天一定要好好观摩一番的。</div></div><img src ="http://www.blogjava.net/bluoy/aggbug/359707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2011-09-28 15:55 <a href="http://www.blogjava.net/bluoy/archive/2011/09/28/359707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>64-BIT ENVIRONMENT REQUIRED WHEN CHECKING BUILD TOOL VERSIONS(转贴)</title><link>http://www.blogjava.net/bluoy/archive/2011/01/07/342490.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Fri, 07 Jan 2011 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2011/01/07/342490.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/342490.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2011/01/07/342490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/342490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/342490.html</trackback:ping><description><![CDATA[<p>
<p>If you meet following errors below when you try to build your source code:</p>
<p>&nbsp;</p>
<p>Checking build tools versions...</p>
<p>build/core/main.mk:72:</p>
<p>************************************************************</p>
<p>build/core/main.mk:73: You are attempting to build on a 32-bit&nbsp;system.</p>
<p>build/core/main.mk:74: Only 64-bit build environments are supported&nbsp;beyond froyo/2.2.</p>
<p>build/core/main.mk:75:</p>
<p>************************************************************</p>
<p>Don&#8217;t panic, just change the code:</p>
<p>build/core/main.mk</p>
<p>ifeq ($(BUILD_OS),linux)</p>
<p>build_arch := $(shell uname -m)&nbsp;</p>
<p>---ifneq (64,$(findstring 64,$(build_arch)))&nbsp;</p>
<p>+++ifneq (i686,$(findstring i686,$(build_arch)))</p>
<p>&nbsp;</p>
<p>and change the code in four mk files below from &#8220;+=-m64&#8221; to &#8220;+=-m32&#8221;</p>
<p><br />
</p>
<p>external/clearsilver/cgi/Android.mk</p>
<p>external/clearsilver/java-jni/Android.mk</p>
<p>external/clearsilver/util/Android.mk</p>
<p>external/clearsilver/cs/Android.mk</p>
<p><br />
</p>
<p>LOCAL_CFLAGS += -m32</p>
<p>LOCAL_LDFLAGS += -m32</p>
<p>end.</p>
</p>
<img src ="http://www.blogjava.net/bluoy/aggbug/342490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2011-01-07 10:54 <a href="http://www.blogjava.net/bluoy/archive/2011/01/07/342490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memo -- Nokia PcSuite for Linux with ObexTool(ZT)</title><link>http://www.blogjava.net/bluoy/archive/2009/04/23/267179.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Thu, 23 Apr 2009 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2009/04/23/267179.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/267179.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2009/04/23/267179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/267179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/267179.html</trackback:ping><description><![CDATA[<p>I got this idea when i was surfing the web in search of a tool similar to the Nokia Pc Suite for my Linux</p>
<p>This How-To&nbsp; works with many NOKIA Mobile Phone, especially for
Nokia 3230, 6670, 6680, 6682 e 7610, 6120, Sony Ericsson Z1010, LG
U8110/8120.<br />
</p>
<p>First of all, we have to grant access for Mobile Phone to <strong>&#8220;dialout&#8221;</strong> group.</p>
<blockquote>
<p>sudo gedit /etc/udev/rules.d/40-permissions.rules</p>
</blockquote>
<p>Now we have to add to the end of file:</p>
<blockquote>
<p># NOKIA 6120<br />
BUS==&#8221;usb&#8221;, SYSFS{idVendor}==&#8221;0421&#8243;, SYSFS{idProduct}==&#8221;002f&#8221;, GROUP=&#8221;dialout&#8221;</p>
</blockquote>
<p>where 0421 and 002f could be different depending on your Mobile Phone.<br />
To check your idVendor and idProduct, we have to type on terminal</p>
<blockquote>
<p>lsusb<br />
Bus 003 Device 009: ID 0421:002f Nokia Mobile Phones</p>
</blockquote>
<p>Now, we have to reload udev permission file:</p>
<blockquote>
<p>sudo /etc/init.d/udev restart</p>
</blockquote>
<p>We have to add our username on group &#8220;dialout&#8221;</p>
<blockquote>
<p>gpasswd -a username dialout</p>
</blockquote>
<p>All basics configurations for USB Data Cable are completed. We can
start installation of obexftp and obextool GUI. Obextool GUI is written
for tk graphic library, so GUI not have a good design as GTK.</p>
<blockquote>
<p>sudo apt-get install openobex-apps libopenobex1 obexftp obextool</p>
</blockquote>
<p>If you want start obextool from terminal we have to type for the first time:</p>
<blockquote>
<p>export OBEXCMD=&#8221;obexftp -t /dev/ttyACM0 -u 1&#8243;<br />
obextool</p>
</blockquote>
<p>or, we can start it simply by typing:</p>
<blockquote>
<p>obextool &#8211;obexcmd &#8220;obexftp -t /dev/ttyACM0 -u 1&#8243;</p>
</blockquote>
<p>When we start Obextool we can see this error message:</p>
<p><strong>It seems, that your device does not support the memory status feature.<br />
Memory status will be disabled</strong></p>
<p>To solve this problem we have to set some values on obextool.cfg:</p>
<blockquote>
<p>sudo gedit /etc/obextool.cfg</p>
<p>set ObexConfig(config,memstatus) 0<br />
set ObexConfig(config,filemove) 0</p>
</blockquote>
<p>Another error message that we can see is:<br />
<strong><br />
FIle &#8216;/FileName/&#8217; could not be uploaded to &#8216;E:/Path&#8217;!<br />
Please check your file permissions.</strong></p>
<p>To solve it:</p>
<blockquote>
<p>sudo gedit /etc/obextool.cfg</p>
<p>set ObexConfig(config,dir_slash) 1</p>
</blockquote>
<p>Good Job! Now your Mobile Phone works well in Ubuntu Gutsy with ObexTool.<br />
If we want add it as Desktop Entry:</p>
<blockquote>
<p>sudo gedit /usr/share/applications/obextool.desktop</p>
<p>[Desktop Entry]<br />
Encoding=UTF-8<br />
Version=1.0<br />
Type=Application<br />
Exec=/usr/bin/obextool &#8211;obexcmd &#8220;obexftp -t /dev/ttyACM0 -u 1&#8243;<br />
Icon=/usr/share/icons/gnome/scalable/devices/phone.svg<br />
Terminal=false<br />
Name=Obextool<br />
GenericName=<br />
Comment=Browser your Mobile Phone<br />
Categories=Application;Utility;</p>
</blockquote>
<p>So, you can find it in your Gnome Panel over: <strong>&#8220;Applications&#8221; -&gt; &#8220;Accessories&#8221; -&gt; Obextool</strong></p>
<img src ="http://www.blogjava.net/bluoy/aggbug/267179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2009-04-23 16:30 <a href="http://www.blogjava.net/bluoy/archive/2009/04/23/267179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再次理解Oracle的connect by语法</title><link>http://www.blogjava.net/bluoy/archive/2009/04/01/263399.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Wed, 01 Apr 2009 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2009/04/01/263399.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/263399.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2009/04/01/263399.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/263399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/263399.html</trackback:ping><description><![CDATA[<div>
下面的例子实现把一个整数的各个位上的数字相加,通过这个例子我们再次理解
connect by.<br />
<br />
create or replace function f_digit_add(innum integer) return number <br />
is<br />
outnum integer;<br />
begin<br />
if innum&lt;0 then<br />
return 0;<br />
end if;<br />
select sum(nm) into outnum from(<br />
select substr(innum,rownum,1) nm from dual connect by<br />
rownum&lt;length(innum)<br />
);<br />
return outnum;<br />
end f_digit_add;<br />
/<br />
<br />
select f_digit_add(123456) from dual;
</div>


<img src ="http://www.blogjava.net/bluoy/aggbug/263399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2009-04-01 17:02 <a href="http://www.blogjava.net/bluoy/archive/2009/04/01/263399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shift_JIS, MS932 and Unicode(收藏自网络)</title><link>http://www.blogjava.net/bluoy/archive/2009/02/03/253114.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Tue, 03 Feb 2009 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2009/02/03/253114.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/253114.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2009/02/03/253114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/253114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/253114.html</trackback:ping><description><![CDATA[<div>终于搞明白了困惑很久的问题，罪魁祸首还是jdk啊。天杀的。<br />
以下内容转自网络：
<p>测试环境：Win2K Pro日文版，SUN J2SDK 1.5.0-beta2</p>
<p>经过测试，发现Shift_JIS和MS932编码的全角波浪线（&#8220;～&#8221;）的编码都是 0x8160（16进制，两个字节，高位在前）。通过sun.io.ByteToCharMS932转换后得到Unicode字符'\uFF5E'，而通过sun.io.ByteToCharSJIS转换后则得到Unicode字符'\u301C'。</p>
<p>反之，Unicode字符'\uFF5E'通过sun.io.CharToByteMS932转换后会得到MS932编码的本地字符0x8160（16进制，两个字节，高位在前），而Unicode字符'\u301C'通过 sun.io.CharToByteSJIS转换后也会得到Shift_JIS编码的本地字符0x8160（16进制，两个字节，高位在前），两者的转换结果相同。</p>
<p>结论：在WinNT/2K/XP上，MS932和Shift_JIS这两种本地字符集完全相同，只是分别采用JDK的sun.io.ByteToCharMS932和sun.io.ByteToCharSJIS对个别特殊的本地字符进行转换后所得到的 Unicode字符并不一样。实际上，MS932就是WinNT/2K/XP上的Shift_JIS，只是与标准版的Shift_JIS字符集相比，MS932收录了更多的字符，比如NEC和IBM对Shift_JIS的扩展（如日文中的&#8220;㊤㊥㊦㊧㊨①..⑳...&#8221;等等）；然而，JDK中的 ByteToCharSJIS及CharToByteSJIS却使用了标准的Shift_JIS字符集，所以部分扩展字符在从byte转换成char或是从char转换成byte时会出现乱码，这的确是JDK让人非常迷惑的一处。<br />
<br />
</p>
<p>参考资料1（日文）：http://www.asahi-net.or.jp/~ez3k-msym/charsets/jis2ucs.htm</font></p>
</div><img src ="http://www.blogjava.net/bluoy/aggbug/253114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2009-02-03 16:52 <a href="http://www.blogjava.net/bluoy/archive/2009/02/03/253114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些自己搞混了的概念</title><link>http://www.blogjava.net/bluoy/archive/2008/12/28/248716.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Sun, 28 Dec 2008 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2008/12/28/248716.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/248716.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2008/12/28/248716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/248716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/248716.html</trackback:ping><description><![CDATA[<div>1. 函数的overwrite实现时，函数参数类型必须严格一致。与overload不同，并不遵守参数优先匹配的原则。<br />
所以，不能用子类，或这接口的实现类来妄图得到overwrite的目的。<br />
2. 使用反射手法时，getMethod()的调用，参数类型必须与要得到的函数类型严格一致。与overload不同，并不遵守参数优先匹配的原则。<br />
3内部类，要实例化时必须首先实例化包含类。可以理解为内部类只是包含类的数据成员<br />
4非public类，非javabean规范的Bean，内部类BeanUtil类无法进行操作，比如clone()等等。 </div>
<img src ="http://www.blogjava.net/bluoy/aggbug/248716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2008-12-28 10:54 <a href="http://www.blogjava.net/bluoy/archive/2008/12/28/248716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一种侵入既有框架，或者改变既有框架行为的实现模式。</title><link>http://www.blogjava.net/bluoy/archive/2008/12/28/248714.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Sun, 28 Dec 2008 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2008/12/28/248714.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/248714.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2008/12/28/248714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/248714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/248714.html</trackback:ping><description><![CDATA[<div>虽然java没有提供函数指针的操作，而是必须通过对象来曲线救国。<br />
不过延伸一下这个思路，其实也未必不是件好事。从某种意义上来说，整个java系统，或者对象系统，其实就是不计其数的钩子组成的系统。因为，参数传递的过程中完全依赖着对象，一种行为和数据的结合体。这里，关键词是参数传递和对象的行为，当然离不开多态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改变既有代码的行为步骤：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. 派生参数类得到新的子类。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;在子类中覆写(overwrite)父类既有方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;将子类的实例作为参数传递。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样，就得到了改变父类行为的目的。<br />
&nbsp;对于既有框架自作主张的封装，阻碍自己的目的的时候，这个做法往往能独辟蹊径。<br />
<br />
</div>
<img src ="http://www.blogjava.net/bluoy/aggbug/248714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2008-12-28 10:40 <a href="http://www.blogjava.net/bluoy/archive/2008/12/28/248714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Framework 的理解以及可维护性是否得以改善的思考</title><link>http://www.blogjava.net/bluoy/archive/2008/07/06/212820.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Sun, 06 Jul 2008 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2008/07/06/212820.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/212820.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2008/07/06/212820.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/212820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/212820.html</trackback:ping><description><![CDATA[<p>Spring Framework 的理解以及可维护性是否得以改善的思考</p>
<p>Spring的特性：<br />
1. 提供了一种管理对象的方法，可以把中间层对象有效地组织起来。一个完美的框架&#8220;黏合剂&#8221;。<br />
2. 采用了分层结构，可以增量引入到项目中。<br />
3. 有利于面向接口编程习惯的养成。<br />
4. 目的之一是为了写出易于测试的代码。<br />
5. 非侵入性，应用程序对Spring API的依赖可以减至最小限度。<br />
6. 一致的数据访问介面。<br />
6. 一个轻量级的架构解决方案。</p>
<p>对Spring的理解<br />
Spring致力于使用POJOs来构建应用程序。由框架提供应用程序的基础设施，将只含有业务逻辑的POJOs作为组件来管理。从而在应用程序中形成两条相对独立发展的平行线，并且在各自的抽象层面上延长了各自的生命周期。</p>
<p>Spring的工作基础是Ioc。Ioc将创建对象的职责从应用程序代码剥离到了框架中，通常2中注入方式：setter 和 ctor参数。<br />
每个Bean定义被当作一个POJO（通过类名和JavaBean的初始属性或构造方法参数两种方式定义的Bean）。<br />
Spring的核心在org.springframework.beans，更高抽象层面是BeanFactory. BeanFactory是一个非常轻量级的容器。</p>
<p>关于可维护性的思考<br />
Spring之类的技术确实带来了应用系统的可维护性的提高吗？<br />
Ioc， AOP之类的技术，本质上都是将原本位于应用程序代码中"硬编码"逻辑，剥离出来放到了配置文件中（或者其他形式）。主流声音都是认为提高了应用程序的可维护性。</p>
<p>但如果从以下方面观察，结合项目实际经验，个人感觉这些技术的应用大大降低了应用程序的可维护性，尤其是面对一个陌生的系统，或者项目人员变动频繁的时候。<br />
1. 中断了应用程序的逻辑，使代码变得不完整，不直观。此时单从Source无法完全把握应用的所有行为。<br />
2. 将原本应该代码化的逻辑配置化，增加了出错的机会以及额外的负担。<br />
3. 时光倒退，失去了IDE的支持。在目前IDE功能日益强大的时代，以往代码重构等让人头痛的举动越来越容易。而且IDE还提供了诸多强大的辅助功能，使得编程的门槛降低很多。通常来说，维护代码要比维护配置文件，或者配置文件＋代码的混合体要容易的多。<br />
4. 调试阶段不直观，后期的bug对应阶段，不容易判断问题所在。<br />
5. 性能问题。虽说硬件性能日新月异，但是性能也是在不经意间一点一点地流失的。从汇编到高级语言，到面向对象，到虚拟机，一直处于这样的发展趋势。</p>
<img src ="http://www.blogjava.net/bluoy/aggbug/212820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2008-07-06 10:21 <a href="http://www.blogjava.net/bluoy/archive/2008/07/06/212820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个jdbc(setTimestamp())的bug？</title><link>http://www.blogjava.net/bluoy/archive/2008/03/26/188799.html</link><dc:creator>bluoy</dc:creator><author>bluoy</author><pubDate>Wed, 26 Mar 2008 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/bluoy/archive/2008/03/26/188799.html</guid><wfw:comment>http://www.blogjava.net/bluoy/comments/188799.html</wfw:comment><comments>http://www.blogjava.net/bluoy/archive/2008/03/26/188799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bluoy/comments/commentRss/188799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bluoy/services/trackbacks/188799.html</trackback:ping><description><![CDATA[项目中组员偶然写了一段垃圾的sql语句，不想却误打误撞的发现了一个jdbc的bug，包括Oracle 10g附带的版本。<br />
<br />
详细描述可以参考如下代码： <br />
&nbsp;&nbsp; public static void testSetTimestampBug() throws Exception{
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar calendar = new GregorianCalendar();
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date d = calendar.getTime();
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = "select 1+1 from dual where ?-sysdate&lt;1";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //error sql
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql1 = "select ?-sysdate from dual";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //no error sql
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql2 = "select 1+1 from dual where ?-1&lt;sysdate";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //no error sql
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement pst = cn.prepareStatement(sql);
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //pst.setDate(1, new java.sql.Date(d.getTime()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //no&nbsp; error
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pst.setTimestamp(1, new java.sql.Timestamp(d.getTime()));&nbsp;&nbsp; //bug!!!, throw SQLException: ORA-00932
<br />
&nbsp;&nbsp;&nbsp; }<br />
三种sql的写法中，第一种写法在使用setTimestamp()时会出错，其他俩种却不会有问题。<br />
即正常调用PreparedStatement.setTimestamp()方法，遇到某些特殊写法的sql语句却会出错。<br />
本例中，抛出如下例外：<br />
java.sql.SQLException: ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL.<br />
然而，如果使用setDate()方法，则一切正常，三种写法都没有问题。<br />
<br />
因为有这个问题，如果在持久层使用了其他的中间件，则这个问题可能变的更加隐蔽，比如iBatis中的处理是这样的：<br />
java.util.Date ---&gt;
ibatis.DateTypeHandler-----&gt;PreparedStatement.setTimestamp()&nbsp; <br />
java.sql.Date
---&gt; ibatis.SqlDateTypeHandler-----&gt;PreparedStatement.setDate()<br />
如果不注意输入参数类型的话，就会遇到上述问题。我就因此费了不少周折。<br />
对于iBatis的使用建议，保证入口参数类型始终为java.sql.Date即可。<br />
<br />
<img src ="http://www.blogjava.net/bluoy/aggbug/188799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bluoy/" target="_blank">bluoy</a> 2008-03-26 17:17 <a href="http://www.blogjava.net/bluoy/archive/2008/03/26/188799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>