|
2006年4月19日
http://note.youdao.com/share/web/file.html?id=611b9b6bdf9abafbb1ee45436f50be9e&type=note
每次都在setupconnection...的地方停住了,后来在发现原来是因为我的手机没有插SD卡,愤的!!
geoJOSN为UTF-8编码,转成shp后部分字段出现乱码,一直找不到解决的办法。后来装了QGIS 1.7.4,打开geoJSON文件,注意选择编码为UTF-8,然后save as..,保存成shp文件,此时编码必须选择system就可以解决中文乱码的问题了。
以下的GPS定位代码,在MOTO XT800,ME811,HTC S610d等手机中定位都没有问题,但是在MOTO XT882里面就是无法定位,后来发现问题出现在红色的代码部分,强制改成GPS定位就可以了。 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = locationManager.getBestProvider(criteria, true); /* 每隔1000ms更新一次,并且不考虑位置的变化。 */ locationManager.requestLocationUpdates(provider, 3000, 5, locationListener); //强制使用GPS定位 //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 5, locationListener);
这次项目开发,运行环境的tomcat版本从5.5.12升级到了6.0.18,发现以前的项目不能跑了,访问一个很简单的jsp也会报错,说无法编译,报的错误就是:Only a type can be imported. com.xxx.xxx.XXX resolves to a package,意思就是说你jsp页面上引用的那个类不存在,可是在老版本明明跑的好好的,而且另一个现象就是项目根目录下的jsp访问没有问题,子目录下就报错,google了一下,发现这是新版本tomcat的一个变化,就是如果不指定context的话,每一个子文件夹都会被tomcat当作一个独立的虚拟应用的,所以每个子文件夹下的jsp页面访问的时候,都会在它的同一层找WEB-INF里面的class,这样当然找不到了,只有刚巧放在根目录下的jsp文件能访问。 解决办法:其实这也是自己以前写tomcat的配置文件时候,写法不规范造成的,以前的server.xml里面host信息代码如下: <Host name="www.local.com" appBase="D://projects//myWebSite//WebContent" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Alias>192.168.1.43</Alias> <Context path="" docBase="" reloadable="true"> <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="www.local.com_log." suffix=".txt" timestamp="true"/> </Context></Host> 这其中Context里面的docBase为空,文件路径就靠Host里的appBase去指定,这样tomcat认为你这个站点下没有应用,会自动把每个文件夹当作一个虚拟应用处理。修改后的代码片段如下: <Host name="www.local.com" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Alias>192.168.1.43</Alias> <Context path="" docBase="D://projects//myWebSite//WebContent" reloadable="true"> <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="www.local.com_log." suffix=".txt" timestamp="true"/> </Context></Host> 可以看到Host里面不再指定appBase了,而是在主机下建立一个应用,应用的文件路径通过docBase来指定,这样就不会再产生找不到class的问题了。 ps:tomcat的这个问题好像是从5.5.28就开始了,记得以前也曾经尝试过升级tomcat,就发生了类似的问题,但是当时没充裕时间去解决,就一直把问题遗留到现在。
web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码。下面我以mysql数据库为例分情况一一说明: 两张表:insertTest和insertTest2,前者中有测试数据 create table insertTest(id int(4),name varchar(12)); insert into insertTest values(100,'liudehua'); insert into insertTest values(101,'zhourunfa'); insert into insertTest values(102,'zhouhuajian'); 1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表; insert into insertTest select * from insertTest2; 2.如果只希望导入指定字段,可以用这种方法: INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表; 注意字段的顺序必须一致。 insert into insertTest2(id) select id from insertTest2; 3.如果您需要只导入目标表中不存在的记录,可以使用这种方法: INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表 WHERE not exists (select * from 目标表 where 目标表.比较字段 = 来源表.比较字段); 1>.插入多条记录: insert into insertTest2 (id,name) select id,name from insertTest where not exists (select * from insertTest2 where insertTest2.id=insertTest.id); 2>.插入一条记录: insert into insertTest (id, name) SELECT 100, 'liudehua' FROM dual WHERE not exists (select * from insertTest where insertTest.id = 100); 使用 dual 作表名,select 语句后面直接跟上要插入的字段的值。
1、arcgis server安装过程中,主体文件安装结束,配置server 账号时,遇到invalid password specified,对于arcgissom和arcgissoc两个accounts,任何密码都适合,后来想着新建另外两个arcgissom1和arcgissoc1,通过了,再一看,原来arcgissom和arcgissoc两个账号在计算机管理的账户里已经存在。删去后再装就没问题了。不會有問題了
以前的项目运行好好的,升级了ADT后,进行junit测试时出现错误: # # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (classFileParser.cpp:3494), pid=7480, tid=7376 # Error: ShouldNotReachHere() # # JRE version: 6.0_29-b11 # Java VM: Java HotSpot(TM) 64-Bit Server VM (20.4-b02 mixed mode windows-amd64 compressed oops) # If you would like to submit a bug report, please visit: # http://java.sun.com/webapps/bugreport/crash.jsp # 解决办法: 1.选中junit测试类,右键 -> Run As -> Run Configurations... 2.切换到Classpath选项栏,删掉Bootstrap Entries里面的Android Library,然后点击右侧的Advanced.. -> Add Library -> JRE System Library,一路next即可。
这时再运行该类,就能正常运行了。
字段为Datetime,获得2011-11-05以后添加的记录 SELECT * FROM geo_corporation t WHERE TO_DAYS(t.addtime)>TO_DAYS('2011-11-05') 某一时间段内的记录 SELECT * FROM geo_corporation t WHERE TO_DAYS(t.addtime)>TO_DAYS('2011-11-05') AND TO_DAYS(t.addtime)<TO_DAYS('2011-11-7')
在IBM Z60M上安装Mac OS 10.4.8
(1)下载[weiphone][Mac_OS][Mac OS X 10.4.8][JaS AMD-Intel-SSE2-SSE3 with PPF1 & PPF2].iso,然后通过nero刻盘。注意:盘要好,如果没有刻录好,安装的时候就会出现I/O错误,这个折腾了我不少时间。
(2)在XP下分出一个盘来,大概10G的空间就可以了,格式化成FAT32格式(建议用PM软件)。
(3)进入BISO,设为从光盘启动,把安装盘放入光驱,重新启动电脑。
(4)如果不出意外,您将进入Mac OS安装程序。点“实用程序”-》“磁盘工具”,在这里您将看到所有的盘符,选中我们已经格式化好的磁盘,点抹掉,宗卷格式选Mac OS 扩展(日志式),格式化完后,退出磁盘工具。
(5)再次回到安装Mac的介绍页面,点继续,选中我们格式化好的盘来安装mac,点继续
(6)进入安装类型,这里很关键。把要安装的打印机驱动选上(我全选),本地化语言我选简体中文和繁体中文。JaS Intel 10.4.8 ATA kexts included必须选。然后Support for the most common hardware中的10.4.8.x600.Mobility.Support选上。其他都不要选,点下一步即可。注意,不能把所有的硬件驱动都选上,如果那样的话可以正常安装,但是重启后进入Mac时会出现黑屏现象,应该是由于硬件驱动冲突造成的。
(7)点下一步开始安装,耐心等待,安装完后重启,就可以进入美丽的Mac世界了。
声明:本文只针对IBM Z60M,别的型号的机器由于硬件驱动等问题有可能会不能正常安装。
把jdk\bin目录下的msvcr71.dll复制到tomcat安装目录的\bin下即可
在登陆上服务器之后,打开我的电脑,在地址栏中输入“\\tsclient\C”就可以查看本地的C盘
把 C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tempfile.tmp所有.tmp文件删除然后再上传。有可能需要多试几次。
最好用TSVN上传而不要用Subeclipse
(1)安装php_pdo.dll和php_pdo_cio.dll,在php的安装包里面有,建议用php5.2以上版本;
(2)安装oracle 10g客户端,如果你用的是oracle 9i同样需要安装oracle 10g客户端,否则无法连接oracle。如果你的机器上已经安装有oracle 9i,安装oracle 10g客户端对oracle 9i并没有影响。
(3)重新启动机器。
(4)用phpinfo()检验是否已经加载了php_pdo和php_pdo_oci扩展
连接代码
[development]
database.config.type = pdo_oci
database.config.host=localhost
database.config.username = szapp
database.config.password = szapp
database.config.dbname = ora
database.config.port=1521
$params = array ('dbname' => $config->database->config->dbname,
'username' => $config->database->config->username,
'password' => $config->database->config->password,
'host'=>$config->database->config->host,
'port'=>$config->database->config->port );
$db = Zend_Db::factory ( $config->database->config->type, $params );
$registry->set ( 'db', $db );
步骤如下:
1. AP服务器上建立c:\backup文件夹(文件夹路径客户自己选择)
2. 打开dbbkup.bat-->修改红字部分-->保存
exp citictest/citictest@colm2 file=c:\backup\%date:~4,20%.dmp log=c:\backup\%date:~4,20%.log
compress=y direct=n rows=y owner='citictest'
consistent=n constraints=y grants=y indexes=y triggers=y
3. 将dbbkup.bat放置于c:\backup文件夹之下
4. 控制面板-->任务计划-->添加任务计划-->选择程序以进行计划-->浏览-->选中dbbkup.bat-->每日执行-->选择时间-->输入用户名密码-->完成
5. 执行时间过了之后,c:\backup文件夹下面会出现yyyy-mm-dd.dmp命名的DUMP档案
以前的项目用的是struts1,运行得好好的,现在改用struts2后,发现运行不到一天tomcat就出现内存溢出的错误。使用jProfiler分析一下,发现tomcat启动后使用的内存就一路飙升,而且放在action里面的类根本没有释放掉,应该是struts出现了问题,查一下struts的配置,原来没有配ActionContextCleanUp,在web.xml中加入
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
再次用jprofiler进行分析,果然好了。
(1)定义在web.xml中定义JSPSupportServlet
<servlet>
<servlet-name>JSPSupportServlet</servlet-name>
<servlet-class>
org.apache.struts2.views.JspSupportServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
(2)把struts-html.tld复制到WEB-INF目录
(3)在页面最前面定义标签库
<#assign html=JspTaglibs["/WEB-INF/struts-html.tld"] />
(4)在<head>中引用标签
<@html.base/>
(5) 特别注意,在action的配置里面type="freemarker"去掉。因为如果加type="freemarker",那么base为action的路径,如http://localhost:8080/szmap/findpoi.go,如果去掉type="freemarker",那么base才为网页路径,如http://localhost:8080/szmap/find_poi.htm
最近需要把 www.map512.cn的地图重新进行分割一下,因为以前的地图是通过arcIMS进行分割的,还要配置arcIMS,那烦死人,所以决定还是把以前VB+ArcEngine版本的割图程序修改一下,改成C#+ArcEngine,改完后马上割起来,结果发现程序运行时所耗的内存不断提高,最后异常退出了,这说明肯定有个地方有内存溢出,刚开始以为是我代码的问题,不断的修改代码,花了两天时间还是不行,调试后发现出错的地方在arcEngine的出图函数output()上,于是打电话问ESRI的客服,给我的答案是没有解决的办法,喷饭!!!!
昨天老肖提醒了我一下,打补丁,于是立刻给arcEngine打上了SP5补丁,果然再也没有问题了!靠
心得是:有事别找ESRI技术支持!:)
(1)点项目-》添加应用-》浏览,导入log4net.dll
(2)修改app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="clipmapAEC.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</sectionGroup>
</configSections>
<userSettings>
<clipmapAEC.Properties.Settings>
<setting name="mapModelMinX" serializeAs="String">
<value>-80000</value>
</setting>
<setting name="mapModelMaxX" serializeAs="String">
<value>170000</value>
</setting>
<setting name="mapModelMinY" serializeAs="String">
<value>-80000</value>
</setting>
<setting name="mapModelMaxY" serializeAs="String">
<value>170000</value>
</setting>
<setting name="scalePara" serializeAs="String">
<value>2</value>
</setting>
<setting name="tileSize" serializeAs="String">
<value>512</value>
</setting>
</clipmapAEC.Properties.Settings>
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="consoleApp" />
</root>
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="C:\\clipmap_log.txt" />
<param name="AppendToFile" value="false" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy.MM.dd" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
<param name="Header" value=" ----------------------header--------------------------" />
<param name="Footer" value=" ----------------------footer--------------------------" />
</layout>
</appender>
<appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
<logger name="Log4NetTest.LogTest">
<level value="ERROR" />
<appender-ref ref="rollingFile" />
<appender-ref ref="coloredConsoleApp" />
<appender-ref ref="SystemEvent" />
</logger>
</log4net>
</userSettings>
</configuration>
红色部分是对log4net的设置,其他不用管
(3)在要只用log4net的类namespace前面加using log4net; [assembly: log4net.Config.XmlConfigurator()]
(4)在代码中使用logger.info("XXXX");就可以了
环境
jdk1.6
tomcat5.028
首先下载“xalan系列jar包”,下载地址:http://www.apache.org/dyn/closer.cgi/xml/xalan-j,
然后将tomcat中目录下:/tomcat/common/endorsed/(xercesImpl.jar和xml-apis.jar)删掉,然后将下载的xalan系列jar包(包括serializer.jar、xalan.jar、xercesImpl.jar、xml-apis.jar、xsltc.jar)拷贝到/tomcat/common/endorsed目录,重启tomcat
例如:http://www.map512.cn/findPOI.do?key=南门
如果不转码,request.getParameter("key")返回的是乱码,在jsp中,我们一般这样子传参数
String key2=URLEncoder.encode(key,"gbk");
http://www.map512.cn/findPOI.do?key=key2
那么在freemarker中怎么办呢?
用
<#setting url_escaping_charset='gbk'>
<a href= http://www.map512.cn/findPOI.do?key=${key?url}>查询</a>
<1>软硬件环境
Apache Http Server 2.2.4
Tomcat 5.028
jdk1.6
请自行下载jk_module.so,但注意必须与apache http server的版本对应。
硬件我手头有一台IBM服务器,有三台刀片机可用,IP分别是
S1:192.168.70.101
S2:192.168.70.102
S3:192.168.70.103
当然这三台机器您完全可以用三个一般的台式机来代替.
我们的计划是
用S1来做应用服务器,用S2来做负载均衡,用S3来做数据库服务器.
<2>在S1,S2下安装jdk1.6
例如我安装在c:\jdk1.6下
添加环境变量:
JAVA_HOME=C:\jdk1.6
CLASSPATH=%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
在PATH前面加:
PATH=%JAVA_HOME%\bin;
<3>在S1下安装apache,没有什么值得注意的地方,一路按next就可以了
我安装在D:\Apache2.2
<4>在S1,S2下安装tomcat 5.028
也是一路按next就可以了,我安装在d:\tomcat5.0
以上对于一个java开发人员来说应该都不是问题,接下来就是重头戏了!
<5>配置
5.1 把下载的mod_jk-1.2.26-httpd-2.2.4.so拷贝到S1机器的D:\Apache2.2\modules目录下,并改名为mod_jk.so
5.2 打开S1机器的D:\Apache2.2\conf\http.conf文件,在一堆LoadModule的最后加上这么一行
LoadModule jk_module modules/mod_jk.so
5.3 在D:\Apache2.2\conf\http.conf的最后加上对jk_module的配置
#与tomcat关联
<IfModule jk_module>
JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn
</IfModule>
<IfModule dir_module>
DirectoryIndex index.html,index.jsp,index.htm
</IfModule>
#结束与tomcat关联
#添加虚拟主机,注意S1上apache网页文件目录和tomcat网页文件目录要指向同一个目录,否则静态页面会无法访问
<VirtualHost *:80>
ServerName www.map512.cn
DocumentRoot D:/Tomcat5.0/webapps
ServerAdmin support.szmap@gmail.com
JkMountFile conf/uriworkermap.properties
</VirtualHost>
#给虚拟主机目录付权限
<Directory D:/Tomcat5.0/webapps>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#默认访问
<IfModule dir_module>
DirectoryIndex index.html,index.jsp
</IfModule>
5.4 在D:\Apache2.2\conf\http.conf目录下新建一个文件workers.properties,并添加以下内容
#
# workers.properties
#
# list the workers by name
worker.list=SZMAP, status
# localhost server 1
# ------------------------
worker.s1.port=8009
worker.s1.host=192.168.70.101
worker.s1.type=ajp13
# localhost server 2
# ------------------------
worker.s2.port=8009
worker.s2.host=192.168.70.102
worker.s2.type=ajp13
# worker.s2.stopped=1
worker.SZMAP.type=lb
worker.retries=3
worker.SZMAP.balance_workers=s1, s2
worker.SZMAP.sticky_session=1
worker.status.type=status
说明:这个文件配置了两个worker,一个是SZMAP即我们的应用服务,这个应用服务type是lb即负载均衡,并由s1和s2两个balanced_workers来执行,这里你可以添加无限多个服务器来实现负载(当然,前提是您有足够的RMB),一个是status是用来查看负载均衡状态的,我们后面将会用到.
5.6 在D:\Apache2.2\conf\http.conf目录下新建一个文件uriworkermap.properties,并添加以下内容
/*=SZMAP
/jkstatus=status #设置除以下类型的文件外,都由tomcat提供服务(也就是说下面列出的格式都有apache提供服务)
!/*.gif=SZMAP
!/*.jpg=SZMAP
!/*.png=SZMAP
!/*.css=SZMAP
!/*.js=SZMAP
!/*.html=SZMAP
说明:这个配置的意思是,所有的请求都转到SZMAP这个worker(即上面配置的s1,s2这两个balanced_workers下的tomcat服务)去执行,除了*.gif,*.html等静态元素和/jkstatus,/jkstatus由status这个worker执行.
5.7 Tomcat的配置
打开S1机器D:\Tomcat5.0\conf\server.xml,找到Engine部分,改成
<Engine defaultHost="localhost" name="Catalina" jvmRoute="s1">
<Host appBase="webapps" name="localhost">
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.html;.*\.txt;"/>
</Cluster>
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_log." suffix=".txt" timestamp="true"/>
</Host>
<Logger className="org.apache.catalina.logger.FileLogger" prefix="catalina_log." suffix=".txt" timestamp="true"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
</Engine>
打开S2机器D:\Tomcat5.0\conf\server.xml,找到Engine部分,改成
<Engine defaultHost="localhost" name="Catalina" jvmRoute="s2">
<Host appBase="webapps" name="localhost">
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.html;.*\.txt;"/>
</Cluster>
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_log." suffix=".txt" timestamp="true"/>
</Host>
<Logger className="org.apache.catalina.logger.FileLogger" prefix="catalina_log." suffix=".txt" timestamp="true"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
</Engine>
到此,我们的配置已经完成.
<6>查看结果
启动S1和S2下的tomcat服务,然后启动S1下的apache服务.
打开流览器,输入地址http://192.168.70.101/jkstatus,如果能看到以下界面,那么,恭喜您,您该感谢我了!呵呵!
JK Status Manager for 192.168.70.101:80
Server Version: |
Apache/2.2.4 (Win32) mod_jk/1.2.26 |
JK Version: |
mod_jk/1.2.26 |
[Change Format: XML | Property | Text] [ Read Only] [ S=Show only this worker, E=Edit worker, R=Reset worker state, T=Try worker recovery]
Listing Load Balancing Worker (1 Worker) [Hide]
[S|E|R] Worker Status for SZMAP
Type |
Sticky Sessions |
Force Sticky Sessions |
Retries |
LB Method |
Locking |
Recover Wait Time |
Max Reply Timeouts |
lb |
True |
False |
2 |
Request |
Optimistic |
60 |
0 |
Good |
Degraded |
Bad/Stopped |
Busy |
Max Busy |
Next Maintenance |
2 |
0 |
0 |
0 |
6 |
32/94 |
Balancer Members [Hide]
|
Name |
Type |
Host |
Addr |
Act |
State |
D |
F |
M |
V |
Acc |
Err |
CE |
RE |
Wr |
Rd |
Busy |
Max |
Route |
RR |
Cd |
Rs |
[E|R] |
s1 |
ajp13 |
192.168.70.101:8009 |
192.168.70.101:8009 |
ACT |
OK/IDLE |
0 |
1 |
1 |
0 |
1821 |
0 |
0 |
0 |
1.3M |
2.0M |
0 |
5 |
s1 |
|
|
0/0 |
[E|R] |
s2 |
ajp13 |
192.168.70.102:8009 |
192.168.70.102:8009 |
ACT |
OK/IDLE |
0 |
1 |
1 |
0 |
1821 |
0 |
0 |
0 |
1.3M |
2.0M |
0 |
4 |
s2 |
|
|
0/0 |
Edit one attribute for all members: [ Activation | LB Factor | Route | Redirect Route | Cluster Domain | Distance ]
参考:
proxy方式 :http://blog.chinaunix.net/u/22176/showart_1002535.html
liunx下 的配置:http://seven.blog.51cto.com/120537/57930
所有的页面用UTF-8编码,然后
在struts.xml中加
<constant name="struts.locale" value="zh_CN"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
即可。
(1)在eclipse中配置好struts2
(2)把struts2-spring-plugin-2.0.11.2.jar包复制到WEB-INF\lib目录
(3)在web.xml中配置spring
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
记住,如果您之前用过spring,请把spring配置去掉。
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
(4)修改applicationContext.xml
<beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
(5)在struts.xml加入
<constant name="struts.objectFactory" value="spring" />
(6)在spring的配置文件applicationContext.xml中定义action
<bean id=" SearchBusLineAction"
class="com.bus.struts2.action.SearchBusLineAction" abstract="false"
lazy-init="default" autowire="default" dependency-check="default">
<property name="busService">
<ref bean="BusServiceImpl" />
</property>
</bean>
(7)在struts.xml中定义action
<!-- 注意这里class=" SearchBusLineAction"而不是com.bus.struts2.action.SearchBusLineAction是因为这个已经在spring的applicationContext.xml中定义 -->
<action name="searchBusLine" class="SearchBusLineAction">
<result name="success" type="freemarker">/index.jsp</result>
</action>
选Project->Clean...重新编译一下项目就可以了。
freemarker脚本将你的页面搞得一团槽吧.
修改一下dreamweaver的配置,将freemarker 脚本显示成和js一样的图标效果吧
以dreamweaver8为例
打开
Dreamweaver 8\Configuration\ThirdPartyTags\Tags.xml
加入
< !-- FreeMarker Tag By hety-->
<directive_spec
tag_name="ftl_b1" start_string="[#" end_string="]"
detect_in_attribute="true" icon="TemplateExpr.gif" icon_width="17"
icon_height="15"/>
<directive_spec tag_name="ftl_e1"
start_string="[/#" end_string="]" detect_in_attribute="true"
icon="TemplateExpr.gif" icon_width="17" icon_height="15"/>
<directive_spec
tag_name="ftl_i" start_string="[@" end_string="/]"
detect_in_attribute="true" icon="TemplateExpr.gif" icon_width="17"
icon_height="15"/>
<directive_spec tag_name="ftl_b2"
start_string="<#" end_string=">" detect_in_attribute="true"
icon="TemplateExpr.gif" icon_width="17" icon_height="15"/>
<directive_spec
tag_name="ftl_e2" start_string="</#" end_string=">"
detect_in_attribute="true" icon="TemplateExpr.gif" icon_width="17"
icon_height="15"/>
<directive_spec tag_name="ftl_v"
start_string="${" end_string="}" detect_in_attribute="true"
icon="TemplateExpr.gif" icon_width="17" icon_height="15"/>
重启下dreamweaver就搞定
dreamweaver其它版本的脚本配置也差不多
还可参考:http://weishuwei.javaeye.com/blog/85041
http://blog.csdn.net/maxgong2005/archive/2006/05/12/725977.aspx
(1)配置tomcat支持SSL,请参考我的文章:http://www.blogjava.net/menglikun/archive/2008/07/02/212065.html
(2)把证书导到jre,运行cmd
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>d:
D:\>cd d:\tomcat5.0
D:\Tomcat5.0>keytool -export -file myserver.cert -alias cas -keystore server.key
store
输入keystore密码:
保存在文件中的认证 <myserver.cert>
D:\Tomcat5.0>
执行到这里,您应该可以在d:\tomcat5.0目录中找到一个文件myserver.cert
接着,我们要把这个证书文件导到客户端的JVM中,因为现在我们的客户端和服务器端都是同一台机器,所以直接进入cmd,执行以下命令就可以了
D:\Tomcat5.0>keytool -import -keystore c:/jdk1.6/jre/lib/security/cacerts -file
myserver.cert -alias cas
输入keystore密码: //注意,这里是默认密码changeit
所有者:CN=localhost, OU=szghj, O=szghj, L=suzhou, ST=jiangsu, C=cn
签发人:CN=localhost, OU=szghj, O=szghj, L=suzhou, ST=jiangsu, C=cn
序列号:486ae46a
有效期: Wed Jul 02 10:14:02 CST 2008 至Tue Sep 30 10:14:02 CST 2008
证书指纹:
MD5:AC:A9:C2:47:36:DF:D0:C1:76:F3:6D:14:70:73:90:5C
SHA1:3C:2E:45:92:29:98:ED:7E:93:34:BB:11:2D:EE:ED:E3:E4:4D:E3:85
签名算法名称:SHA1withRSA
版本: 3
信任这个认证? [否]: y
认证已添加至keystore中
(3)配置CAS服务器
我用户的是3.2.1版本,直接把cas-server-webapp-3.2.1.war复制到tomcat的webapp目录,改名为userservice-cas就可以了
(4)配置客户端,我用的是cas-client-java-2.1.0,把casclient.jar复制到客户端的lib目录,然后打开web.xml,添加如下的过滤器就可以了。
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>
edu.yale.its.tp.cas.client.filter.CASFilter
</filter-class>
<init-param>
<param-name>
edu.yale.its.tp.cas.client.filter.loginUrl
</param-name>
<param-value>
https://localhost:8443/userservice-cas/login
</param-value>
</init-param>
<init-param>
<param-name>
edu.yale.its.tp.cas.client.filter.validateUrl
</param-name>
<param-value>
https://localhost:8443/userservice-cas/serviceValidate
</param-value>
</init-param>
<init-param>
<param-name>
edu.yale.its.tp.cas.client.filter.serverName
</param-name>
<param-value>
localhost:4000
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/jsp/user/*</url-pattern>
</filter-mapping>
其他:
(1)成功登录后,出现错误 Unable to validate ProxyTicketValidator 是什么原因。
这是因为数字证书的签名不一致造成的,例如生成证书的时候用localhost,但是访问的时候却用机器名。统一一下就可以了
由于最近需要CAS,所以研究了一下tomcat SSL的配置,现记录下来。
环境:
window xp
tomcat 5.028
jdk 1.6
(1)进入cmd
我的tomcat安装在d:\tomcat5.0,所以进入该目录
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>d:
D:\>cd d:\tomcat5.0
D:\Tomcat5.0>keytool -genkey -alias cas -keyalg RSA -keystore server.keystore //别名是cas,您可以自己修改
输入keystore密码: //我输入了密码menglikun,您可以自己改,但要记住,后面要用到
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]: localhost //如果是开发环境,建议用localhost或机器名,如果是发布环境,请用域名,不要用IP
您的组织单位名称是什么?
[Unknown]: szghj
您的组织名称是什么?
[Unknown]: szghj
您所在的城市或区域名称是什么?
[Unknown]: suzhou
您所在的州或省份名称是什么?
[Unknown]: jiangsu
该单位的两字母国家代码是什么
[Unknown]: cn
CN=localhost, OU=szghj, O=szghj, L=suzhou, ST=jiangsu, C=cn 正确吗?
[否]: y
输入<cas>的主密码
(如果和 keystore 密码相同,按回车): //输入密码menglikun
再次输入新密码:
D:\Tomcat5.0>
执行到这一步,如果不出意外的话,在d:\tomcat5.0目录下就会有一个server.ksystore文件
(2)打开d:\tomcat5.0\conf\server.xml,添加一个新的connector,修改后的server.xml如下:
<?xml version='1.0' encoding='utf-8'?>
<Server>
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<GlobalNamingResources>
<Environment name="simpleValue" type="java.lang.Integer" value="30"/>
<Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>
<ResourceParams name="UserDatabase">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/tomcat-users.xml</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>
<Service name="Catalina">
<Connector URIEncoding="UTF-8" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" port="4000" redirectPort="8443" useBodyEncodingForURI="true" maxSpareThreads="75" maxThreads="150" minSpareThreads="25">
</Connector>
<Connector port="8009" protocol="AJP/1.3" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" redirectPort="8443">
</Connector>
<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystorePass="menglikun" keystoreFile="server.keystore" />
<Engine defaultHost="localhost" name="Catalina">
<Host appBase="webapps" name="localhost">
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_log." suffix=".txt" timestamp="true"/>
</Host>
<Logger className="org.apache.catalina.logger.FileLogger" prefix="catalina_log." suffix=".txt" timestamp="true"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
</Engine>
</Service>
</Server>
(3)重新启动tomcat,在浏览器中输入https://localhost:8443,如果出现安全提示,说明SSL配置成功
(1)开通泛域名支持,即house.map512.cn,plan.map512.cn,map512.cn都指向同一IP,如218.4.157.245
(2)修改tomcat目录下的conf/server.xml,在engine里面添加
<Host name="localhost" debug="0" appBase="E:\\Tomcat5.0\\webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Logger className="org.apache.catalina.logger.FileLogger"
directory="logs" prefix="localhost_log." suffix=".txt"
timestamp="true"/>
<Context path="" docBase="E:\\Tomcat5.0\\webapps\\szmap" reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>
<Host name="house.map512.cn" debug="0" appBase="E:\\Tomcat5.0\\suzhou"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Alias>house.map512.cn</Alias>
<Context path="" docBase="E:\\Tomcat5.0\\suzhou\\szhouse" reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>
<Host name="plan.map512.cn" debug="0" appBase="E:\\Tomcat5.0\\suzhou"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Alias>plan.map512.cn</Alias>
<Context path="" docBase="E:\\Tomcat5.0\\suzhou\\szghgs" reloadable="true" caseSensitive="false" debug="0"></Context>
</Host>
网上有很多介绍,但是都太麻烦,特别是当你的表中有lob字段的时候,其实很简单,用以下SQL就可以了。
create table tab2 tablespace space2 as (select t.* from tab1 t);
tab1为原来的表,tab2为临时表 space2为目的表空间。
执行完后,把tab1删除,然后把tab2改名为tab1就可以了。注意该方法不能复制索引,所以必须重建索引!
1、尽量不要使用 like '%..%'
2、对于 like '..%..' (不以 % 开头),Oracle可以应用 colunm上的index
3、对于 like '%...' 的 (不以 % 结尾),可以利用 reverse + function index 的形式,变化成 like '..%' 代码
建测试表和Index。
注意:重点在于带reverse的function index。同时,一定要使用CBO才行......
SQL> select reverse('123') from dual;
REVERSE('123')
--------------------------------
321
1 row selected.
SQL> create table test_like as select object_id,object_name from dba_objects;
Table created.
SQL> create index test_like__name on test_like(object_name);
Index created.
SQL> create index test_like__name_reverse on test_like(reverse(object_name));
Index created.
SQL> analyze table test_like compute statistics for table for all indexes;
Table analyzed.
SQL> set autot trace
--常量开头的like , 会利用index ,没问题......
SQL> select * from test_like where object_name like AS%';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655Bytes=15720)
2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME' (NON-UNIQUE) (Cost=2 Card=118)
-- 开头和结尾都是%,对不起,很难优化
SQL> select * from test_like where object_name like '%%';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)
1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 ytes=15720)
-- 以常量结束,直接写的时候是不能应用index的
SQL> select * from test_like where object_name like '%S';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)
1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 Bytes=15720)
--'以常量结束的,加个reverse 函数,又可以用上index了'
SQL> select * from test_like where reverse(object_name)like reverse('%AS');
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655 Bytes=15720)
2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME_REVERSE' (NON-UNIQUE) (Cost=2 Card=118)
来源:http://forum.ubuntu.org.cn/viewtopic.php?t=120157&highlight=
今天开机的时候,ubuntu系统提示说
Busybox v1.1.3 (debian1:1.1.3-5 ubuntu12)built-in shell (ash)
enter 'help'for a list of built-in commands
(initranfs)
在网上找了很多资料终于找到了解决方法:
先说说我的情况,我的是双系统,WindowsXP+Ubuntu,所以我进去windowsxp系统
把boot里面的initrd.img-2.6.24-12-generic.bak重命名替换initrd.img-2.6.24-12-generic
我的问题就是这样解决的。
重启电脑,一切正常!!
希望对大家有帮助!
我的开发环境:Oracle 9i,Window Server 2003
(1)正确安装Oracle 9i企业版,Oracle9i企业版在安装的时候就已经默认提供了全文索引支持。如果你的Oracle还没有安装,请先安装一下,至于怎样安装,这里不做讨论,请Google一下。
(2)Oracle9i默认情况下会把ctxsys用户锁定,请以DBA身份登陆Oracle,把用户ctxsys解锁,并修改其密码为ctxsys,以便于我们后面登陆Text Manager
(3)进入Oracle的text manager,点程序->Oracle-OracleHome92->Enterprise Manager Console。选独立启动,然后选工具栏最下面的应用程序->text Manager,这时会要求您输入用户名和密码,用户名ctxsys,密码ctxsys
(4)选择首选项——〉语言指定器——〉CTXSYS,选一个点类似创建,输入指示器的名字如chinese_lexer,选择lexer下的chinese_vgrnm_lexer 。
(5)建立索引,在索引上点右键,然后选创建CONTEXT索引,这里要注意方案要选择您自己的表空间,如我有个表SZPOI在表空间SUZHOU中,现在我要对该表的UNITNAME字段建立全文索引,那么方案选suzhou,表选szpoi,字段选unitname,首选项中选择chinese_lexer 。
这样全文检索就建好了,并用chinese_vgram_lexer作为分析器。
(6)如何查询数据。索引建立以后,我们就可以对该表进行全文索引查询了,查询语句如下:
SELECT score(1),t.unitname,t.objectid,t.eminx,t.eminy,t.mpfullname,t.dianhua FROM szpoi t WHERE contains (unitname, '规划局,吴中分局', 1) > 0 order by score(1) desc
这个语句的意思是在表szpoi中查询unitname包含“规划局”和“吴中分局”两个关键字的记录,并按匹配度从高到低排序。
大功告成了吗?没有!
接着我们还要建立两个job来维护和优化索引。
维护:
begin
sys.dbms_job.submit(job => :job,
what => 'ctx_ddl.sync_index(''SZPOI_UNITNAME_INDEX'');',
next_date => to_date('23-05-2008 13:54:57', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'SYSDATE + (1/24/4)');
commit;
end;
优化:
begin
sys.dbms_job.submit(job => :job,
what => 'ctx_ddl.optimize_index(''SZPOI_UNITNAME_INDEX'',''FULL'');',
next_date => to_date('23-05-2008 14:03:02', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'SYSDATE + 1');
commit;
end;
一、下载三个软件:Apache 2,Subversion和TortoiseSVN
二、安装apache,最好用80端口
三、安装Subversion
四、安装TortoiseSVN
五、进入D:\Subversion,新建一个目录projects
六、在projects目录中点鼠标右键,选择TortoiseSVN->create reposities here...新建一个仓库
七、打开apache的httpd.conf文件,找到
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
把前面的#去掉,并添加
LoadModule dav_svn_module D:/Subversion/bin/mod_dav_svn.so
LoadModule authz_svn_module D:/Subversion/bin/mod_authz_svn.so
八、在httpd.conf后面添加
<Location /svn>
#
# SVN
#
DAV svn
SVNParentPath "D:/Subversion"
</Location>
保存,然后重启apache,打开ie,输入http://localhost/svn/projects/看看能不能打开,如果能打开,恭喜您,您离成功已经不远了!
九、设置权限
点开始->运行,打开控制台
进入D:\Apache\Apache2\bin,运行
htpasswd -c D:\Subversion\passwd menglikun
新建一个密码文件,并添加用户menglikun,如果要添加更多用户,运行
htpasswd -m D:\Subversion\passwd test
添加test用户
十、修改apache的httpd.conf文件
<Location /svn>
#
# SVN
#
DAV svn
SVNParentPath "D:/Subversion"
AuthType Basic
AuthName "Subversion repository"
AuthUserFile D:/Subversion/passwd
Require valid-user
</Location>
保存,重启apache,再次进入http://localhost/svn/projects,这次就要求输入密码了!
OK,大功告成!
更多设置,请找google,如如何设置目录的访问权限(只读,可写等等)。
新建一个CSS标签,标签名选择TABLE,确定后在弹出的CSS样式编辑器里,选"分类"中的"方框"选项,将里面的宽,高,填充,边界的值全部设为0;再将"定位"中"类型"下面的宽,高的值也都设为0,点保存,然后再把表格的样式设置为table就可以了,即class="TABLE".
firefox上网慢是由于解析域名需要太长时间造成的,解决办法如下(有时间再翻译成中文):
A DNS server resolves domain names into IP addresses. So when you request “yahoo.com” for example, the DNS server finds out the address for the domain, and sends your request the right way.
You can run a DNS cache on your computer. This will speed up the process of looking up domain names when browsing. The difference is about 30-60 ms. Multiply that difference by the number of websites you visit a day for an approximate estimate of the speed improvement.
The following instructions are for someone with a broadband internet connection, where the computer gets it’s local IP address using DHCP from the router in your home or office.
Install dnsmasq in Ubuntu
Dnsmasq is a lightweight, easy to configure, DNS forwarder and DHCP server. It is designed to provide DNS and optionally, DHCP, to a small network. It can serve the names of local machines which are not in the global DNS. The DHCP server integrates with the DNS server and allows machines with DHCP-allocated addresses to appear in the DNS with names configured either in each host or in a central configuration file. Dnsmasq supports static and dynamic DHCP leases and BOOTP for network booting of diskless machines.
First you need to make sure that Universe repository is enabled in your sources.list file
Install dnsmasq Using the following command
sudo apt-get install dnsmasq
uncomment the following line (remove “#” in the beginning) in the file /etc/dnsmasq.conf
listen-address=127.0.0.1
Now edit
/etc/dhcp3/dhclient.conf
and make sure the section below exactly like this, especially the line that says “prepend domain-name-servers 127.0.0.1;”
#supersede domain-name “fugue.com home.vix.com”;
prepend domain-name-servers 127.0.0.1;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name,
netbios-name-servers, netbios-scope;
In the normal case, when you get a new dhcp lease, the dhcp3 client (tool) on your computer gets a new lease, and updates the
/etc/resolv.conf
file on your computer with the right values for the DNS servers to use (usually some machine in the network of your hosting provider). Adding the “prepend” option as we did above ensures that “127.0.0.1″ will appear on the top of the list of DNS servers. That magic number refers to your own computer. So in the future, whenever your computer needs to resolve a domain name, it will forward that request to dnsmasq (which is running at 127.0.0.1 - your computer). If the details for the domain name are already in you cache, well and good, dnsmasq will serve it up and make the process real fast. If it is not in the cache, then dnsmasq will look at the /etc/resolv.conf file and use the nameservers listed below the “127.0.0.1″. I hope that explains things.
Now open the file
/etc/resolv.conf
in your text editor. It probably looks like:
search yourisp.com
nameserver 217.54.170.023
nameserver 217.54.170.024
nameserver 217.54.170.026
The 127.0.0.1 is missing right now since you haven’t renewed your lease after you edited the /etc/dhcp3/dhclient.conf file. So, let us add that in manually this one time. After you do, your /etc/resolv.conf file will look like the following:
search yourisp.com
nameserver 127.0.0.1
nameserver 217.54.170.023
nameserver 217.54.170.024
nameserver 217.54.170.026
Now you need to restart the dnsmasq using the following command
sudo /etc/init.d/dnsmasq restart.
Now you are running a local DNS cache.
Testing Your Local DNS Cache
If you want to measure your speed improvement, type the command
dig yahoo.com
You will see something like “;; Query time: 38 msec” there.
Now type the command again, and you should see something like:”;; Query time: 2 msec”
apache 2.2.3
tomcat 5.028
下载 mod_jk.so( http://www.blogjava.net/Files/menglikun/mod_jk2.rar )放到D:\Apache2.2\modules
修改D:\Apache2.2\conf\httpd.conf在后面加以下代码
# Using mod_jk2.dll to redirect dynamic calls to Tomcat
LoadModule jk_module modules\mod_jk2.so
JkWorkersFile "conf\workers.properties"
JkLogFile "logs\mod_jk2.log"
JkLogLevel debug
JkMount /*.jsp worker1
JkMount /szmap3/* worker1
在D:\Apache2.2\conf\httpd.conf中新建workers.properties加入代码
workers.tomcat_home=d:\Tomcat5.0 #让mod_jk模块知道Tomcat
workers.java_home=C:\jdk1.5 #让mod_jk模块知道j2sdk
ps=\ #指定文件路径分割符
worker.list=worker1
worker.worker1.port=8009 #工作端口,若没占用则不用修改
worker.worker1.host=localhost #Tomcat服务器的地址
worker.worker1.type=ajp13 #类型
worker.worker1.lbfactor=1 #负载平衡因数
为避免出现乱码,必须修改tomcat安装目录下的conf/server.xml,修改以下配置
<Connector port="8009" protocol="AJP/1.3" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" redirectPort="8443" URIEncoding="GBK">
</Connector>
重新启动apache就可以了
这是因为form里面有个按钮名字叫submit,改成别的别的名称如submit2就可以了。
用encodeURIComponent就可以了。如以下代码:
var name = document.getElementById("textName").value;
if (name=="楼盘名称")
name = "";
var url="house/searchHouse.php?district="+encodeURIComponent(district);
一、软件准备
(1)apache_2.2.3-win32-x86-no_ssl.msi 到官方网站下载
(2)php-5.2.4-win32-installer.msi 到官方网站下载
二、安装apache_2.2.3我们安装在D:\apache2.2目录下,如果您的机器上已经安装有oracle,因为oracle的apache占用了80端口,安装完后打开D:\Apache2.2\conf\httpd.conf文件,把Listen 80改成别的端口号,如4001
三、安装php5.2.4,安装时要求选择apache安装目录,选择D:\Apache2.2就可以了。
四、测试PHP是否已经安装成功,进入D:\Apache2.2\htdocs新建一个文本文件,输入
<?php
phpinfo();
?>
另存为phpinfo.php
启动apahche服务,然后打开浏览器,输入 http://localhost:4001/phpinfo.php,如果出现php信息页面,说明php安装成功。
declare cursor t1 is select * from szmenpaipro; begin for rec in t1 loop update wgspoi t set t.detail=rec.jieshao where t.objectid=rec.objid; end loop; end;
出现这个错误是因为oracle序列R3产生的值在表gdb_objectclasses中已经有记录造成的。解决办法是进入plus/sql或用PL/SQL Developer链接oracle. (1)执行SQL SELECT MAX(id) FROM gdb_objectclasses 找出id的最大值。例如执行结果是 MAX(ID) --------------- 55 (2)执行SQL
SELECT registration_id FROM table_registry WHERE table_name = 'GDB_OBJECTCLASSES'
找到表'GDB_OBJECTCLASSES'注册ID号 如执行结果是 -------------- 3 (3)执行SQL SELECT last_number FROM user_sequences WHERE sequence_name = 'R3' 找出序列R3的下一个值,如果第二步中的执行结果是4则这里是R4。例如执行结果是: LAST_NUMBER --------------- 50 (4)从上面的查询结果中可以看出,序列R3的下一个值是50,而表gdb_objectclasses中小于55的值都已经被占用了。所以就会出现异常Unique contraint (SDE.GDB_OC_PKC) violated。解决办法是不断增加序列R3的值,使其大于55,执行下面的SQL语句6次就可以了。 SELECT R3.NEXTVAL from dual (5)在SDE中,选中sde连接后点鼠标右键,选择refresh。然后就可以再导数据了。注意这一步一定要进行,这也是我一直认为sde很烂的地方。
例如有这样一个表,其中ID号为AAAK2aAAMAAAOX+AAX的记录是重复的,如何只取其中一条记录呢?
ID1
|
XINGMING
|
XINGBIE
|
CENGYONGMING
|
MINZU
|
PAICHUSUOBIANHAO
|
JUWEIHUIBIANHAO
|
AAAK2aAAMAAAOefAAx
|
陈长芬
|
2
|
|
01
|
32059856
|
3205985607
|
AAAK2aAAMAAAOfgAAn
|
陈尺平
|
1
|
|
01
|
32059856
|
3205985615
|
AAAK2aAAMAAAOX+AAX
|
陈春付
|
1
|
|
01
|
32059856
|
3205985602
|
AAAK2aAAMAAAOX+AAX
|
陈春付
|
1
|
|
01
|
32059856
|
3205985602
|
AAAK2aAAMAAAOX+AAX
|
陈春付
|
1
|
|
01
|
32059856
|
3205985602
|
通过这个SQL就可以了。 create table szzzrktemp as (select * from zzrktemp t1 where rowid in (select max(rowid) from zzrktemp t2 where t1.id1=t2.id1))
oracle打了9.2.0.4的补丁之后,必须把版本也改变过来。 运行cmd sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on 星期四 4月 5 09:35:41 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> conn sys/system@ora as sysdba 已连接。 SQL> shutdow immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
SQL> startup migrate ORACLE 例程已经启动。
Total System Global Area 1687760036 bytes Fixed Size 457892 bytes Variable Size 486539264 bytes Database Buffers 1199570944 bytes Redo Buffers 1191936 bytes 数据库装载完毕。 数据库已经打开。 SQL> spool d:\catpatch.log SQL> @d:\oracle\ora92\rdbms\admin\catpatch.sql SQL> spool off 注:在catpatch中会调用catexp来修改exp
至此成功修改exp 使用exp导出成功DD
当一个access表中有“备注”类型的字段时,通过access的“导出”命令导到oracle时,将出现错误而无法导入。解决办法是通过PL/SQL Developer来导。
当我们用下面的通用代码插入一个点到空间表中时,会报SPECIFIED ATTRIBUTE COLUMN DOESN'T EXIST错误,错误信息如下:
ArcSDE Error Number : -38 Error Description : SPECIFIED ATTRIBUTE COLUMN DOESN'T EXIST. com.esri.sde.sdk.client .SeException: at com.esri.sde.sdk.client.j.a(Unknown Source) at com.esri.sde.sdk.client.j.a (Unknown Source) at com.esri.sde.sdk.client.SeInsert.intoTable(Unknown Source) at com.suzhou.service.sde.SDEOperation.addPointObject(SDEOperation.java:59) at com.suzhou.struts.action.AdminCheckNewObjAction.execute (AdminCheckNewObjAction.java:143) at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java :419) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194) at org.apache.struts.action.ActionServlet.doGet ( ActionServlet.java:414) at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at com.suzhou.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java :24) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal (StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext (StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.coyote.http11.Http11Processor.process (Http11Processor.java:799) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:619) 插入点的java代码如下:
String server = "menglikunm";
int instance = 5151;
String database = "ora";
String user = "suzhou";
String password = "suzhou";
public Long addPointObject(long x, long y, String tabname) throws Exception { SeLayer insertLayer = null; SeConnection conn = null; Long intsertRowID = null; try { conn = new SeConnection(server, instance, database, user, password); Vector layerList = conn.getLayers(); for (int index = 0; index < layerList.size(); index++) { SeLayer layer = (SeLayer) layerList.elementAt(index); System.out.println(layer.getName()); if ( layer.getName().equalsIgnoreCase(tabname)) { insertLayer = layer; break; } } } catch (SeException e) { // e.printStackTrace(); throw e; } // 开始插入数据 if (insertLayer == null) { throw new Exception("找不到空间表:" + tabname); } try { conn.startTransaction(); String[] cols = new String[1]; //cols[0] = insertLayer.getSpatialColumn(); cols[0]="SHAPE"; System.out.println(cols[0]); SeInsert insert = new SeInsert(conn); System.out.println(insertLayer.getName()); insert.intoTable(insertLayer.getName(), cols);//运行到这里时出现错误! insert.setWriteMode(true); SeCoordinateReference coordref = (SeCoordinateReference) insertLayer .getCoordRef(); SeShape shape = new SeShape(coordref);
int numPts = 1; SDEPoint[] ptArray = new SDEPoint[numPts]; ptArray[0] = new SDEPoint(x, y); shape.generatePoint(numPts, ptArray); SeRow row = insert.getRowToSet(); row.setShape(0, shape); insert.execute(); intsertRowID = new Long(insert.lastInsertedRowId().longValue()); insert.close(); conn.commitTransaction(); conn.close(); } catch (Exception ex) { ex.printStackTrace (); try { conn.rollbackTransaction(); conn.close(); } catch (Exception ex2) { } throw ex; } return intsertRowID; }
之所以出现这个错误,是因为当插入一个点到空间表中时,arcsde自动生成一个OBJECTID值,但如果你的空间表导到SDE的时候表中已经有了OBJECTID字段,SDE自动生成的是OBJECTID_1字段作为每条记录的ID字段,如果你把OBJECTID_1字段人为的删除,那么这时候arcSDE就找不到该字段了,就会报出SPECIFIED ATTRIBUTE COLUMN DOESN'T EXIST.的错误,解决办法是重新导一下该空间表,且导入的时候不能有命名为OBJECTID的字段。
很多时候,这些问题都要你自己来发现和解决,不能太相信ESRI的技术支持,他们大部分时候都不能给你什么帮助:)
例如有的时候你需要你的笔记本去作演示,web应用安装在你的笔记本上,但没有网线,无法连网。这时候如果启动tomcat,将无法链接数据库,那怎么办呢。点网络连接,选择属性,然后把所有驱动都安装一遍,再重新启动tomcat服务就可以了。
下面是矩形选择的源代码。多边形选择多加点就可以了。 public class RectSelectAction extends Action {
// --------------------------------------------------------- Instance // Variables
// --------------------------------------------------------- Methods
/** *//** * Method execute * * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaActionForm rectSelectForm = (DynaActionForm) form; String startx = rectSelectForm.getString("startx"); String starty = rectSelectForm.getString("starty"); String endx = rectSelectForm.getString("endx"); String endy = rectSelectForm.getString("endy"); Map map = (Map) request.getSession().getAttribute("THEMAP"); Polygon polygon = this.creatPolygon(map, startx, starty, endx, endy); if (polygon == null) { ActionMessages msgs = new ActionMessages(); msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "com.suzhou.message.createPolygonFail")); this.saveMessages(request, msgs); return mapping.findForward("resultPage"); } FeatureLayer menpaiLayer = null; for (int i = 0; i < map.getLayers().getCount(); i++) { if (map.getLayers().item(i).getName().equals("地物点")) { menpaiLayer = (FeatureLayer) map.getLayers().item(i); System.out.println(menpaiLayer.getName()); System.out.println(menpaiLayer.getID()); } } if (menpaiLayer == null) { ActionMessages msgs = new ActionMessages(); msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "com.suzhou.message.layerNotExsist", "地物点")); this.saveMessages(request, msgs); return mapping.findForward("resultPage"); } map.getLayers().setGeometry(true);// 设置返回空间信息 menpaiLayer.getRecordset().clearRecordset(); menpaiLayer.getRecordset().clearEnvelope(); menpaiLayer.getRecordset().clearGeometry(); map.getLayers().setOrder(false); menpaiLayer.setFilterObject(null); Filter filter2 = new Filter(); // filter2.addSubField("BLOCKNAME"); // filter2.addSubField("MPNUM"); // filter2.addSubField("MPABNAME"); // filter2.addSubField("MPSUBNUM"); //filter2.setWhereExpression(""); filter2.setGlobalEnvelope(true); filter2.setSpatialShape(polygon); filter2.setRelation(Filter.AREA_INTERSECTION); menpaiLayer.setFilterObject(filter2); map.refresh(); menpaiLayer.setFilterObject(null); if (menpaiLayer.getRecordset() == null || menpaiLayer.getRecordset().getCount() < 1) { ActionMessages msgs = new ActionMessages(); msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( "com.suzhou.message.objectNotFound")); this.saveMessages(request, msgs); return mapping.findForward("resultPage"); }else{ request.setAttribute("result",menpaiLayer.getRecordset()); return mapping.findForward("resultPage"); } }
/** *//** * 建立矩形 * * @param map * @param startx:起点屏幕X坐标 * @param starty:起点屏幕Y坐标 * @param endx:终点屏幕X坐标 * @param endy:终点屏幕Y坐标 * @return */ public Polygon creatPolygon(Map map, String startx, String starty, String endx, String endy) { try { Point pnt1 = map.toMapPoint(new Double(startx).doubleValue(), new Double(starty).doubleValue()); Point pnt2 = map.toMapPoint(new Double(endx).doubleValue(), new Double(endy).doubleValue()); Point pnt11 = new Point(); Point pnt22 = new Point(); pnt11.setX(pnt1.getX()); pnt11.setY(pnt2.getY()); pnt22.setX(pnt2.getX()); pnt22.setY(pnt1.getY()); Points points = new Points(); points.addPointObject(pnt1); points.addPointObject(pnt11); points.addPointObject(pnt2); points.addPointObject(pnt22); Ring ring = new Ring(); ring.setPoints(points); Polygon polygon = new Polygon(); polygon.addRing(ring); return polygon; } catch (Exception ex) { return null; } } }
当一个web站点发布到互联网上以后,系统的稳定性很重要。而如果你后台用的是oracle 9i,有时候会出现oracle服务意外停止的现象。解决办法是: (1)给oracle打最新的补丁(很重要) (2)在控制面板的服务里面选择oracleServiceXXX,选择属性,点“恢复”,把下面的三个操作都设置为“重新启动”就可以了。
大家都知道,在进行arcims开发时,经常要重新启动arcIMS服务,如果你还用了arcSDE,那么要启动的服务更多。如果每次都到控制面板中启动,累都累死人了。可以通过批处理来启动这些服务。 新建一个.bat文件,如“启动所有服务.bat”。打开,输入以下代码: net start "OracleOraHome92TNSListener" pause net start "OracleServiceORA" pause net start "esri_sde" pause net start "ArcIMS Application Server 9.1" pause net start "ArcIMS Monitor 9.1" pause net start "ArcIMS Tasker 9.1" pause
说明: net start "OracleOraHome92TNSListener" --启动Oracle服务 pause --暂停 net start "OracleServiceORA" --启动Oracle服务 net start "szmap_sde" --启动arcSDE服务 net start "ArcIMS Application Server 9.1" --启动arcIMS服务 net start "ArcIMS Monitor 9.1" --启动arcIMS服务 net start "ArcIMS Monitor 9.1" --启动arcIMS服务 注意,启动服务的顺序不能乱。
net命令的详细说明看MS的DOS命令帮助。这里只作简单说明。 net start "serviceKeyName",这里的serviceKeyName是服务的关键字,而不是控制面板中显示的名字,控制面板中显示的名字是DispalyName.要通过服务的DisplayName获得KeyName可以通过以下命令实现: sc getkeyname "serviceDisplayName" 例如要查询arcSDE服务“ArcSde Service(esri_sde)”的KeyName,可以运行以下命令: C:\Documents and Settings\menglikun>sc getkeyname "ArcSde Service(esri_sde)" [SC] GetServiceKeyName SUCCESS Name = esri_sde 这里可以看出“ArcSde Service(esri_sde)”的KeyName=seri_sde,所以要启动这个SDE服务,只要执行命令: sc start "seri_sde" 即可。
再新建一个批处理文件“停止所有服务.bat”,打开,输入以下代码: net stop "ArcIMS Tasker 9.1" net stop "ArcIMS Monitor 9.1" net stop "ArcIMS Application Server 9.1" net stop "szmap_sde" net stop "OracleOraHome92TNSListener" 注意,停止服务的顺序刚好以启动相反。 这样,大功告成。以后要启动服务,执行“启动所有服务.bat”,停止服务执行“停止所有服务.bat”即可。
由于文章比较长而且带很多图片,不好在这里贴出,需要者请发邮件到kookmen@163.com索取。
如果一个网页中有Flash动画,那么javaScript的OnmouseMove事件就无法响应,这时候只要把Flash的背景设置为透明就可以了。 即加入:<param name="wmode" value="transparent">
一、新建一个Filter,代码如下: package com.suzhou.util;
import java.io.IOException; import javax.servlet.*;
public class SetCharacterEncodingFilter implements Filter { protected String encoding = null;// ///要制定的编码,在web.xml中配置
protected FilterConfig filterConfig = null;
public void destroy() { this.encoding = null; this.filterConfig = null; }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request.getCharacterEncoding() == null) { String encoding = getEncoding();// //得到指定的编码名字 if (encoding != null) request.setCharacterEncoding(encoding);// //设置request的编码 } chain.doFilter(request, response);// /有机会执行下一个filter }
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding");// /得到在web.xml中配置的编码 }
protected String getEncoding() {
return (this.encoding);// /得到指定的编码
}
} 二、修改web.xml,添加: <filter> <filter-name>SetCharacterEncoding</filter-name> <filter-class>com.suzhou.util.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>SetCharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 三、进入http://localhost:port/admin,选择Tomcat server/Service/Connector(port),把URI Encoding改成UTF-8,Use Body Encoding For URI Query Parameters:设置为true,点保存然后重新启动Tomcat即可。 记住,每个jsp页面的编码都为: <%@ page contentType="text/html; charset=GBK" language="java" import="java.sql.*" errorPage="" %>
这样子不但能彻底解决中文参数问题(如http://menglikn:4000/suzhou/getMap.do?ditu=市区图),而且还能解决中文URL问题(如http://menglikun:4000/suzhou/空白页.html)
开发环境: window xp jdk 1.5 tomcat 5.028 eclispe 3.2 myeclipse 4.0 步骤: (1)新建一个web project,名称为suzhouadmin (2)在项目上点鼠标右键,选择myeclipse->add spring capablities... (3)把Spring 1.2 AOP,Spring 1.2 Core Lib,Spring ORM/DAO/Hibernate 3.0 lib,Spring 1.2 web lib选择中,Copy Checked lib content to project folder,然后点Next (4)folder改为:WebRoot/WEB-INF,File为applicationContext.xml不变。点Finish。 Spring的引用完成。
(5)在项目上点鼠标右键,选择myeclipse->add Struts capablities... (6)选择struts1.1,base package for classes 改成 com.suzhou.admin.struts,然后点finish。
Struts的引用完成。 (6)新建立一个包com.suzhou.admin.hibernate,然后在项目上点鼠标右键,选择myeclipse->add Hibernate capablities... (7)把Hibernate 3.0 core lib,Hibernate 3.0 advanced lib中,Copy Checked lib content to project folder,点Next (8)选择Spring Configuration file(applicationContext.xml),点Next (9)选择Exit spring configuration file.输入sessionFactory id为sessionFactory。点Next (10)设置数据源ID为dataSource,选择一个已经设置好的DB profile,然后点Next (11)点Package...选择com.suzhou.admin.hibernate,自动生成类名com.suzhou.admin.hibernate.HibernateSessionFactory。
开始配置Struts和Spring. (12)打开WEB-INFO/web.xml,在最后面添加: <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 这样,Spring 的ApplicationContext就配置好了。通过以上配置,Web容器会自动加载/WEB-INF/applicationContext.xml初始化 ApplicationContext实例,如果需要指定配置文件位置,可通过context-param加以指定: <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param> 配置完成之后,即可通过 WebApplicationContextUtils.getWebApplicationContext() 方法在Web应用中获取ApplicationContext引用。
(13)通过Struts config新建一个Action名为LoginAction,自动生成的action定义如下: <action attribute="loginForm" input="/index.jsp" name="loginForm" path="/login" scope="request" type="com.suzhou.admin.struts.action.LoginAction"> <forward name="loginfail" path="/error.jsp" /> <forward name="loginok" path="/main.jsp" /> </action> 把其改成: <action attribute="loginForm" input="/index.jsp" name="loginForm" path="/login" scope="request" type="org.springframework.web.struts.DelegatingActionProxy"> <forward name="loginfail" path="/error.jsp" /> <forward name="loginok" path="/main.jsp" /> </action> 并在struts-config.xml中添加Spring插件。 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in> (13)用Myeclipse Spring donfig editor打开applicationContext.xml,点右键,选择new Bean,输入Bean name为/login,calss为com.suzhou.admin.struts.action.LoginAction。点finish,applicationContext.xml多加了一个Bean定义: <bean name="/login" class="com.suzhou.admin.struts.action.LoginAction" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"></bean>
(1)安装文件必须放在英文目录下,且文件夹名不能带空格,否则会出现找不到文件的错误。 (2)如果安装不成功,必须重新安装时,最好把所有已经安装的oracle服务删除。删除步骤是。 a.进入DOC b.进入C:\WINDOWS\system32 c.运行sc delete OracleServiceName (3)如果系统安装有放火墙,最好先把其关闭。安装完oracle后再重新开启。
开发环境: jdk 1.5 tomcat 5.0.28 oracle 9i
(1)在浏览器中输入http://localhost:8181/admin/,登陆tomcat管理系统 (2)选择Tomcat server->service->Host->Context(/yourproject)->Resource->Data Source (3)在下拉列表中选择Create new DataSource JNDI Name:jdbc/yourDatasourceName Data Source URL:jdbc:oracle:thin:@menglikunm:1521:ora JDBC Driver:oracle.jdbc.driver.OracleDriver UserName:username Password:password Max. Active Connections:2000(自己定) 2 (自己定) (4)把oracle 的class12.jar拷贝到tomcat的common/lib目录下(不要忘记这一步哦) (5)重新启动Tomcat (6)测试,代码如下: Connection con = null; try{ Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/ora_menglikunm"); con=ds.getConnection(); }catch(Exception ex){ ex.printStackTrace(); }
(7)加班作吧!!!!:)
在数据库开发中,打开数据库连接是很慢的。怎样oracle当前的连接数呢?只需要用下面的SQL语句查询一下就可以了。 select * from v$session where username is not null
查看不同用户的连接数 select username,count(username) from v$session where username is not null group by username
亦可依次选择菜单"window">>"preferences">>"general">>"content types"
在右边的窗口中打开列表,选中"JavaScript",在下面的"default encoding"右边的输入框中输入javaScript编码,要看您的网页用的编码,如果是“GBK”就选"GBK",是"GB2312"就选“GB2312”,UTF-8就是UTF-8,再点"update"按钮。
(1)运行cmd exp sde/sde@ora 导出sde下的所有数据 exp yourdata/yourdata@ora导出yourdata下所有的数据 (2)用post install在目标机器配置sde。 (3)在目标机器中建立用户yourdata和yourdata表空间 (4)把sde下面所有的表删除掉,并授予sde用户和yourdata用户dba权限。 (5)用PLSQL把导出的mdp文件导到sde和yourdata用户下。 (6)重新运行arcsde post installation,选择custom,去掉Define sde user Envirenment,然后不断点下一步配置。最后一步选择手动启动sde服务。然后在控制面搬中手动启动服务。
这几天开始学习dom4j,在网上找了篇文章就开干了,上手非常的快,但是发现了个问题就是无法以UTF-8保存xml文件,保存后再次读出的时候会报“Invalid byte 2 of 2-byte UTF-8 sequence.”这样一个错误,检查发现由dom4j生成的这个文件,在使用可正确处理XML编码的任何的编辑器中中文成乱码,从记事本查看并不会出现乱码会正确显示中文。让我很是头痛。试着使用GBK、gb2312编码来生成的xml文件却可以正常的被解析。因此怀疑的dom4j没有对utf-8编码进行处理。便开始查看dom4j的原代码。终于发现的问题所在,是自己程序的问题。 在dom4j的范例和网上流行的《DOM4J 使用简介》这篇教程中新建一个xml文档的代码都类似如下
public void createXML(String fileName) {
Document doc = org.dom4j.DocumentHelper.createDocument();
Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try {
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileWriter(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}
catch (Exception e) {
System.out.println(e);
}
}
在上面的代码中输出使用的是FileWriter对象进行文件的输出。这就是不能正确进行文件编码的原因所在,java中由Writer类继承下来的子类没有提供编码格式处理,所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。 好了现在我们找到了原因所在了,我们来找解决办法吧。首先我们看看dom4j是如何实现编码处理的
public XMLWriter(OutputStream out) throws UnsupportedEncodingException {
//System.out.println("In OutputStream");
this.format = DEFAULT_FORMAT;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
public XMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {
//System.out.println("In OutputStream,OutputFormat");
this.format = format;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
/**
* Get an OutputStreamWriter, use preferred encoding.
*/
protected Writer createWriter(OutputStream outStream, String encoding) throws UnsupportedEncodingException {
return new BufferedWriter(
new OutputStreamWriter( outStream, encoding )
);
}
由上面的代码我们可以看出dom4j对编码并没有进行什么很复杂的处理,完全通过java本身的功能来完成。所以我们在使用dom4j的来生成我们的XML文件时不应该直接为在构建XMLWriter时,不应该直接为其赋一个Writer对象,而应该通过一个OutputStream的子类对象来构建。也就是说在我们上面的代码中,不应该用FileWriter对象来构建xml文档,而应该使用FileOutputStream对象来构建所以将代码修改入下: public void createXML(String fileName) {
Document doc = org.dom4j.DocumentHelper.createDocument();
Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try { //注意这里的修改
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileOutputStream(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}
catch (Exception e) {
System.out.println(e);
}
} 至此DOM4J的问题编码问题算是告一段落,希望对此文章对其他朋友有用。
要在arcIMS中使用arcMap定义的mxd文件,安装arcIMS时必须安装arcMap server(默认情况下是不安装的),然后进入arcIMS administrator,新建一个service,service的类型必须选arcmap ImageServer就可以了。
ArcIMS Author是通过Java API来连接SDE数据库的,有时候会出现arcIMS author无法连接SDE数据库,但arcCatalog却可以的情况。 解决办法是进入arcSDE的安装目录 \lib下面把jpe91_sdk.jar,jsde91_sdk.jar两个文件拷贝出来,然后搜索arcIMS的安装目录,只要有这两个文件的地方都覆盖掉,然后依此重启一下arcIMS的三个服务就可以了。
60.AVG(DISTINCT|ALL)
all表示对所有的值求平均值,distinct只对不同的值求平均值
SQLWKS> create table table3(xm varchar(8),sal number(7,2));
语句已处理。
SQLWKS> insert into table3 values('gao',1111.11);
SQLWKS> insert into table3 values('gao',1111.11);
SQLWKS> insert into table3 values('zhu',5555.55);
SQLWKS> commit;
SQL> select avg(distinct sal) from gao.table3; AVG(DISTINCTSAL)
----------------
3333.33 SQL> select avg(all sal) from gao.table3; AVG(ALLSAL)
-----------
2592.59 61.MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次
SQL> select max(distinct sal) from scott.emp; MAX(DISTINCTSAL)
----------------
5000 62.MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3; MIN(ALLSAL)
-----------
1111.11 63.STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SQL> select stddev(sal) from scott.emp; STDDEV(SAL)
-----------
1182.5032 SQL> select stddev(distinct sal) from scott.emp; STDDEV(DISTINCTSAL)
-------------------
1229.951 64.VARIANCE(DISTINCT|ALL) 求协方差 SQL> select variance(sal) from scott.emp; VARIANCE(SAL)
-------------
1398313.9 65.GROUP BY 主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno; DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
10 3 8750
20 5 10875
30 6 9400 66.HAVING 对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having nt(*)>=5; DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by tno ; DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400 67.ORDER BY 用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc; DEPTNO ENAME SAL
--------- ---------- ---------
10 KING 5000
10 CLARK 2450
10 MILLER 1300
20 SCOTT 3000
20 FORD 3000
20 JONES 2975
20 ADAMS 1100
20 SMITH 800
30 BLAKE 2850
30 ALLEN 1600
30 TURNER 1500
30 WARD 1250
30 MARTIN 1250
30 JAMES 950
43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;
conver
------
strutz 44.HEXTORAW 将一个十六进制构成的字符串转换为二进制 45.RAWTOHEXT 将一个二进制构成的字符串转换为十六进制 46.ROWIDTOCHAR 将ROWID数据类型转换为字符类型 47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41 48.TO_DATE(string,'format') 将字符串转化为ORACLE中的一个日期 49.TO_MULTI_BYTE 将字符串中的单字节字符转化为多字节字符
SQL> select to_multi_byte('高') from dual; TO
--
高 50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number('1999') year from dual; YEAR
---------
1999 51.BFILENAME(dir,file)指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif')); 52.CONVERT('x','desc','source') 将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
2 0,'none',
3 2,'insert',
4 3,
5 'select',
6 6,'update',
7 7,'delete',
8 8,'drop',
9 'other') cmd from v$session where type!='background'; SID SERIAL# USERNAME CMD
--------- --------- ------------------------------ ------
1 1 none
2 1 none
3 1 none
4 1 none
5 1 none
6 1 none
7 1275 none
8 1275 none
9 20 GAO select
10 40 GAO none 53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name; GLOBAL_NAME DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D 54.EMPTY_BLOB()和EMPTY_CLOB()
这两个函数都是用来对大数据类型字段进行初始化操作的函数 55.GREATEST
返回一组表达式中的最大值,即比较字符的编码大小.
SQL> select greatest('AA','AB','AC') from dual; GR
--
AC
SQL> select greatest('啊','安','天') from dual; GR
--
天 56.LEAST
返回一组表达式中的最小值
SQL> select least('啊','安','天') from dual; LE
--
啊 57.UID
返回标识当前用户的唯一整数
SQL> show user
USER 为"GAO"
SQL> select username,user_id from dba_users where user_id=uid; USERNAME USER_ID
------------------------------ ---------
GAO 25 58.USER
返回当前用户的名字
SQL> select user from dual; USER
------------------------------
GAO 59.USEREVN
返回当前用户环境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA 查看当前用户是否是DBA如果是则返回true
SQL> select userenv('isdba') from dual; USEREN
------
FALSE
SQL> select userenv('isdba') from dual; USEREN
------
TRUE
SESSION
返回会话标志
SQL> select userenv('sessionid') from dual; USERENV('SESSIONID')
--------------------
152
ENTRYID
返回会话人口标志
SQL> select userenv('entryid') from dual; USERENV('ENTRYID')
------------------
0
INSTANCE
返回当前INSTANCE的标志
SQL> select userenv('instance') from dual; USERENV('INSTANCE')
-------------------
1
LANGUAGE
返回当前环境变量
SQL> select userenv('language') from dual; USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回当前环境的语言的缩写
SQL> select userenv('lang') from dual; USERENV('LANG')
----------------------------------------------------
ZHS
TERMINAL
返回用户的终端或机器的标志
SQL> select userenv('terminal') from dual; USERENV('TERMINA
----------------
GAO
VSIZE(X)
返回X的大小(字节)数
SQL> select vsize(user),user from dual; VSIZE(USER) USER
----------- ------------------------------
6 SYSTEM
26.MOD(n1,n2) 返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;
MOD(10,3) MOD(3,3) MOD(2,3)
--------- --------- ---------
1 0 2 27.POWER 返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual; POWER(2,10) POWER(3,3)
----------- ----------
1024 27 28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual; ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56 -55 55 -55 29.SIGN 取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual; SIGN(123) SIGN(-100) SIGN(0)
--------- ---------- ---------
1 -1 0 30.SIN 返回一个数字的正弦值
SQL> select sin(1.57079) from dual; SIN(1.57079)
------------
1 31.SIGH 返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual; SIN(20) SINH(20)
--------- ---------
.91294525 242582598 32.SQRT 返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual; SQRT(64) SQRT(10)
--------- ---------
8 3.1622777 33.TAN 返回数字的正切值
SQL> select tan(20),tan(10) from dual; TAN(20) TAN(10)
--------- ---------
2.2371609 .64836083 34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual; TANH(20) TAN(20)
--------- ---------
1 2.2371609 35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual; TRUNC1 TRUNC(124.16666,2)
--------- ------------------
100 124.16 36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual; TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual; TO_CHA
------
199910 37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual; TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual; LAST_DAY(S
----------
31-5月 -04 38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual; MON_BETWEEN
-----------
9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.dd')) mon_betw from dual; MON_BETW
---------
-60 39.NEW_TIME(date,'this','that')
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual; BJ_TIME LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32 40.NEXT_DAY(date,'day')
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual; NEXT_DAY
----------
25-5月 -01 41.SYSDATE 用来得到系统的当前日期
SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual; TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒
SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual; HH HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00 42.CHARTOROWID 将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp; ROWID ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES
【导读】本文罗列了各种内置函数的使用方法,同时还对其返回结果进行了演示。 |
|
|
SQL中的单记录函数
1.ASCII 返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
A A ZERO SPACE
--------- --------- --------- ---------
65 97 48 32
2.CHR 给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;
ZH C
-- -
赵 A
3.CONCAT 连接两个字符串;
SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual;
高乾竞电话
----------------
010-88888888转23
4.INITCAP 返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap('smith') upp from dual;
UPP
-----
Smith
5.INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
SQL> select instr('oracle traning','ra',1,2) instring from dual;
INSTRING
---------
9
6.LENGTH 返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from .nchar_tst;
NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞 3 北京市海锭区 6 9999.99 7
7.LOWER 返回字符串,并将所有的字符小写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;
AABBCCDD
--------
aabbccdd
8.UPPER 返回字符串,并将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;
UPPER
--------
AABBCCDD
9.RPAD和LPAD(粘贴字符)
RPAD 在列的右边粘贴字符
LPAD 在列的左边粘贴字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;
LPAD(RPAD('GAO',1
-----------------
*******gao*******
不够字符则用*来填满
10.LTRIM和RTRIM
LTRIM 删除左边出现的字符串
RTRIM 删除右边出现的字符串
SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual;
LTRIM(RTRIM('
-------------
gao qian jing
11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr('13088888888',3,8) from dual;
SUBSTR('
--------
08888888
12.REPLACE('string','s1','s2')
string 希望被替换的字符或变量
s1 被替换的字符串
s2 要替换的字符串
SQL> select replace('he love you','he','i') from dual;
REPLACE('HELOVEYOU','HE','I')
------------------------------
i love you
13.SOUNDEX 返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');
SQL> select xm from table1 where soundex(xm)=soundex('weather');
XM
--------
weather
wether
14.TRIM('s' from 'string')
LEADING 剪掉前面的字符
TRAILING 剪掉后面的字符
如果不指定,默认为空格符
15.ABS 返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;
ABS(100) ABS(-100)
--------- ---------
100 100
16.ACOS 给出反余弦的值
SQL> select acos(-1) from dual;
ACOS(-1)
---------
3.1415927
17.ASIN 给出反正弦的值
SQL> select asin(0.5) from dual;
ASIN(0.5)
---------
.52359878
18.ATAN 返回一个数字的反正切值
SQL> select atan(1) from dual;
ATAN(1)
---------
.78539816
19.CEIL 返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;
CEIL(3.1415927)
---------------
4
20.COS 返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;
COS(-3.1415927)
---------------
-1
21.COSH 返回一个数字反余弦值
SQL> select cosh(20) from dual;
COSH(20)
---------
242582598
22.EXP 返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;
EXP(2) EXP(1)
--------- ---------
7.3890561 2.7182818
23.FLOOR 对给定的数字取整数
SQL> select floor(2345.67) from dual;
FLOOR(2345.67)
--------------
2345
24.LN 返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;
LN(1) LN(2) LN(2.7182818)
--------- --------- -------------
0 .69314718 .99999999
25.LOG(n1,n2) 返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;
LOG(2,1) LOG(2,4)
--------- ---------
0 2
|
在很多程序做多需要有发送电子邮件的功能,以前使用java mail实现这个功能很麻烦。现在apache的下的一个子项目common-email,把这个问题大大的简化了。现在在java程序中实现发信功能,只需要短短几行代码。
可以http://jakarta.apache.org/commons/email/在这个地址下载开发包和查看详细的介绍。 下面介绍简单的使用。 public static class Mail { public static void send( String to,/* 收信人地址 */ String toName,//收信人姓名 String subject, /* 主题 */ String body /* 内容 */ ){
|
try { HtmlEmail email = new HtmlEmail(); email.setHostName("smtp.163.com");//设置发信的smtp服务器 email.addTo(to, toName);//设置收件人帐号和收件人 email.setFrom("aaa@163.com", "aaa");//设置发信的邮件帐号和发信人 email.setSubject(subject);//设置邮件主题 email.setAuthentication("aaa","111111");//如果smtp服务器需要认证的话,在这里设置帐号、密码 email.setHtmlMsg(body,"text/html; charset=GB2312");//设置邮件正文和字符编码 email.send(); } catch (EmailException e) { e.printStackTrace(); } } 网站的介绍中没有提及如何发送中文邮件,如果发送中文邮件像上面在setHtmlMsg(),加上字符编码即可。 |
这是进行上传
import java.sql.*; import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import com.jspsmart.upload.*; public class UpLoad extends HttpServlet { private ServletConfig config; /** * Init the servlet */ final public void init(ServletConfig config) throws ServletException { this.config = config; } final public ServletConfig getServletConfig() { return config; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("============UpLoad begin ddd============="); String id = null; SmartUpload mySmartUpload = new SmartUpload(); PrintWriter out = response.getWriter(); java.io.File file=null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: " + e.getMessage()); } try { //Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.216.0.2:1521:ORCL", "test", "test"); conn.setAutoCommit(false); //设置手动提交,以提高性能。 Statement stmt = conn.createStatement(); // Initialization mySmartUpload.initialize(config, request, response); mySmartUpload.setMaxFileSize(500 * 1024); // Upload mySmartUpload.upload(); //取得text框中的数据 id = mySmartUpload.getRequest().getParameter("id"); //取得文件和文件名 com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0); String fileName = myFile.getFileName(); if (!myFile.isMissing()) { //save data myFile.saveAs(fileName, mySmartUpload.SAVE_PHYSICAL); System.out.println("============fileName=" + fileName + "===="); file = new java.io.File(fileName); java.io.InputStream inStream = new java.io.FileInputStream(file); int fileSize = myFile.getSize(); byte[] bytes = new byte[fileSize]; System.out.println("============fileSize=" + fileSize + "===="); //将数据插入到表中 String strSql = "insert into test(id,name,content) values(’" + id + "’,’" + fileName + "’,empty_blob())"; stmt.execute(strSql); ResultSet rs = stmt.executeQuery("select content from zyw_test where id=’" + id + "’ for update "); if (rs.next()) { oracle.sql.BLOB blob = ( (oracle.jdbc.OracleResultSet) rs).getBLOB("content"); OutputStream outStream = blob.getBinaryOutputStream(); inStream.read(bytes); outStream.write(bytes); outStream.flush(); stmt.execute("commit"); outStream.close(); } inStream.close(); stmt.close(); if(file!=null)//删除文件 file.delete(); out.println("upload sucess"); } else { out.println("no file"); } } catch (Exception ex) { if(file!=null) file.delete(); out.println("upload fail"); ex.printStackTrace(); } System.out.println("============UpLoad end============="); } } 这是下载,进行显示图片 import java.sql.*; import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*;
public class DownLoad extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("======DownLoad begin====="); try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.216.0.2:1521:ORCL","test","test"); Statement stmt=conn.createStatement(); String id=request.getParameter("id"); String sql="SELECT id, name, content FROM test where id=’"+id+"’"; ResultSet rs=stmt.executeQuery(sql); if(rs.next()){ Blob blob = rs.getBlob("content"); byte[] ab = blob.getBytes(1, (int)blob.length()); response.setContentType("image/jpeg"); ServletOutputStream op = response.getOutputStream(); op.write(ab); op.flush(); op.close(); } }catch(Exception ex){ ex.printStackTrace(); } System.out.println("======DownLoad end====="); } }
我们在写OA的时候经常遇到的问题就是员工图片档案的储存问题,解决这个问题有两个方法, 1.JSP/html页面里面读取web服务器上的图片,也就是把图片放到(上传)到web 服务器上,然后用html 语句读取: <img src=" 绝对或相对路径 " border="0" /> 2.就是上传到数据库里面(oracle).关于oracle 数据库,它支持blob, 和clob, 分别对应着图片和文本(长字符串)操作 由于性能原因,我们还是要采用第二种方法,而且存到数据库里面比较容易管理,是吧? 首先,我们要解决上传问题,这里采用普遍使用的apache commons 组件里面的FileUpload class. 具体步骤如: DiskFileUpload dfu=new DiskFileUpload(); dfu.setSizeMax(100000000); dfu.setSizeThreshold(100000); dfu.setRepositoryPath("f:\\public"); try{ List fileItems=dfu.parseRequest(request); Iterator i=fileItems.iterator(); while(i.hasNext()){ FileItem fi=(FileItem)i.next(); if(!fi.isFormField()){ name=fi.getName(); size=fi.getSize(); if((name==null||name.equals(""))&&size==0) continue; } name=fi.getName(); size=fi.getSize(); (InputStream)is=fi.getInputStream(); } 上面的代码是web服务器接受上传的代码,参考文件已经在我上篇写的上传文本文件里给出,今天,终于想明白了: dfu.setRepositoryPath("f:\\public"); 的意思 原来是转义字符也就是说\n\t等而要打印反斜杠要用\\,其实这个问题原先已经知道,可是由于经验没有写过图片上传处理什么的,觉得很高深,也很可怕,哈哈,心里有点畏惧.看来基础的东西,那怕一点点小细节也很重要,接着还有下面的java IO 问题.刚才读core java 的时候突然发现在讲io的时候特意提醒了这个问题,可是我没有注意! 通过上面的代码已经实现文件上传了.然后,我们要实现JDBC数据源链接,目的是要把数据插入到oracle. Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("jdbc/asdbCoreDS"); conn=ds.getConnection(); conn.setAutoCommit(false); 关于要import java.sql.* javax.sql.* java.naming.* 不再详细叙述了 接着根据很有用的一篇文章的提示,插入blob类型一定要先1.插入一个空的 String insert=" insert into uploadpicture "+ " values(?, empty_blob()) " ; 2.然后找到这个blob的oracle 里面的游标: String findCursor=" select content "+ " from uploadpicture "+ " where name=? for update "; 注意这个for update(注意!!!必须加for update,这将锁定该行,直至该行被修改完毕,保证不产生并发冲突。这里还是难以理解,先记下来吧) 3.然后再修改 String update=" update uploadpicture "+ " set content=? "+ " where name=? "; 这里的问号是为PreparedStatement参数处理而写的! 写这个程序用到了oracle.sql.BLOB class ,这个类是用来操作BLOB数据类型的 当我们通过ResultSet 对象得到 blob=(BLOB)rs.getBlob(1); 的时候我不知道如何处理了,Blob 是什么?String, int ,long? 我现在也不明白!估计CSDN上的人也不明白,否则我发个帖子半天没有人回答,也许是很烂,也许是太简单了,大家不屑一顾,看来我还要继续追赶! 不发牢骚了,回到程序里(总觉得自己的发散思维很强,看来写程序的时候不能这样,多亏java 是纯面向对象语言,如果是过程就麻烦了) 我们如何处理这个blob 呢?回答是,不管它是什么,直接写入 BufferedOutputStream out1 =new BufferedOutputStream(blob.getBinaryOutputStream()); 这里是建立了缓冲写如blob 的流(注意getBinaryOutputStream()已经不被赞成使用了,一定有更优秀的方法替代!),说到流,我到现在还有点晕,类很多,不知道究竟用哪个好! 基础的东西非常重要,这曾经是我的口头禅,这里用到了流的读入写和写入,有些流是从文件或其它位置上读取字节(如, FileInputStream),有写流是把字节组合成有用的数据(如, DataInputStream).我们读取数字的时候,需要首先建议一个FileInpuStream, 然后, 再把该类的对象传递给DataInputStream FileInputStream fin=new FileInputStream(“emp.dat”); DataInputStream din=new DataInputStream(fin);//把fin传递给din double s=din.readDouble(); 默认情况下,流是没有缓冲的, 如果使用缓冲就是 DataInputStream din=new DataInputStream( new BufferedInputStream(new FileINputStream(“emp.dat”))); 有了这点理解也很管用, BufferedOutputStream out1 =new BufferedOutputStream(blob.getBinaryOutputStream()); 就是建立一个缓冲写的对象到blob.注意这里的out1 不是out,否则程序运行的时候不能打印了temp 数据了! 已经准备好如何写了, 可是如何读呢? BufferedInputStream in=new BufferedInputStream(is); 在我们上传的时候 (InputStream)is=fi.getInputStream(); 读取图片为输入的流.保存为is 对象,然后就用到这里了,准备好了读和写了,我们开始干活: int c; while((c=in.read())!=-1) {out1.write(c);} in.close(); out1.close(); 通过缓冲一个个读数据,然后一个个写数据.-1 为文件的末尾, 最后当读写完成后我们要关闭读写对象! 程序分析就是这样,以后还要对此问题进行研究,最后还要注意, <%@ page contentType="image/jpeg;charset=GBK"%> 不是 <%@ page contentType="text/html;charset=GBK"%> 否则是以文字显示图片---乱码. 这里研究了上传图片到oralce 里面的程序,关于显示还要麻烦一点,借助资料我实现了,明天再研究一下.
//插入上传图片到数据库 <%@ page contentType="text/html;charset=GBK"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <%@ page import="org.apache.commons.*"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="java.sql.*"%> <%@ page import="javax.sql.*"%> <%@ page import="javax.naming.*"%> <%@ page import="oracle.sql.*"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>getPicture.jsp</title> </head> <body> <% request.setCharacterEncoding("GBK"); String name=null; long size=0; Connection conn=null; String insert=" insert into uploadpicture "+ " values(?, empty_blob()) " ; String findCursor=" select content "+ " from uploadpicture "+ " where name=? for update "; String update=" update uploadpicture "+ " set content=? "+ " where name=? "; BLOB blob=null; InputStream is=null; DiskFileUpload dfu=new DiskFileUpload(); dfu.setSizeMax(100000000); dfu.setSizeThreshold(100000); dfu.setRepositoryPath("f:\\public"); try{ List fileItems=dfu.parseRequest(request); Iterator i=fileItems.iterator(); while(i.hasNext()){ FileItem fi=(FileItem)i.next(); if(!fi.isFormField()){ name=fi.getName(); size=fi.getSize(); if((name==null||name.equals(""))&&size==0) continue; } name=fi.getName(); size=fi.getSize(); is=fi.getInputStream(); } Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("jdbc/asdbCoreDS"); conn=ds.getConnection(); conn.setAutoCommit(false); //step 1 PreparedStatement ps=conn.prepareStatement(insert); ps.setString(1, name); int a=ps.executeUpdate(); if(a>0) out.println("insert success!"+"<br>"); //step 2 ps=conn.prepareStatement(findCursor); ps.setString(1, name); ResultSet rs=ps.executeQuery(); while(rs.next()) { blob=(BLOB)rs.getBlob(1); out.println("find cursor success!"+"<br>"); out.println("cursor :"+blob+"<br>"); //step 3 ps=conn.prepareStatement(update); ps.setBlob(1, blob); ps.setString(2, name); ps.executeUpdate(); ps.close(); BufferedOutputStream out1 =new BufferedOutputStream(blob.getBinaryOutputStream()); BufferedInputStream in=new BufferedInputStream(is); int c; while((c=in.read())!=-1) {out1.write(c);} in.close(); out1.close(); out.println("update success!"+"<br>");} conn.commit(); } catch(SQLException se) {se.printStackTrace();} catch(FileUploadException fue) {fue.printStackTrace();} %> </body> </html>
//显示数据库里面的图片
<%@ page contentType="image/jpeg;charset=GBK"%> <%@ page import="java.sql.*"%> <%@ page import="javax.sql.*"%> <%@ page import="javax.naming.*"%> <%@ page import="java.io.*"%> <%@ page import="com.sun.image.codec.jpeg.*"%> <%@ page import="javax.imageio.*"%> <%@ page import="java.util.*"%> <%@ page import="java.awt.image.*"%> <html> <head> <meta http-equiv="Content-Type" content="image/jpeg; charset=GBK"> <title>showDBImage.jsp</title> </head> <body> <% String showImage=" select * "+ " from uploadpicture "+ " where name=´TXC with snow.JPG´ " ; Connection conn=null; BufferedInputStream inputImage=null; try{ Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup("jdbc/asdbCoreDS"); conn=ds.getConnection(); Statement st=conn.createStatement(); ResultSet rs=st.executeQuery(showImage); while(rs.next()) { oracle.sql.BLOB blob=(oracle.sql.BLOB)rs.getBlob("content"); inputImage =new BufferedInputStream(blob.getBinaryStream()); /*String name=rs.getString(1); String content=rs.getString(2); out.println(name+"<br>");*/} BufferedImage image=null; image=ImageIO.read(inputImage); ServletOutputStream sos=response.getOutputStream(); JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(sos); encoder.encode(image); inputImage.close(); conn.commit(); } catch(SQLException se) {se.printStackTrace(); conn.rollback(); } catch(IOException ie) {ie.printStackTrace();} %> </body>
</html>
新建立一个名为vb6.exe.manifest的文件,用文本编辑器打开,输入以下内容: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Microsoft.VB6.VBnetStyles" type="win32" /> <description>VBnet Manifest for VB6 IDE</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly> 然后把该文件放到与vb6.exe相同的目录,启动vb6.exe就可以了。
内容摘要 |
在基于ArcIMS的Web GIS的应用开发中,无论是通过HTML Viewer,还是ActiveX Connector 或者 Java Connector,我们经常需要提供圆形选择的工具,在地图上任意选择圆心和半径,进而查找位于该圆形区域内的某个图层内的要素。在这种情况下,由于这个圆的圆心并不是来自某个点状图层的要素,而这个圆也不是由图层中的点要素通过缓冲区生成,所以ArcIMS所提供的Buffer缓冲区功能无法直接调用,在这种情况下,我们可以采取其他的变通方式。 |
过程描述 |
在本文中,我们通过圆的内接多边形法来实现。原理就是根据提供的圆心位置和半径,生成一个接近圆形的内接48边形,然后利用这个多边形对象再结合Filter进行空间查询。当然,内接多边形的边数越多就越接近圆,查询结果就越精确。示例代码如下:
//Java public Polygon createCirlePolygon(Point pnt,double dRadius){ double sineTheta, cosineTheta, twoPi; int numPoints = 48; //内接多边形的边数 Polygon poly=new Polygon(); Points pnts=new Points(); twoPi = 3.1415 * 2.0; //构造多边形 for(int i=0;i<numPoints;i++){ Point cpt = new Point(); sineTheta = Math.sin(twoPi * (i*1.0/ numPoints)); cosineTheta = Math.cos(twoPi * (i*1.0 / numPoints)); cpt.setX(pnt.getX() + dRadius * cosineTheta); cpt.setY(pnt.getY() + dRadius * sineTheta); pnts.addPointObject(cpt); } pnts.addPointObject(pnts.getPointObject(0)); Ring ring=new Ring(); ring.setPoints(pnts); poly.addRing(ring); return poly; }
//ASP.NET public IMSPolygon createCirlePolygon(IMSPoint pnt,double dRadius) { IMSPolygon poly=new IMSPolygon(); double sineTheta, cosineTheta, twoPi; int numPoints = 48; //内接多边形的边数
IMSPoints pnts=new IMSPoints(); twoPi = 3.1415 * 2.0;
//构造多边形 for(int i=0;i<numPoints;i++) { IMSPoint cpt = new IMSPoint(); sineTheta = Math.Sin(twoPi * (i*1.0/ numPoints)); cosineTheta = Math.Cos(twoPi * (i*1.0 / numPoints)); cpt.X=(pnt.X + dRadius * cosineTheta); cpt.Y=(pnt.Y + dRadius * sineTheta); pnts.Add(cpt); } pnts.Add(pnts[0]); IMSParts parts=new IMSParts(); parts.Add(pnts); poly.Parts=parts; return poly; } |
在oracle中用prepareStatement时,如果SQL语句写成: select distinct(mpfullname) from suzhou.menpaipoint where mpfullname like '%?%' 运行时就会出现ORA-01006错误,解决办法是把SQL语句改成: select distinct(mpfullname) from suzhou.menpaipoint where mpfullname like ? 而用 stmt.setObject(1, "%关键字%"); 来付值就可以了。
(1)安装Subversion; (2)安装TortoiseSVN; (3)新建一个储存库目录,例如d:\svn\suzhou; (4)进入d:\svn\suzhou,点击鼠标右键盘TortoiseSVN->create reposity here...会生成一大堆目录和文件; (5)进入d:\svn\suzhou\config,打开svnserve.conf文件,吧#password-db = passwd前面的"#"去掉; (6)进入d:\svn\suzhou\config,打开passwd文件,添加新用户如: ameng=ameng test=test (7)进入DOS,运行命令:D:\Subversion\bin>svnserve -d -r d:\svn\suzhou,启动服务;也可以把这个命令写成一个runservice.bat,每次运行一下这个文件就可以了。 (8)在Eclipse中选中一个项目文件夹,如d:\eclipse3.1\workspace\suzhou,选择TortoiseSVN->Import把这个项目导到svn中。此刻要求输入用户名和密码,输入ameng密码ameng就可以了。
(9)在另一台机器上安装TortoiseSVN,作为客户端,安装完后,新建立一个空的文件夹,如d:\eclispe3.1\workspace\suzhou,进入该文件夹,点鼠标右键,选择SVN Checkout...,URL of Repository为:svn://servername/svn/suzhou,点OK就可以下载数据了。
其他内容请看subversion和TortoiseSVN的帮助文档
以前作web开发,从来不用关心界面设计,现在不一样了,当爹又当娘,玩起界面设计来了,谈谈心得吧。 作为面向用户的窗口,站点的主界面是最重要的,主界面的好坏,直接决定着界面设计的成功与否。而且主界面的风格决定着别的次要界面的风格,只有主界面定下来以后,才有可能开发出别的次要界面。 web界面设计要用到两个关键的软件,即Dreamwaever和大名鼎鼎的PS。 建议看两本书:《Dreamweaver MX 2004完全自学手册》中国青年出版社 强力推荐 《PS CS中文版基础与应用》海洋出版社 简单,实用,便宜:) 当然PS的书还有很多 步骤 (1)用PS 设计总的界面框架; (2)用PS的切片工具把图片切割,然后选择文件->储存为web所用格式。PS帮我们生成一个*.html文件和一个images文件夹; (3)用Deamweaver打开PS生成的html文件,看到了没有,PS已经帮我们排版了!适当修改一下,就OK了。 (4)把html文件和images文件夹拷贝到网站下面就可以了。
There are 5 predefined entity references in XML:
< |
< |
less than |
> |
> |
greater than |
& |
& |
ampersand |
' |
' |
apostrophe |
" |
" |
quotation mark |
Note: Only the characters "<" and "&" are strictly illegal in XML. Apostrophes, quotation marks and greater than signs are legal, but it is a good habit to replace them.
Dreamweaver里有一个设置:把不安全的带码安全的过滤掉,所以,从2004开始就会有每个页面的第一个代码 "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">" 就是起过滤作用的,你把那句代码删掉就可以运行啦!
在tomcat 5.5.9 ,已经没有Catalina.bat了,所以不用在里面写-Xms128m -Xmx512之类的了。只要运行tomcat5w.exe,在java选项里面设置inital menory pool和maximum memory pool就可以了。
一. 引言 性能测试与分析是软件开发过程中介于架构和调整的一个广泛并比较不容易理解的领域,更是一项较为复杂的活动。就像下棋游戏一样,有效的性能测试和分析只能在一个良好的计划策略和具备了对不可预料事件的处理能力的条件下顺利地完成。一个下棋高手赢得比赛靠的不仅仅是对游戏规则的认识,更是靠他的自己的能力和不断地专注于分析自己对手的实力来更加有效地利用和发挥规则的作用。同样一个优秀的性能测试和分析人员将要面对的是来自一个全新的应用程序和环境下带来的整个项目的挑战。本文中作者结合自己的使用经验和参考文档,对Tomcat性能方面的调整做一简要的介绍,并给出Tomcat性能的测试、分析和调整优化的一些方法。
二. 测量Web服务器的性能 测量web服务器的性能是一项让人感到畏缩的任务,但是我们在这里将给出一些需要注意的地方并且指点你了解其中更多的细节性的内容。它不像一些简单的任务,如测量CPU的速率或者是测量程序占用CPU的比例,web服务器的性能优化中包括许调整许多变量来达到目标。许多的测量策略中都包含了一个看似简单的浏览实际上是在向服务器发送大量的请求,我们称之为客户端的程序,来测量响应时间。客户端和服务器端是在同一台机器上吗?服务器在测试的时候还运行着其它的什么程序吗?客户端和服务器端的通讯是通过局域网,100baseT,10baseT还是使用调制解调器?客户端是否一直重复请求相同的页面,还是随机地访问不同的页面?(这些影响到了服务缓存的性能)客户端发送请求的有规律的还是突发的?你是在最终的配置环境下运行服务的还是在调试的配置环境下运行服务的?客户端请求中包含图片还是只有HTML页面?是否有请求是通过servlets和JSP的,CGI程序,服务端包含(Server-Side Includes ,SSI是一个可以让你使用动态HTML文件的技术)?所有这些都将是我们要关心的,并且几乎我们不可能精确地把所有的问题都清楚地列出来。
1.压力测试工具
“工欲善其事,必先利其器”,压力测试只有借助于一些工具才可得以实施。
大多数web压力测试工具的实现原理都是通过重复的大量的页面请求来模拟多用户对被测系统的并发访问,以此达到产生压力的目的。产生压力的手段都是通过录制或者是编写压力脚本,这些脚本以多个进程或者线程的形式在客户端运行,这样通过人为制造各种类型的压力,我们可以观察被测系统在各种压力状况下的表现,从而定位系统瓶颈,作为系统调优的基础。目前已经存在的性能测试工具林林总总,数量不下一百种,从单一的开放源码的免费小工具如 Aapache 自带的 web 性能测试工具 Apache Benchmark、开源的Jmeter 到大而全的商业性能测试软件如 Mercury 的 LoadRunner 等等。任何性能测试工具都有其优缺点,我们可以根据实际情况挑选用最合适的工具。您可以在这里找到一些web压力测试工具http://www.softwareqatest.com/qatweb1.html#LOAD
这里我们所使用的工具要支持web应用服务认证才可以,要支持接收发送cookies,不仅如此Tomcat支持多种认证方式,比如基本认证、基于表单的认证、相互认证和客户端认证,而一些工具仅仅支持HTTP基本认证。真实地模拟用户认证是性能测试工具的一个重要的部分,因为认证机制将对一个web站点的性能特征产生重要的影响。基于你在产品中使用的不同的认证方式,你需要从上面的工具列表中选择使用这种特性的测试工具。
Apache Benchmark和http_load是命令行形式的工具,非常易于使用。Apache Benchmark可以模仿单独的URL请求并且重复地执行,可以使用不同的命令行参数来控制执行迭代的次数,并发用户数等等。它的一个特点是可以周期性地打印出处理过程的信息,而其它工具只能给出一个全局的报告。
2.压力测试工具介绍
三. 外部环境的调整 在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,我们这里只讲Tomcat的调整。由于Tomcat的运行依赖于JVM,所以在这里我们把Tomcat的调整可以分为两类来详细描述:
外部环境调整
调整非Tomcat组件,例如Tomcat运行的操作系统和运行Tomcat的java虚拟机。
自身调整
修改Tomcat自身的参数,调整Tomcat配置文件中的参数。
下面我们将详细讲解外部环境调整的有关内容,Tomcat自身调整的内容将在第2部分中阐述。1.JAVA虚拟机性能优化
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。
可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。 参数 描述 -Xms<size> JVM初始化堆的大小 -Xmx<size> JVM堆的最大值
这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
需要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,可以使用的最大内存为512MB。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
2.操作系统性能优化
这里说的操作系统是指运行web服务器的系统软件,当然,不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的,因此在它的内核中有许多的限制来防止不同形式的服务攻击(OpenBSD的一句座右铭是“默认是最安全的”)。这些限制或许更多地用来运行活跃的web服务器。
而我们常用的Linux操作系统的目标是易用使用,因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核,表明所有的驱动器都静态地与之相连。这样就使系统易于使用,但是如果你要创建一个自定义的内核来加强其中某些限制,那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之,内存现在变得越来越便宜,所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存,并且在服务器上腾出更多的可用内存。
小提示:虽然现在内存已经相当的便宜,但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点,但是从可靠性上来说,性价比会更高一些。
如果是在Windows操作系统上使用Tomcat,那么最好选择服务器版本。因为在非服务器版本上,最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的。并且基于安全性的考虑,必须经常给操作系统打上最新的补丁。
3.Tomcat与其它web服务器整合使用
虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来,将html与jsp的功能部分进行明确分工,让tomcat只处理jsp部分,其它的由apache,IIS等这些web服务器处理,由此大大节省了tomcat有限的工作“线程”。
4.负载均衡
在负载均衡的思路下,多台服务器为对称方式,每台服务器都具有同等的地位,可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术,将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上,而接收到请求的服务器都独立回应客户机的请求。
提供服务的一组服务器组成了一个应用服务器集群(cluster),并对外提供一个统一的地址。当一个服务请求被发至该集群时,根据一定规则选择一台服务器,并将服务转定向给该服务器承担,即将负载进行均衡分摊。
通过应用负载均衡技术,使应用服务超过了一台服务器只能为有限用户提供服务的限制,可以利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时,负载均衡服务器会自动进行检测并停止将服务请求分发至该服务器,而由其他工作正常的服务器继续提供服务,从而保证了服务的可靠性。
负载均衡实现的方式大概有四种:第一是通过DNS,但只能实现简单的轮流分配,不能处理故障,第二如果是基于MS IIS,Windows 2003 server本身就带了负载均衡服务,第三是硬件方式,通过交换机的功能或专门的负载均衡设备可以实现,第四种是软件方式,通过一台负载均衡服务器进行,上面安装软件。使用Apache Httpd Server做负载平衡器,Tomcat集群节点使用Tomcat就可以做到以上第四种方式。这种方式比较灵活,成本相对也较低。另外一个很大的优点就是可以根据应用的情况和服务器的情况采取一些策略。
四. 自身调整 本节将向您详细介绍一些加速可使Tomcat实例加速运行的技巧和方法,无论是在什么操作系统或者何种Java虚拟机上。在有些情况下,您可能没有控制部署环境上的操作系统或者Java虚拟机。在这种情况下,您就需要逐行了解以下的的一些建议,然而你应该在修改后使之生效。我认为以下方法是Tomcat性能自身调整的最佳方式。
1.禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
除非你需要连接到站点的每个HTTP客户端的机器名,否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。对流量较小的站点来说禁用DNS查询可能没有大流量站点的效果明显,但是此举仍不失为一良策。谁又见到一个低流量的网站一夜之间就流量大增呢?
2.调整线程数
另外一个可通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。
Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。
在Tomcat5对这些参数进行了调整,请看下表: 属性名 描述 maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。 acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。 connnectionTimeout 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。 minSpareThreads Tomcat初始化时创建的线程数。 maxSpareThreads 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。
3.加速JSP编译速度
当第一次访问一个JSP文件时,它会被转换为Java serverlet源码,接着被编译成Java字节码。你可以控制使用哪个编译器,默认情况下,Tomcat使用使用命令行javac进行使用的编译器。也可以使用更快的编译器,但是这里我们将介绍如何优化它们。
另外一种方法是不要把所有的实现都使用JSP页面,而是使用一些不同的java模板引擎变量。显然这是一个跨越很大的决定,但是事实证明至少这种方法是只得研究的。如果你想了解更多有关在Tomcat可使用的模板语言,你可以参考Jason Hunter和William Crawford合著的《Java Servlet Programming 》一书(O'Reilly公司出版)。
在Tomcat 4.0中可以使用流行而且免费的Jikes编译器。Jikes编译器的速度要由于Sun的Java编译器。首先要安装Jikes(可访问http://oss.software.ibm.com/pub/jikes 获得更多的信息),接着需要在环境变量中设置JIKESPATH包含系统运行时所需的JAR文件。装好Jikes以后还需要设置让JSP编译servlet使用Jikes,需要修改web.xml文件中jspCompilerPlugin的值:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class> org.apache.jasper.servlet.JspServlet </servlet-class><init-param> <param-name>logVerbosityLevel</param-name> <param-value>WARNING</param-value> </init-param> <init-param> <param-name>jspCompilerPlugin</param-name> <param-value> org.apache.jasper.compiler.JikesJavaCompiler </param-value> </init-param> <init-param> <!-- <param-name> org.apache.catalina.jsp_classpath </param-name> --> <param-name>classpath</param-name> <param-value> /usr/local/jdk1.3.1-linux/jre/lib/rt.jar: /usr/local/lib/java/servletapi/servlet.ja r</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet>
在Tomcat 4.1(或更高版本),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪,但这正是Ant有意为之的一部分,有一个API文档指导开发者在没有启动一个新的JVM的情况下,使用Ant。这是使用Ant进行Java开发的一大优势。另外,这也意味着你现在能够在Ant中使用任何javac支持的编译方式,这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的,因为你只需要在 元素中定义一个名字叫“compiler”,并且在value中有一个支持编译的编译器名字,示例如下:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class> org.apache.jasper.servlet.JspServlet </servlet-class> <init-param> <param-name>logVerbosityLevel</param-name> <param-value>WARNING</param-value> </init-param> <init-param> <param-name>compiler</param-name> <param-value>jikes</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet>
Ant可用的编译器 名称 别名 调用的编译器 classic javac1.1, javac1.2 Standard JDK 1.1/1.2 compiler modern javac1.3, javac1.4 Standard JDK 1.3/1.4 compiler jikes The Jikes compiler JVC Microsoft Microsoft command-line compiler from the Microsoft SDK for Java/Visual J++ KJC The kopi compiler GCJ The gcj compiler (included as part of gcc) SJ Symantec Symantec's Java compiler extJavac Runs either the modern or classic compiler in a JVM of its own
由于JSP页面在第一次使用时已经被编译,那么你可能希望在更新新的jsp页面后马上对它进行编译。实际上,这个过程完全可以自动化,因为可以确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是一样的。
在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段,而不是编译阶段,使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。
可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet,被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面,可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它J
Tomcat提供了一种通过请求来编译JSP页面的功能。例如,你可以在浏览器地址栏中输入http://localhost:8080/examples/jsp/dates/date.jsp?jsp_precompile=true,这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得,不失为一种检验页面正确性的捷径。
4. 其它
前面我们提到过操作系统通过一些限制手段来防止恶意的服务攻击,同样Tomcat也提供了防止恶意攻击或禁止某些机器访问的设置。
Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。
例如你可以把Admin Web application设置成只允许本地访问,设置如下:
<Context path="/path/to/secret_files" ...> <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1" deny=""/> </Context>
如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。
五. 容量计划 容量计划是在生产环境中使用Tomcat不得不提的提高性能的另一个重要的话题。如果你没有对预期的网络流量下的硬件和带宽做考虑的话那么无论你如何做配置修改和测试都无济于事。
这里先对提及的容量计划作一个简要的定义:容量计划是指评估硬件、操作系统和网络带宽,确定应用服务的服务范围,寻求适合需求和软件特性的软硬件的一项活动。因此这里所说的软件不仅包括Tomcat,也包括与Tomcat结合使用的任何第三方web服务器软件。
如果在购买软硬件或部署系统前你对容量计划一无所知,不知道现有的软硬件环境能够支撑多少的访问量,甚至更糟直到你已经交付并且在生产环境上部署产品后才意识到配置有问题时再进行变更可能为时已晚。此时只能增加硬件投入,增加硬盘容量甚至购买更好的服务器。如果事先做了容量计划那么就不会搞的如此焦头烂额了。
我们这里只介绍与Tomcat相关的内容。
首先为了确定Tomcat使用机器的容量计划,你应该从一下列表项目种着手研究和计划:
1. 硬件
采用什么样的硬件体系?需要多少台计算机?使用一个大型的,还是使用多台小型机?每个计算机上使用几个CPU?使用多少内存?使用什么样的存储设备,I/O的处理速度有什么要求?怎样维护这些计算机?不同的JVM在这些硬件上运行的效果如何(比如IBM AIX系统只能在其设计的硬件系统上运行)?
2. 网络带宽
带宽的使用极限是多少?web应用程序如何处理过多的请求?
3. 服务端操作系统
采用哪种操作系统作为站点服务器最好?在确定的操作系统上使用哪个JVM最好?例如,JVM在这种系统上是否支持本地多线程,对称多处理?哪种系统可使web服务器更快、更稳定,并且更便宜。是否支持多CPU? 4. Tomcat容量计划
以下介绍针对Tomcat做容量计划的步骤:
1) 量化负载。如果站点已经建立并运行,可以使用前面介绍的工具模仿用户访问,确定资源的需求量。
2) 针对测试结果或测试过程中进行分析。需要知道那些请求造成了负载过重或者使用过多的资源,并与其它请求做比较,这样就确定了系统的瓶颈所在。例如:如果servlet在查询数据库的步骤上耗用较长的时间,那么就需要考虑使用缓冲池来降低响应时间。
3) 确定性能最低标准。例如,你不想让用户花20秒来等待结果页面的返回,也就是说甚至在达到访问量的极限时,用户等待的时间也不能超过20秒种(从点击链接到看到返第一条返回数据)。这个时间中包含了数据库查询时间和文件访问时间。同类产品性能在不同的公司可能有不同的标准,一般最好采取同行中的最低标准或对这个标准做出评估。
4) 确定如何合理使用底层资源,并逐一进行测试。底层资源包括CPU、内存、存储器、带宽、操作系统、JVM等等。在各种生产环境上都按顺序进行部署和测试,观察是否符合需求。在测试Tomcat时尽量多采用几种JVM,并且调整JVM使用内存和Tomcat线程池的大小进行测试。同时为了达到资源充分合理稳定地使用的效果,还需针对测试过程中出现的硬件系统瓶颈进行处理确定合理的资源配置。这个过程最为复杂,而且一般由于没有可参考的值所以只能靠理论推断和经验总结。
5) 如果通过第4步的反复测试如果达到了最优的组合,就可以在相同的生产环境上部署产品了。
此外应牢记一定要文档化你的测试过程和结果,因为此后可能还会进行测试,这样就可以拿以前的测试结果做为参考。另外测试过程要反复多次进行,每次的条件可能都不一样,因此只有记录下来才能进行结果比较和最佳条件的选择。
这样我们通过测试找到了最好的组合方式,各种资源得到了合理的配置,系统的性能得到了极大的提升。
六. 附加资料 很显然本文也很难全面而详尽地阐述性能优化过程。如果你进行更多研究的话可能会把性能调优做的更好,比如Java程序的性能调整、操作系统的调整、各种复杂环境与应用系统和其它所有与应用程序相关的东西。在这里提供一些文中提到的一些资源、文中提到的相关内容的链接以及本文的一些参考资料。
1. Web性能测试资料及工具
1) Jmeter Wiki首页,Jmeter为一个开源的100%Java开发的性能测试工具 http://wiki.apache.org/jakarta-jmeter/
2) Apache Benchmark使用说明 http://httpd.apache.org/docs-2.0/programs/ab.html
3) 一些Java相关测试工具的介绍,包含可以与Tomcat集成进行测试的工具 http://blog.csdn.net/wyingquan/
4) LoadRunner? 是一种预测系统行为和性能的工业标准级负载测试工具。它通过模拟数据以千万计用户来实施并发负载来对整个企业架构进行测试,来帮助您更快的查找和发现问题。 http://www.mercury.com/us/products/performance-center/loadrunner/
2. 文中介绍的相关内容的介绍
1) Apache 2.x + Tomcat 4.x做负载均衡,描述了如何利用jk配置集群的负载均衡。 http://raibledesigns.com/tomcat/index.html
2) 容量计划的制定,收集了许多有关制定web站点容量计划的例子: http://www.capacityplanning.com/
3) 评测Tomcat5负载平衡与集群, http://www.javaresearch.org/article/showarticle.jsp?column=556&thread=19777
4) Apache与Tomcat的安装与整合之整合篇 http://www.javaresearch.org/article/showarticle.jsp?column=23&thread=18139
5) 性能测试工具之研究,介绍了性能测试工具的原理与思路 http://www.51testing.com/emagzine/No2_2.htm
6) Java的内存泄漏 http://www.matrix.org.cn/resource/article/409.html
7) Web服务器和应用程序服务器有什么区别? http://www.matrix.org.cn/resource/article/1429.html
8) 详细讲解性能中数据库集群的问题 http://www.theserverside.com/articles/article.tss?l=DB_Break
假设计算机内存很小。不够一次性打出 "Hello world" main(void) { printf("hello world\n"); } 或 main(void) { char* s="hello world\n"; printf(s); } 都会溢出。应写成如下形式。 main(void) { char* s=malloc (12); sprintf(s, "hello" ); sprintf(s + 5 , " world\n" ); printf(s);
free(s); } 而在java里面,JVM帮我们自动释放内存。而JAVA怎么时候释放内存呢?那就是判断变量是否为null。
1.数据库完整备份 EXP SYSTEM/PASSWORD@SID FULL=Y FILE=D:\SYSTEM.DMP LOG=D:\SYSTEM.LOG 2.数据入库 (a)从数据库中删除SDE和SDE USER用户 DROP USER SDE CASCADE; DROP USER SDEUSER CASCADE; (b)创建新的SDE用户和SDEUSER 下为创建SDE用户过程: (i)创建表空间 CREATE TABLESPACE "SDE" LOGGING DATAFILE 'C:\ORACLE\ORADATA\ORACLE\SDE.ora' SIZE 200M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO (ii)创建用户 CREATE USER "SDE" PROFILE "DEFAULT" IDENTIFIED BY "PASSWORD" DEFAULT TABLESPACE "SDE" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK; (iii)创建角色 GRANT "DBA" TO "SDE"; GRANT "CONNECT" TO "SDE"; GRANT "RESOURCE" TO "SDE"; (iiii)系统权限 GRANT ALTER ANY INDEX TO "SDE" WITH ADMIN OPTION; GRANT ALTER ANY TABLE TO "SDE" WITH ADMIN OPTION; GRANT ANALYZE ANY TO "SDE" WITH ADMIN OPTION; GRANT CREATE ANY INDEX TO "SDE" WITH ADMIN OPTION; GRANT CREATE ANY PROCEDURE TO "SDE" WITH ADMIN OPTION; GRANT CREATE ANY SEQUENCE TO "SDE" WITH ADMIN OPTION; GRANT CREATE ANY TRIGGER TO "SDE" WITH ADMIN OPTION; GRANT CREATE ANY VIEW TO "SDE" WITH ADMIN OPTION; GRANT CREATE SESSION TO "SDE" WITH ADMIN OPTION; GRANT DROP ANY INDEX TO "SDE" WITH ADMIN OPTION; GRANT DROP ANY TABLE TO "SDE" WITH ADMIN OPTION; GRANT DROP ANY VIEW TO "SDE" WITH ADMIN OPTION; GRANT DROP ANY PROCEDURE TO "SDE" WITH ADMIN OPTION; GRANT DROP ANY SEQUENCE TO "SDE" WITH ADMIN OPTION; GRANT EXECUTE ANY PROCEDURE TO "SDE" WITH ADMIN OPTION; GRANT SELECT ANY SEQUENCE TO "SDE" WITH ADMIN OPTION; GRANT SELECT ANY TABLE TO "SDE" WITH ADMIN OPTION; GRANT UNLIMITED TABLESPACE TO "SDE" WITH ADMIN OPTION;
3.导入SDE和SDEUSER的数据 注意顺序,先SDE,后SDEUSER IMP SYSTEM/PASSWOR@SID FROMUSER=SDE TOUSER=SDE IMP SYSTEM/PASSWOR@SID FROMUSER=SDEUSER TOUSER=SDEUSER
以上提到的SDE和SDEUSER是不同的用户,SDE是ArcSDE安装时的默认用户,SDEUSER 是指用户存储数据的用户,如果之间使用SDE默认用户存储,则省去所以的SDEUSER操作
注:如果移植后arcSDE服务无法启动,则进入post installation重新设置一下arcSDE服务。
用mapinfo的easyload把空间数据上传到oracle中时,EasyLoad自动创造了一个表空间mapinfo和用户mapinfo,假设我们以用户test上传tab文件到空间数据库中,那么当我们进行空间数据库备份时,需要: (1)进入sqlplus,运行exp mapinfo/mapinfo@ora,然后一路按回车,导出mapinfo用户的所有对象。导出文件为c:\mapinfo.dmp; (2)进入sqlplus,运行exp test/test@ora,然后一路按回车,导出test用户的所有对象。导出文件为C:\test.dmp; 当要在另一台机器上导入数据时,需要: (1)在oracle中新建用户mapinfo,test,表空间mapinfo和test; (2)用sqlplus或PLSQL把两个dmp文件导进来就可以了,记住先导mapinfo.dmp。
新装WinXP,别的机器无法访问,需要开启用户。
进入控制面版,“管理工具”-》“本地安全策略”-》“安全设置”-》“本地策略”-》“安全选项”-》“网络访问:本地帐户的共享和安全模式”中,改为“经典,本地用户以自己的身份验证” 。
(1)进入<arcIMS安装目录>\AppServer\目录,把AimsAdmPw文件删除掉; (2)进入控制面板-管理工具-服务,把arcIMS的三个服务全部重新启动一遍就OK了。
ArcSDE提供了C API和Java API两种接口。这里我们只导论如何通过Java API进行arcSDE开发。 开发环境: JDK 1.5 WIN 插P Eclipse 3.1+MyEclipse ArcSDE for Oracle 9i (1)把arcSDE java API所需要的三个jar包导到web\lib目录,包括jsde90_sdk.jar,jpe90_sdk.jar ,concurrent.jar; (2)添加点: public class AddPointBean { public static boolean process(HttpServletRequest request, HttpServletResponse response) throws Exception { Map map=null; if (request.getSession().getAttribute(StaticConstant.SESSION_MAP) == null) { String strErr = "地图还没有初始化"; request.setAttribute(StaticConstant.REQUEST_ERROR, strErr); return false; } map=(Map)request.getSession().getAttribute(StaticConstant.SESSION_MAP); //连接SDE SeConnection conn = null; String server = "menglikunm"; int instance = 5151; String database = "ora"; String user = "sde"; String password = "sde"; SeLayer insertLayer=null; try { conn = new SeConnection(server, instance, database, user, password); Vector layerList = conn.getLayers(); for (int index = 0; index < layerList.size(); index++) { SeLayer layer = (SeLayer) layerList.elementAt(index); // Displays the layer’s name System.out.println(layer.getName()); // Displays the layer’s ID System.out.println(layer.getID().longValue()); // Displays the layer’s spatial column name System.out.println(layer.getSpatialColumn()); if(layer.getName().equalsIgnoreCase("ZHENGFUJIGUAN")){ insertLayer=layer; } } } catch (SeException e) { e.printStackTrace(); return false; } //开始插入数据 try{ conn.startTransaction(); String[] cols = new String[2]; cols[0] = new String("NAME"); cols[1] = insertLayer.getSpatialColumn(); SeInsert insert = new SeInsert(conn); insert.intoTable(insertLayer.getName(),cols); insert.setWriteMode(true); SeCoordinateReference coordref =(SeCoordinateReference)insertLayer.getCoordRef(); SeShape shape = new SeShape(coordref); double x=map.toMapPoint(10,10).getX(); double y=map.toMapPoint(10,10).getY(); int numPts = 1; SDEPoint[] ptArray = new SDEPoint[numPts]; ptArray[0] = new SDEPoint(x, y); shape.generatePoint(numPts, ptArray); SeRow row = insert.getRowToSet(); row.setString(0, "测验点"); row.setShape(1,shape); insert.execute(); insert.close(); conn.commitTransaction(); conn.close(); }catch(Exception ex){ conn.rollbackTransaction(); conn.close(); ex.printStackTrace(); } return true; } } (3)删除点: public class DeletePointBean { public static boolean process(HttpServletRequest request, HttpServletResponse response) throws Exception { //连接SDE SeConnection conn = null; String server = "menglikunm"; int instance = 5151; String database = "ora"; String user = "sde"; String password = "sde"; try { conn = new SeConnection(server, instance, database, user, password); Vector layerList = conn.getLayers(); for (int index = 0; index < layerList.size(); index++) { SeLayer layer = (SeLayer) layerList.elementAt(index); // Displays the layer’s name System.out.println(layer.getName()); // Displays the layer’s ID System.out.println(layer.getID().longValue()); // Displays the layer’s spatial column name System.out.println(layer.getSpatialColumn()); } } catch (SeException e) { e.printStackTrace(); return false; } //开始删除数据 try{ conn.startTransaction(); SeDelete delete=new SeDelete(conn); SeObjectId id=new SeObjectId(641); delete.byId("ZHENGFUJIGUAN",id); conn.commitTransaction(); delete.close(); }catch(Exception ex){ conn.rollbackTransaction(); conn.close(); ex.printStackTrace(); } return true; } } (4)高兴一把,就是这么简单。更多内容请参考arcSDE帮助。
出现这个错误一般说明arcIMS的lincense文件已经过期或不可用。 找到<arcInfo安装目录>arcGIS\bin\AuthorizationSummary.exe(必须安装了arcGIS),运行 查看arcIMS是否正确注册或者已经过期,如果已经过期,只能再花money去买一个新的license了。不过在中国嘛 呵呵。
例如我们定义一个action的请求路径为:/login,而我们的站点名为test,那么在form中应该把action设置为action="/test/login.do",如果不这样设置那么在action的执行代码里面有return mapping.getInputForward()时,第二次请求这个action会出现找不到login.do的错误。 这也不是根本的办法,最好的办法是用struts的<html:base/>标签。 在jsp页面添加引用: <%@ taglib uri="/tags/struts-html" prefix="html" %> 然后在<head></head>中添加<html:base/>就可以了。
使用该函数的时候会出现第一次能正确定位,而第二次定位不正确的情况,解决办法是每次在调用该函数之前都调用一下map.reset()函数。 另外,不同的图层类型要使用不同的定位方式。以下是示例代码: map.reset(); if (fLayer.getFeatureClass().equalsIgnoreCase("point")) { SimpleMarkerSymbol simpleMarker = new SimpleMarkerSymbol(); simpleMarker.setMarkerType(SimpleMarkerSymbol.STAR); simpleMarker.setColor("255,0,0"); simpleMarker.setWidth(20); map.displayFeatures(fLayer, expression, true, simpleMarker);
} else if (fLayer.getFeatureClass().equalsIgnoreCase("line")) { SimpleLineSymbol symbol = new SimpleLineSymbol(); symbol.setColor("255,0,0"); symbol.setTransparency(0.5); symbol.setWidth(9);
map.displayFeatures(fLayer, expression, true, symbol); } else { SimplePolygonSymbol symbol = new SimplePolygonSymbol(); symbol.setFillColor("255,0,0"); symbol.setTransparency(0.5); symbol.setFillType(SimplePolygonSymbol.VERTICAL); map.displayFeatures(fLayer, expression, true, symbol); } map.refresh();
在Hibernate 3中,如果HQL语句中有中文,Hibernate生成的SQL语句将会有乱码。例如HQL语句"from Churukou as c where c.name='阿蒙'",在控制台中打出的语句为:Hibernate: select churukou0_.OBJECTID as OBJECTID, churukou0_.NAME as NAME0_ from SDE.CHURUKOU churukou0_ where churukou0_.NAME='???è' 解决办法是在hibernate的设置文件hibernate.cfg.xml的</session-factory>中加入这么一行: <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
myeclipse没有提供自动删除功能,所以只能打开相应的.project文件,删除相关内容。但jar,自动生成的xml文件等必须手动删除。
在测试的时候如果出现这个错误,检查一下Esrimap_prop中设置的机器名是否正确。如果都没有问题,那就只能重新安装一下arcIMS试一试了。我在win xp下出现过这个问题,重装一下arcIMS就OK了。
(1)确定你的lincense文件是否可用,或者已经过期。如果已经过期,配置时会出现错误。 (2)配置arcSDE服务的最后一步中,会出现对话框提示是否启动服务,最好选择“否”,而到控制面版-管理工具-服务中启动服务。
|