一、安装准备
在进行安装以前,你应该准备以下软件:
软件:j2sdk-1_4_2_04-windows-i586-p.exe
版本:1.4.2_04
官方下载:
http://java.sun.com/j2se/1.4.2/download.html 软件:jakarta-tomcat-5.0.28.exe
版本:5.0.28
官方下载:
http://www.apache.org/dist/jakarta/ 软件:jakarta-struts-1.1.zip
版本:1.1
官方下载:
http://www.apache.org/dist/jakarta/struts/ 软件:eclipse-SDK-2.1.3-win32.zip
版本:2.1.3
官方下载:
http://www.eclipse.org/downloads/index.php ftp://download2.eclipse.org/R-2.1.1-200306271545/eclipse-SDK-2.1.1-win32.zip
备注:目前eclipse最新版为eclipse3.0
软件:eclipse2.1.1-SDK-win-LanguagePackFeature.zip
版本:2.1.1
官方下载:
http://download2.eclipse.org/downloads/drops/ L-2.1.x%20Translations-200307021300
/eclipse2.1.1-SDK-win-LanguagePackFeature.zip
备注:该版本只能汉化eclipse2.1.3及以下版本
软件:TomcatPlugin
版本:2.2.1
官方下载:
http://www.sysdeo.com/eclipse/tomcatPlugin.html 软件:Lomboz
版本:2.1.3
官方下载:
http://www.objectlearn.com/index.jsp 软件:EasyStruts
版本:0.6.4
官方下载:
http://sourceforge.net/projects/easystruts 如果要找其他eclipse插件可以去下面这个站点
http://www.eclipse-plugins.info/ 二、JDK安装
1.安装J2SE-SDK到C:\j2sdk1.4.2_04
部分目录结构如下:
C:\j2sdk1.4.2_04\bin
C:\j2sdk1.4.2_04\lib
C:\j2sdk1.4.2_04\jre
...
2.配置环境变量如下:
JAVA_HOME=C:\j2sdk1.4.2_04
PATH=%PATH%;C:\j2sdk1.4.2_04\bin
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%TOMCAT_HOME%\common\lib\servlet-api.jar;%TOMCAT_HOME%\common\lib\jsp-api.jar
三、Tomcat安装
1.安装jakarta-tomcat-5.0.28.exe到C:\Tomcat 5.0
部分目录结构如下:
C:\Tomcat 5.0\bin
C:\Tomcat 5.0\conf
C:\Tomcat 5.0\webapps
...
2.配置环境变量如下:
CATALINA_HOME=C:\Tomcat 5.0
TOMCAT_HOME=C:\Tomcat 5.0
四、Struts安装
1.解压jakarta-struts-1.1.zip到C:\jakarta-struts-1.1
部分目录结构如下:
C:\jakarta-struts-1.1\lib
C:\jakarta-struts-1.1\webapps
...
五、Eclipse安装
1.解压eclipse-SDK-2.1.3-win32.zip到D:\eclipse
部分目录结构如下:
D:\eclipse\features
D:\eclipse\plugins
...
2.启动Eclipse,看看安装是否成功
如果启动不成功,请查看JRE是否安装
3.启动Eclipse,点击菜单 windows->preferences
在左边树中点击展开java,选择Installed JREs,
如果Installed JREs如下则正确:
JRE Type:Standard VM
Name:j2re1.4.2_04
Location:C:\j2sdk1.4.2_04\jre
六、Eclipse汉化
1.解压eclipse2.1.2.1-SDK-win32-LanguagePackFeature.zip
到D:\eclipse下
将目录名eclipse2.1.2.1-SDK-win32-LanguagePackFeature
改为eclipse2.1.2.1Language
部分目录结构如下:
D:\eclipse\eclipse2.1.2.1Language\eclipse\features
D:\eclipse\eclipse2.1.2.1Language\eclipse\plugins
...
2.在E:\eclipse下新建文件夹links,使得文件夹links
和文件夹eclipse2.1.2.1Language同级
3.在D:\eclipse\links下新建文件,文件名任取,
我们命名为language.link,打开此文件,
加入 path = D:\\eclipse\\eclipse2.1.2.1Language
4.启动Eclipse,看看汉化是否成功,
如不成功请检查language.link文件中配置信息
path = D:\\eclipse\\eclipse2.1.2.1Language
和汉化文件夹eclipse2.1.2.1Language的安装路径是否一致
七、TomcatPlugin安装
1.解压tomcatPluginV221.zip
2.将解压目录tomcatPluginV221下
文件夹com.sysdeo.eclipse.tomcat_2.2.1复制到eclipse安装
目录中的plugins目录中,即D:\eclipse\plugins
3.启动Eclipse
4.启动后你将看到你的菜单上多了一个下拉项Tomcat,
快捷栏里多了三个Tomcat的猫图表,如果没有看到,
请点击 窗口->定制透视图,展开树结构中的“其它”,选择“Tomcat”
5.点击 窗口->首选项
在左边树中点击tomcat,
设置tomcat version为version 5.x
设置tomcat-home为C:\Tomcat 5.0
设置perspective to switch when tomcat is started为java
在左边树中点击tomcat->JVM setting,设置JRE为j2sdk1.4.2
在“Tomcat”选项的子选项“JVM Settings” -> “Classpath”中,
添加 Jar/Zip ,该值应该是 java_home/lib/tools.jar。
这用于编译 JSP 文件。
为项目的 classpath 引用设置 classpath 变量 TOMCAT_HOME。
要完成这一任务,请在与步骤 5 相同的弹出菜单中选择“Java”选项,
然后选择“Classpath Variables”子选项,
并添加一个新的变量“TOMCAT_HOME”,其路径是C:\Tomcat 5.0。
确保“Tomcat”菜单和 3 个工具栏按钮可用。到现在为止,
我们应该在 Java 视图中可以看到一个“Tomcat”菜单和 3 个 Tomcat 工具栏
按钮.如果您没有看到这些内容,回到“Window”菜单中,
选择“Customize Perspective...”项,打开选项树,
选中“Other”项并选中“Tomcat”子选项。
点击应用确定
6.点击快捷按钮“Start Tomcat”来启动Tomcat吧。
八、Lomboz安装
1.解压lomboz.213.zip
2.将解压目录lomboz.213\plugins下文件夹com.objectlearn.jdt.j2ee
和com.objectlearn.jdt.j2ee.editors 复制到eclipse安装目录中的plugins
目录中,即D:\eclipse\plugins
3.启动Eclipse
4.点击 窗口->首选项
在左边树中点击lomboz,设置JDK tools.jar位置为
C:\j2sdk1.4.2_04\lib\tools.jar
在左边树中点击lomboz->server definitions,
设置Server Type为Apache Tomcat v5.0.x
设置Application Server Directory为C:\Tomcat 5.0
设置classpath Variable Name为TOMCAT_HOME
设置classpath Variable为C:\Tomcat 5.0
点击应用确定。
九、easyStruts安装
1.解压org.easystruts.eclipse_0.6.4.zip
2.将解压目录org.easystruts.eclipse_0.6.4下文件夹
com.cross.easystruts.eclipse_0.6.4复制到eclipse安装目录中的plugins
目录中,即D:\eclipse\plugins
3.启动Eclipse
4.点击 窗口->首选项
在左边树中点击Easy Struts,选择struts1.1
ADD JREs如下:
struts.jar-C:\jakarta-struts-1.1\lib\struts.jar
ADD TLDs如下:
struts-tiles.tld-C:\jakarta-struts-1.1\lib\struts-tiles.tld
struts-template.tld-C:\jakarta-struts-1.1\lib\struts-template.tld
struts-nested.tld-C:\jakarta-struts-1.1\lib\struts-nested.tld
struts-logic.tld-C:\jakarta-struts-1.1\lib\struts-logic.tld
struts-html.tld-C:\jakarta-struts-1.1\lib\struts-html.tld
struts-bean.tld-C:\jakarta-struts-1.1\lib\struts-bean.tld
点击应用确定。
至此,所有需要的插件都安装好了,下次详细讲述如何用eclipse
来开发 Struts 应用程序
/************************************************/
用个例子调试:
建立工程
操作过程:
菜单【文件】-【新建】选择【项目】如图所示
点击下一步输入你的工程名称,如图所示
点玩下一步后出现如下:
,如图
再下一步就出现如下,
这时候要注意了,
下一步
选择【Web Modules】添加Module 如图所示
输入 Module名称 [如:test]
选择Targeted Servers ,如图
把JBOSS 3.2.x改为选择配置好的【Apache Tomcat v 4.01/4.02】,
添加后(一定要添加),完成,如图所示[界面可能跟个人的界面设置不同而有所不同]
如果右边的没有代码显示的话,展开TestJsp,再展开test,双击index.jsp,这样就打开了
好了,现在就让我们来调试这个程序吧
启动tomcat,右键点击index.jsp,然后下拉到Lomboz J2EE,左击Check Jsp Syntax
如图:
右键点击test,进行如下图操作:
最后就是运行,如下图:
然后就可以看到在浏览器上显示的结果了:)
注:文章转自:
http://www.javaresearch.org/article/showarticle.jsp?column=2&thread=27151
posted @
2005-12-05 15:47 逍遥草 阅读(3531) |
评论 (0) |
编辑 收藏
结束了一段的工作,今天又开始了为明天的生活而奔波。拿起书,重新走进编成的海洋,很多东西等待我去学习,去掌握。感觉有点手足无措。
想想,还是从工具着手,然后结合书本动动手练习一下。我想这样掌握起来比较快点。
Eclipse 是什么?
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。
基于 Eclipse 的应用程序的突出例子是 IBM 的 WebSphere Studio Workbench,它构成了 IBM Java 开发工具系列的基础。例如,WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、Web 服务和数据库访问的支持。
看这段介绍,不是很懂,但目前我就权当是做为Java 的一个编译工具 来使用吧
Eclipse 安装
我下载了Eclipse3.1.1版本,解压后,运行eclipse.exe,提示我need jdk1.4.1。我记得我是装了jdk1.4.2
的,不可能不支持吧。后来,去网上搜了一下,发现原来是因为我装了oracle,环境变量Path有问题。将jdk安装目录放在path的最前面,重起eclipse.exe,成功了!
Eclipse 插件安装
原来我有MyEclipse 3.8.0 ,安装时,提示我选择eclipse的安装路径,选择好,点击next,提示我不对,郁闷,难道是因为我用的是eclipse3.1.1的版本?去http://www.myeclipseide.com/modules.php?op=modload&name=Downloads&file=dl_options注册一下,down来Myeclipse4 ,安装,一切ok。这个兼容真是有点问题哦
posted @
2005-12-05 12:48 逍遥草 阅读(354) |
评论 (0) |
编辑 收藏
一般情况下,在使用开发基于
数据库的WEB程序时,传统的模式基本是按以下步骤:
1. 在主程序(如Servlet、Beans)中建立
数据库连接。
2. 进行SQL操作,取出数据。
3. 断开
数据库连接。
使用这种模式开发,存在很多问题。首先,我们要为每一次WEB请求(例如察看某一篇文章的内容)建立一次
数据库连接,对于一次或几次操作来讲,或许你觉察不到系统的开销,但是,对于WEB程序来讲,即使在某一较短的时间段内,其操作请求数也远远不是一两次,而是数十上百次(想想全世界的网友都有可能在您的网页上查找资料),在这种情况下,系统开销是相当大的。事实上,在一个基于
数据库的WEB系统中,建立
数据库连接的操作将是系统中代价最大的操作之一。很多时候,可能您的网站速度瓶颈就在于此。
其次,使用传统的模式,你必须去管理每一个连接,确保他们能被正确关闭,如果出现程序异常而导致某些连接未能关闭,将导致
数据库系统中的内存泄露,最终我们将不得不重启
数据库。
针对以上问题,我们首先想到可以采用一个全局的Connection对象,创建后就不关闭,以后程序一直使用它,这样就不存在每次创建、关闭连接的问题了。但是,同一个连接使用次数过多,将会导致连接的不稳定,进而会导致WEB SERVER的频频重启。故而,这种方法也不可取。实际上,我们可以使用连接池技术来解决上述问题。首先,介绍一下连接池技术的基本原理。顾名思义,连接池最基本的思想就是预先建立一些连接放置于内存对象中以备使用:
当程序中需要建立
数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视
数据库连接的数量、使用情况等。下面我们以一个名为ConnectionPool的连接池为例来看看连接池的实现。先看看ConnectionPool的基本属性:
m_ConnectionPoolSize:连接池中连接数量下限
m_ConnectionPoolMax:连接池中连接数量上限
m_ConnectionUseCount:一个连接的最大使用次数
m_ConnectionTimeout:一个连接的最长空闲时间
m_MaxConnections = -1:同一时间的最大连接数
m_timer:定时器
这些属性定义了连接池与其中的每个连接的有效状态值。连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。其管理流程如下:
我们可以定义出ConnectionPool要完成管理所需要的基本接口:
public class ConnectionPool implements TimerListener{
public boolean initialize() //连接池初始化
public void destroy() //连接池的销毁
public synchronized java.sql.Connection getConnection() //取一个连接
public synchronized void close() //关闭一个连接
private synchronized void removeFromPool() //把一个连接从连接池中删除
private synchronized void fillPool() //维护连接池大小
public synchronized void TimerEvent() //定时器事件处理函数
}
通过这几个接口,已经可以完成连接池的基本管理。在TimeEvent()函数中完成连接池的状态检验工作,fillPool()时连接池至少保持最小连接数。因为我们要保存每一个连接的状态,所以还需要一个
数据库连接对象:
class ConnectionObject{
public java.sql.Connection con; public boolean inUse; //是否被使用标志
public long lastAccess; //最近一次开始使用时间
public int useCount; //被使用次数
}
加入了ConnectionObject对象后,在ConnectionPool中操作的应该只是ConnectionObject,而其他进程需要的只是ConnectionObject的con属性,因此我们再加入一个类,作为其他进程获得与返回连接的接口: CLASS Conn{
GetConnection(); //从连接池中取出一个有效连接
CloseConnection(); //返回连接,此时并没有关闭连接,只是放回了连接池
DestroyPool(); //销毁连接池
}
通过上面的介绍,我们可以看出,连接池技术的关键就是其自身的管理机制,以上的管理流程只是本人一点见解,关键是想向大家介绍一种思路,在此基础上,您可以进一步完善连接池技术为您所用。
文章出处:
http://www.vipcn.com/InfoView/Article_40881.html
posted @
2005-09-30 17:52 逍遥草 阅读(466) |
评论 (0) |
编辑 收藏
jdbc程序的性能主要由两个因素决定,一是数据库本身的性质,另一个是与数据库相对独立的jdbc应用程序接口(api)的使用.这里说的是如何正确使用jdbc编程接口,以获得更好的性能. jdbc主要优化有: 1.选择正确的jdbc驱动程序 2.Connention的优化 使用连接池来管理Connection对象 3.Statement的优化 使用批量更新等 4.Result的优化 正确的从数据库中get数据等 (1)选择正确的jdbc驱动程序: 1 jdbc-odbc 桥 2 本地api-部分 java驱动 3 jdbc网路协议-纯java驱动 4 jdbc本地协议 最好选择 jdbc网路协议-纯java驱动 效率比较高 但需要第三方软件的支持 比如corba weblogic属于这种类型 (2)优化Connection对象: 1.设置适当的参数 DriverManager.getConnection(String url,Properties props); 例如: Properties props=new Properties(); props.put("user","wuwei"); props.put("password","wuwei"); props.put("defaultRowPrefectch","30"); props.put("dufaultBatchValue","5"); Connection con=DriverManager.getConnection("jdbcracle:thin:@hostsString",props); 对象可以通过设置setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 两个参数类优化连接
2.使用连接池 可以自己写一个连接池 这样程序的灵活性强,便于移植. apache项目开发了一套非常通用而表现非常稳定的对象池 http://jakarta.apache.org/commons/pool.htm 设计了自己的连接池后 在客户端调用建立对象 public Object makeObject() throws Exception{ Class.forName("oracle.jdbc.driver.OracalDriver"); return DriverManager.getConnection("url","username","password"); } 销毁对象时用 public void destroyObject(Object obj) throws Exception{ ((Connection)obj.close()); } 注意几点 对象池里有没有回收机制,对象池里有机有容量限制,对象池里有多少个闲置对象(可以释放) 3.控制事务的提交 最好手动提交事务,不但可以可以保证数据原子性,而且对新能提高留下余地. try{ connection.setAutoCommint(false); // 代码 用PreparedStatement 性能比Statementh好.
connection.commit(); connection.setAutoCommit(true); } catch(SQLException e){ } finally{ //代码 if(connection!=null){ connection.close(); } }
4.适当的选择事务的隔离级别 TRANSACTION_READ_UNCOMMITED 性能最高 TRANSACTION_READ_COMMITED 快 TRANSACTION_REFEATABLE_READ 中等 RANSACTION_SERIALIZABLE 慢 (3)Statement 优化 jdbc3个接口用来处理sql的执行,是Statement PreparedStatement CallableStatement 提供适当的Statement接口 批量执行sql 从数据库批量获取数据 PreparedStatement 比Statement性能要好 主要体现在一个sql语句多次重复执行的情况 PreparedStatemnt只编译解析一次而Statement每次编译一次. 批量修改数据库 Statement 提供了方法addBatch(String)和executeBatch() 调用方法为stmt.addBatch("isnert....."); stmt.addBatch("update.....") stmt.executeBatch(); 也可以用PreparedStatement从而更好的提高性能. pstmt=conn.preparedStatement("insert into test_table(......) values(....?)"); pstmt.setString(1,"aaa"); pstmt.addBatch(); pstmt.setString(1,"bbb"); pstmt.addBatch(); ..... pstmt.executeBatch(); 批量地从数据库中取数据. 通过setFetchSize()和getFectchSize()方法来设定和查看这个参数.这个参数对体统的性能影响比较大. 这个参数太小会严重地降低程序地性能. Connection Statement ResultSet都有这个参数,他们对性能地影响顺序是: ResultSet---------Statement---------Connection (4)优化ResultSet. 体现在以下几个方面 批量读取数据.合理设置ResultSet的getFetchSize()和setFetchSize()方法中的参数 使用正确的get和set方法 使用整数而不是字段名作为参数性能比较高, 例如 setInt(1,100); setString(2,"aaaa"); 比 setInt("id","100"); setString("name","aaaa"); 性能好 设置适当的滚动方向.有3个方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN 单向滚动性能比较高. 其他方面的性能优化 及时显示的关闭Connection Statement ResultSet 其中Connection可以用Connetion Pool处理. 使用数据库系统的强大查询功能去组织数据.这样程序运行是和数据库服务的交互次数少,数据库返回给 程序的记录条数少的多,所以性能有很大的提高.
|
posted @
2005-09-28 22:13 逍遥草 阅读(571) |
评论 (0) |
编辑 收藏
脚本语言近来受到一些关注。随着Groovy和 Jython的到来,编写与Java合并的脚本比Ant更简单自然。一直以来使用XML来调用Java方法都是被迫的,这主要是因为在标记语言中解释流、条件表达式和自定义代码比较困难(虽然自Ant 1.5之后这一点有了较大的改进)。
为什么用脚本语言呢?是这样的,如果我有完整的Java编程IDE,用Jython或是Groovy看起来就显得有些落伍了。虽然可以用较少行来编码(虽然不是少很多),但是我希望输入的编写能够自动化。我希望编译器在编码时告警,而且我需要分解。这需要Java IDE以外的插件。
但有时候没有完整的IDE配置。想一下要自动敏捷的工作,或者想一下服务器管理员。这些人没有任何像Eclipse之类的东西,而且他们的工作不可能事先完成。不可能为系统管理而编码。这就是像WLST这类工具产生的来由,它们使得世界更美好。
WebLogic 脚本工具(WLST,WebLogic Scripting Tool)是一个帮助编写远程管理和修改服务器安装脚本的Jython模块。它有两个版本:离线,它可以配置尚不存在的服务器实例,以及在线,它需要连接到一个WebLogic服务器。这两个版本都是Beta版而且文档很少,但是它们保证会改进并在将来的某个WebLogic版本中包含。
这里我们将专注于在线版本,因为它的功能比离线版本更为完整。
使服务器配置自动化:
让我们从难以对付的WebLogic服务器配置开始吧!典型的开发团队在几台主机上复制同样的配置,仅仅改变少量参数,如IP、主机名和TCP端口。在相对典型的项目中,必须对每个开发人员的PC、集成测试主机和生产主机,都要执行一遍这个过程。Ant任务对这个问题有很大帮助,但是它还没有准备好处理像定制JMX bean这类的事务。
我们将创建并装载服务器,配置它,然后关机,混合使用Ant和WLST。首先,让我们创建清单1中的服务器。为了简化,我们将在这里使用Ant任务,因为结合使用WLST离线和在线会使事情复杂化。
清单1
build.properties:
server=weblogic
weblogic.server.name=myserver
weblogic.domain.name=mydomain
weblogic.admin.username=weblogic
weblogic.admin.password=weblogic
weblogic.home=C:/bea
weblogic.lib.dir=/weblogic81/server/lib
weblogic.mbeantypes.dir=/mbeantypes
server.project.root.dir=/user_projects/domains/
server.deploy.dir=/applications
我检查了属性,因为在多于一个品牌的应用服务器上部署时,很容易使用错误的build.properties文件(参见清单2)。
清单 2
build.xml:
[...]
<path id="weblogic.classpath">
<fileset dir="">
<include name="weblogic.jar"/>
</fileset>
</path>
<target name="check-properties">
<condition property="wlproperties.ok">
<and>
<isset property="weblogic.server.name"/>
<isset property="weblogic.domain.name"/>
<isset property="weblogic.admin.username"/>
<isset property="weblogic.admin.password"/>
</and>
</condition>
<fail unless="wlproperties.ok">
Weblogic properties are missing. Double check build.properties.
</fail>
<fail>
<condition>
<not><available file="/weblogic.jar"/></ not>
</condition>
Missing file /weblogic.jar
</fail>
</target>
<target name="create-server" depends="check-properties">
<taskdef name="wlserver" classname="weblogic.ant.taskdefs. management.WLServer"
classpathref="weblogic.classpath"/>
<echo>Creating server at </echo>
<delete dir="" includeemptydirs="true" quiet="true"/>
<mkdir dir="" />
<wlserver
dir=""
domainName=""
serverName=""
host=""
port=""
generateConfig="true"
productionModeEnabled="false"
weblogicHome="/weblogic81"
username=""
password=""
action="start"
>
<classpath refid="weblogic.classpath"/>
</wlserver>
我们刚刚删除了整个域目录,创建了一个新的、干净的目录,并让服务器运行,这样,在清单3中,我们可连接并配置它。
清单3
<java classname="weblogic.WLST" fork="true" failOnError="true" dir="scripts/wlst">
<classpath refid="weblogic.classpath"/>
<classpath>
<fileset dir="lib/wlst">
<include name="*.jar"/>
</fileset>
</classpath>
<arg line="createAll.py" />
</java>
<wlserver
host=""
port=""
username=""
password=""
action="shutdown"
/>
</target>
停止服务器是必要的,因为有些设置改变了,如安全验证者,需要正常关机以保存到磁盘。省略这一步将会在Ant脚本结束处突然中止服务器。
注意:WLST任务有分叉,因此,如果WLST在脚本中发现了错误,Ant仍将会显示“成功编译”,从而会使得装载该脚本的人迷惑。
让我们将WLST脚本分成两个部份,这样在以后的管理任务中能尽可能多的重用它。我已经使用了包含在WLST包中的很棒的例子,并且将saveDomain()命令的输出作为起点。saveDomain()生成的脚本不是很完美,但是它能指出工具的可能性(参见清单4)。
清单 4
createAll.py:
execfile("AdminTool.py")
admin.configureServer()
admin.createXaPool()
AdminTool.py:
from javax.management import InstanceNotFoundException
# Python 2.4 will include booleans, but until then this is required
true = 1
false = 0
class AdminTool:
def __init__(self):
loadProperties("administration.properties")
# Connects with a weblogic instance
def connect(self):
connect(username, password, "t3://" + host + ":" + port)
self.myServer = getTarget("/Server/" + serverName)
# Server attributes that cannot be generated via ant
def configureServer(self):
# Activates console DEBUG mode - I really like that
self.myServer.setStdoutSeverityLevel(64)
print "Configured server " + self.myServer.getName()
# Creates a JDBC pool:
def createPool(self, poolName, driverName):
pool = create(poolName, "JDBCConnectionPool")
pool.setDriverName(driverName)
pool.setURL(dbURL)
pool.setPassword(dbPassword)
pool.setProperties(makePropertiesObject("user=" + dbUsername))
pool.setRemoveInfectedConnectionsEnabled(false)
pool.setTestConnectionsOnCreate(true)
pool.setTestTableName("SQL SELECT 1 FROM DUAL")
# setTestFrecuencySeconds is not soported by WLST objects
# so here is a workaround
cd(´/JDBCConnectionPool/´ + poolName)
set(´TestFrequencySeconds´, 300)
cd(´/´)
pool.addTarget(self.myServer)
def createXaPool(self):
self.createPool(MY_POOL_NAME, ´oracle.jdbc.xa.client.? OracleXADataSource´)
# Removes an element if it exists
def removeIfExists(self, name, type):
try:
mbean = home.getAdminMBean(name, type)
home.deleteMBean(mbean)
print ´Removed the ´ + type + ´: ´ + name
except InstanceNotFoundException, e:
print "Cannot remove " + name + ",type=" + type + " because ? it does not exist"
def removeXaPool(self):
self.removeIfExists(MY_POOL_NAME, "JDBCConnectionPool")
# The JDBC Connection Pool name
MY_POOL_NAME=´MyPool´
# the instance we are going to use
admin = AdminTool()
admin.connect()
administration.properties
host=127.0.0.1
port=7001
username=weblogic
password=weblogic
dbURL=jdbc:oracle:thin::1521:DATABASE
dbUsername=foo
dbPassword=bar
LoadProperties任务将administration.properties文件中的所有项转换成Jython变量。我们已经使用了Jython类的第一个方法来管理WebLogic服务器实例。还可以轻易将它扩展到创建和删除DataSources,这是一个JMS环境,甚至还可以扩展到安全领域。
MBean方法
前面我们已经看到的是创建和配置MBeans的一个方法(下一节会解释另一种方法)。不利的一面是必须知道支持的属性和方法,而WLST没有这些文档。我怎么去猜哪个方法可用呢?
噢,我想到的第一个方法是到config.xml文件或是Web控制台去找,并假设属性名称未改变。如果有一个不错的IDE,我们还可以打开Mbean接口类看看那里有些什么(它和Mbean的名称一样,以“Mbean”结束)。这不会显示代码,但是可以查到哪个方法可用。
我喜欢连接到http://e-docs.bea.com/wls/docs81/javadocs/index.html,查看weblogic.management.configuration包的内容。比如,如果我们找到ServerMBean类,就可以看到两个有趣的但是不太为人们所熟悉的方法isJDBCLoggingEnabled()和setJDBCLoggingEnabled()。我们可通过打开wlst交互shell来查看它们,如下所示:
wls:/mydomain/config> server=home.getAdminMBean(´myserver´, ´Server´)
wls:/mydomain/config> server.setJDBCLoggingEnabled(1)
wls:/mydomain/config> server.isJDBCLoggingEnabled()
1
(“home”是一个AdminMbeanHomeImpl类型的变量,可以像对任何其他Mbean一样研究;唯一的问题是因为它是一个内部类,所以没有javadoc可用。)
如果最后三个命令不好理解,不要担心。我们会在下一节介绍Shell。
命令行系统管理
系统管理员也可以通过使用交互式shell来手工管理WebLogic服务器实例。其优点是在试图修改系统配置时,不用事先知道Mbean接口。对这一部分,需要在classpath包含webLogic.jar、jython.jar以及wlst.jar,并启动主类weblogic.WLST,它是交互式控制台。
要记住这是Jython。引号和双引号用于字符串声明;实例化不需要新的运算符(事实上,这是一个语法错误);不需要分号,因为每行用回车结束;而且不必声明变量(la Unix shell脚本)。如果这还不够,请参考Python和WLST的文档。
我们需要开始连接到WebLogic服务器的实例。我们可以选择使用之前编写的AdminTool脚本,或者手工连接:
execfile(´AdminTool.py´)
admin.connect()
或
connect(´weblogic´, ´weblogic´, "t3://localhost:7001)
Connecting to weblogic server instance running at t3://127.0.0.1:7001 as
username weblogic ...
成功连接到属于“mydomain”域的Admin服务器“myserver”是系统输出,而且应采用编码的格式。
现在,我们可以开始好好玩一下了。对于WLST,JMX树可像UNIX文件系统一样进行遍历,在这里JMX Mbeans是目录而其属性是文件。在所有这些过程中要记住Python语法,并要记得WLST仍然不能分辨通配符。这就是为什么我们要省略大多数ls()输出的原因(参见清单5)。
清单5
wls:/mydomain/config> ls()
[...]
drw-JDBCConnectionPools
drw-JDBCDataSourceFactories
drw-JDBCDataSources
drw-JDBCMultiPools
drw-JDBCTxDataSources
[...]
wls:/mydomain/config> cd(´JDBCConnectionPools´)
wls:/mydomain/config/JDBCConnectionPools> ls()
drw-MyPool
wls:/mydomain/config/JDBCConnectionPools> cd(´MyPool´)
wls:/mydomain/config/JDBCConnectionPools/MyPool> ls()
[...]
-rw-TestConnectionsOnCreatetrue
-rw-TestConnectionsOnReleasefalse
-rw-TestConnectionsOnReservefalse
-rw-TestFrequencySeconds300
-rw-TestStatementTimeout-1
-rw-TestTableNameSQL SELECT 1 FROM DUAL
-r--TypeJDBCConnectionPool
-rw-URLjdbc:oracle:thin::1521:DATABASE
[...]
我们还可以对于单个cd(´/JDBCConnectionPools/MyPool´)命令深入到这个地步。WLST永远记得cmo(当前管理对象,Current Managed Object),即与我们正在浏览的当前“文件夹”相关的Mbean。因此,从实际角度来看这些命令是相当的:
wls:/mydomain/config/JDBCConnectionPools/MyPool> cmo
[Caching Stub]Proxy for mydomain:Name=MyPool,Type=JDBCConnectionPool
wls:/mydomain/config/JDBCConnectionPools/MyPool> pwd()
´/JDBCConnectionPools/MyPool´
现在,让我们改变一些随机属性(参见清单6)。记住Python没有布尔属性。服务器可返回真或假(既然它运行Java),但是不能赋这些值。然而,不用担心;如果通过WebLogic控制台查看它,布尔值1得到了服务器的正确解释。
清单 6
wls:/mydomain/config/JDBCConnectionPools/MyPool> set?(´TestFrequencySeconds´, 500)
wls:/mydomain/config/JDBCConnectionPools/MyPool> set(´TestConnectionsOnRelease´, 1)
wls:/mydomain/config/JDBCConnectionPools/MyPool> ls()
-rw-TestConnectionsOnCreatetrue
-rw-TestConnectionsOnRelease1
-rw-TestConnectionsOnReservefalse
-rw-TestFrequencySeconds500
-rw-TestStatementTimeout-1
-rw-TestTableNameSQL SELECT 1 FROM DUAL
-r-- TypeJDBCConnectionPool
-rw-URLjdbc:oracle:?thin::1521:DATABASE
[...]
wls:/mydomain/config/JDBCConnectionPools/MyPool> get(´TestConnectionsOn?Release´)
1
使用前一节关于“使服务器配置自动化”中介绍的相当技术,也可能得到了同样的结果。我发现这个方法对于系统管理员更简单,而第一个方法对于开发人员准备脚本则更简单。这只是适应不同类型的工具集:系统管理员更习惯于Unix Shell,而开发人员对于的Java的“味道”则感觉更为舒服。
管理服务器配置的例子:一个真实例子
需要了解那些烦人的JDBC调用内部是一种常见现象。有时人们真的希望能够看见WebLogic服务器和数据库之间对话,为什么它会见鬼地返回0行,或者轮廓性能,OK。用热插拔功能记录JDBC调用(而不仅是SQL,拜托了,还要记录参数)应该不错。想试一下吗?
首先,让我们下载p6spy JDBC驱动程序。它是一个JDBC包,可以记录任何经过它的东西。要配置它,将p6spy.jar和包含p6spy.properties的目录放到服务器classpath目录下(不要忘了这个目录,否则WebLogic会报告JAR文件不存在)。按照需要调整p6spy.properties。
我们想要到达的目的是创建两个Connection Pool(连接池),一个直接用Oracle JDBC驱动程序而另一个通过p6spy。然后,我们将修改数据源指向p6spy数据源而不重启服务器(如果我们相信Web控制台接口,这个修改无需重启)。
我们将通过执行之前开发出的管理脚本来开始:
wls:/(offline)> execfile(´AdminTool.py´)
Connecting to weblogic server instance running at t3://127.0.0.1:7001 as
username weblogic ...
成功连接到属于“mydomain”域的Admin服务器“myserver”,它也是系统输出并且应正确格式化。
我们现在可以创建连接池了。
wls:/mydomain/config> admin.createPool("P6SPY Connection Pool",
"com.p6spy.engine.spy.P6SpyDriver")
JDBCConnectionPool with name ´P6SPY Connection Pool´
has been created successfully.
在WebLogic控制台我们可看到以下显示(WebLogic日志行将只在将“debug to console”选项启用时才会显示):
<28-feb-2005 20H18´ GMT> <Info> <JDBC> <BEA-001132>
<Initialized statement cache of size "10"
for connection in pool "P6SPY Connection Pool".>
1109621928226|0|1|statement|SELECT 1 FROM DUAL|SELECT 1 FROM DUAL
1109621928242|0|1|statement|SELECT 1 FROM DUAL|SELECT 1 FROM DUAL
这显示连接池初始化以及新连接测试。我们将假设数据源还不存在。如果我们还清楚,应该已经预见到这一点并在AdminTool类创建了方法,但是,我们还是可通过清单7中所列的交互式shell来这么做。
清单 7
wls:/mydomain/config> datasource=create(´MyDS´, ´JDBCTxDataSource´)
JDBCTxDataSource with name ´MyDS´ has been created successfully.
wls:/mydomain/config> datasource.setJNDIName("MyDS")
wls:/mydomain/config> datasource.setPoolName("P6SPY Connection Pool")
wls:/mydomain/config> datasource.setEnableTwoPhaseCommit(true)
wls:/mydomain/config> datasource.addTarget(admin.myServer)
1
我们已经开始将数据源指向P6SPY连接池,因此,可以检查应用程序看看它真的记录了JDBC语句;用测试案例来尝试。现在,有两个方法可以禁止记录。既然在Jython变量中有数据源,我们就可以用“Java”的方式来做。
datasource.setPoolName(MY_POOL_NAME)
或者,采用如清单8所示的“system administrator”方法:
清单8
wls:/mydomain/config> cd (´JDBCTxDataSources´)
wls:/mydomain/config/JDBCTxDataSources> ls()
drw-MyDS
wls:/mydomain/config/JDBCTxDataSources> cd(´MyDS´)
wls:/mydomain/config/JDBCTxDataSources/MyDS> ls()
[...]
-rw-PoolNameMyPool
[...]
wls:/mydomain/config/JDBCTxDataSources/MyDS> set(´PoolName´, MY_POOL_?NAME)
结束语
WLST是一个能够推进应用程序服务器配置和远程维护的杰出工具。它还不支持用通配符查找/定位选项(对于一些并非不常见的情况,如有人需要查找某个配置选项但是想不起它的位置)。但是,当最后与WebLogic 9绑定后,它肯定会非常有用。
参考资料
原文出处
http://wldj.sys-con.com/read/48932.htm
作者简介 |
|
Ignacio Coloma 是InfoInnova的J2EE架构师。过去6年以来,他已经为电子银行、航空运输、电子政府以及消息处理系统开发了许多应用程序。目前,他正在用脚本语言扩展J2EE应用程序。 |
posted @
2005-09-28 18:49 逍遥草 阅读(4197) |
评论 (0) |
编辑 收藏
|
|
问题描述 在出现以下情况时怀疑服务器挂起:
- 服务器不响应新的请求。
- 请求超时。
- 请求处理的时间越来越长(其最终结果可能是挂起)。
- 通常,服务器挂起不会表现为服务器崩溃,但服务器挂起之后可能会崩溃。
|
故障排除 请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。
快速链接:
为什么发生此问题? 服务器挂起有多种原因(请参考服务器挂起的可能原因一节)。一般而言,服务器挂起是因为缺少某种资源。缺少资源会阻止服务器响应服务请求。例如,由于故障(死锁)或者大量请求的缘故,可能没有任何可用的执行线程来完成工作,所有执行线程都被占用或忙于处理以前的请求。
返回页首
服务器挂起的可能原因 |
主题 |
模式名称 |
链接 |
RMI、RJVM 响应 - 所有绑定线程等待 RJVM、RMI 响应。 |
EJB_RMI 服务器挂起 |
|
应用程序死锁 - 线程锁定资源 1,然后等待锁定资源 2。另一个线程锁定资源 2,然后等待锁定资源 1。 |
应用程序死锁导致服务器挂起 |
待定 |
线程全部被占用,没有线程可用于新工作。 |
线程占用导致服务器挂起 |
待定 |
垃圾回收花费太多时间。 |
垃圾回收导致服务器挂起 |
待定 |
servlet 时间的 JSP 错误设置,比如 PageCheckSeconds。 |
JSP 导致服务器挂起 |
待定 |
死锁造成 JDBC 挂起。 |
JDBC 中的服务器挂起 |
待定 |
(代码优化)过程中的 JVM 挂起类似于服务器挂起。 |
代码优化中服务器挂起 |
待定 |
在大量负载情况下 JSP 编译造成服务器挂起。 |
JSP 编译导致服务器挂起 |
待定 |
SUN JVM 错误,比如轻量型线程库。 |
Sun JVM 错误导致服务器挂起 |
待定 |
返回页首
基本步骤 当服务器挂起时,首先使用 java weblogic.Admin t3://server:port PING 来 ping 该服务器。如果服务器能够响应此 ping,则可能是应用程序正在挂起而不是服务器自身。
确保服务器确实正在挂起,而不是在做垃圾回收。若要验证挂起,启用 -verbosegc 重新启动服务器,然后将 stdout 和 stderr 重定向到一个文件中。当服务器停止响应时,可以判断它是正在收集无用信息还是确实挂起。
WebLogic Server 使用“Default”线程队列响应客户端服务请求。这些是在发生服务器挂起时应当检查的线程。下面是其中一个线程在 Thread Dump 中的形式示例。Execute Thread 14 正在等待任务。该线程调用的最后方法是 Object.wait()。 |
"ExecuteThread: '14' for queue: 'default'" daemon prio=5 tid=0x8b0ab30 nid=0x1f4 waiting on monitor [0x96af000..0x96afdc4] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:94) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:118) |
确定“Default”ExecuteThread 队列是否超载。利用控制台确定“Default”队列中的所有 ExecuteThreads 是否空闲。如果没有一个空闲,则应用程序可能需要一个更大的 ExecuteThread 数来配置。可以通过控制台更改该值,并将其保存在 config.xml 文件中。
如果执行队列有空闲线程,则可能没有分配足够的 Socket Reader 线程。缺省情况下,WebLogic Server 实例在启动时创建三个 Socket Reader 线程。如果群集系统在高峰期使用的 Socket Reader 线程超过三个,则增加 Socket Reader 线程的数量。
通常,Socket Reader 线程的数量应当较小。但是,如果 Weblogic Serve 充当正在挂起的服务器实例的客户端,则应当为每个 Weblogic Serve 配置一个线程。
如果使用 JDBC 连接池,确保池中已经配置的 JDBC 连接数量与同时请求(即执行线程)的数量相等。
返回页首
已知的 WebLogic 问题 JDBC 产生死锁问题的可能性存在。检查在 weblogic.log 开头找到的服务器的版本和 Service Pack 级别。然后对已经应用于服务器类路径的所有临时修补程序检查以上版本和 Service Pack 行。修补程序将指明已经解决了什么问题。
返回页首
收集 Thread Dump 进行 Thread Dump 的方法取决于安装挂起服务器实例的操作系统。有关在不同的操作系统上进行 Thread Dump 的信息,可以在以下网址中找到:http://e-docs.bea.com/wls/docs81/cluster/trouble.html#gc。
Unix 系统(Solaris、HP、AIX) 使用 kill .3 <weblogic process id> 创建诊断问题所需的 Thread Dump。确保在每个服务器上执行几次,每次间隔大约 5 到 10 秒,以帮助诊断死锁问题。为达到诊断目的,用 nohup 启动服务启进程(请参考解决方案 S-12292 和 S-15924)。
Windows、XP、NT 每个服务器需要 <Ctrl>-<Break> 来创建诊断问题所需的 Thread Dump。确保在每个服务器上执行几次,每次间隔大约 5 到 10 秒,以帮助诊断死锁问题。在 NT 上,在命令 shell 中输入 CTRL-Break。
Linux Linux 操作系统查看线程的方式不同于其它操作系统。该操作系统将每个线程视为一个进程。若要在 Linux 上进行 Thread Dump,查找通过其启动所有其它进程的进程 ID。使用命令:
- 若要获得根 PID,使用:
ps -efHl | grep 'java' **. **
使用一个作为字符串的 grep 参数(可在与服务器启动命令匹配的进程堆栈中找到该字符串)。如果 ps 命令还没有管道传送到另一个例程,则报告的第一个 PID 将是根进程。
- 使用 weblogic.Admin 命令 THREAD_DUMP
进行 Thread Dump 的另一种方法是使用 THREAD_DUMP admin 命令。此方法与正在运行服务器实例的操作系统无关。
java weblogic.Admin -url ManagedHost:8001 -username weblogic -password weblogic THREAD_DUMP
备注: 如果无法 ping 服务器实例,则不可以使用该命令。
如果正在使用的 JVM 是 Sun 开发的,则 Thread Dump 转为 stdout(标准输出文件)。Sun 已经增强了 JVM 1.3.1 和 1.4 之间的 Thread Dump 格式。若要获得 Sun JVM 1.4 的 Thread Dump 格式,将下列选项添加到启动 1.3.1 JVM 的 java 命令行中:
-XX:+JavaMonitorsInStackTrace
返回页首
Thread Dump 分析 分析服务器挂起的最有用的工具是一系列 Thread Dump。Thread Dump 提供关于每个线程在特定时刻正在执行什么操作的信息。一系列 Thread Dump(一般每隔 5 到 10 秒进行三个或更多 Thread Dump)可以帮助分析每个线程从一个 Thread Dump 到另一个 Thread Dump 过程中的状态变化或所缺少的变化。挂起服务器 Thread Dump 一般显示线程状态从第一个 Thread Dump 到最后一个 Thread Dump 中变化很小。
在 Thread Dump 中查看的内容 所有请求都通过 ListenThread 进入 WebLogic Server。如果 ListenThread 丢失,就无法接收任何工作,因此也无法完成任何工作。确认在 Thread Dump 中存在 ListenThread。ListenThread 应当在 socketAccept 方法中。下面示例说明监听线程 (Listen Thread) 的形式。 |
"ListenThread.Default" prio=10 tid=0x00037888 nid=93 lwp_id=6888343 runnable [0x 1a81b000..0x1a81b530]at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:353) - locked <0x26d9d490> (a java.net.PlainSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:439) at java.net.ServerSocket.accept(ServerSocket.java:410) at weblogic.socket.WeblogicServerSocket.accept(WeblogicServerSocket.java:24) at weblogic.t3.srvr.ListenThread.accept(ListenThread.java:713) at weblogic.t3.srvr.ListenThread.run(ListenThread.java:290) |
Socket Reader 线程接受来自监听线程队列的传入请求,并将该请求放入执行线程队列。如果 Thread Dump 中没有 Socket Reader 线程,则在某个地方存在导致 Socket Reader 线程消失的错误。应当始终保持至少有三个 Socket Reader 线程。一个 Socket Reader 线程一般用于轮询功能,另外两个用于处理请求。下面是一个 Thread Dump 示例中的 Socket Reader 线程。 |
"ExecuteThread: '2' for queue: 'weblogic.socket.Muxer'" daemon prio=10 tid=0x00036128 nid=75 lwp_id=6888070 waiting for monitor entry [0x1b12f000..0x1b12f530] at weblogic.socket.PosixSocketMuxer.processSockets(PosixSocketMuxer.java:92) - waiting to lock <0x25c01198> (a java.lang.String) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:32) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:178) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:151)
"ExecuteThread: '1' for queue: 'weblogic.socket.Muxer'" daemon prio=10 tid=0x00035fc8 nid=74 lwp_id=6888067 runnable [0x1b1b0000..0x1b1b0530]at weblogic.socket.PosixSocketMuxer.poll(Native Method) at weblogic.socket.PosixSocketMuxer.processSockets(PosixSocketMuxer.java:99) - locked <0x25c01198> (a java.lang.String) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:32) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:178) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:151)
"ExecuteThread: '0' for queue: 'weblogic.socket.Muxer'" daemon prio=10 tid=0x00035e68 nid=73 lwp_id=6888066 waiting for monitor entry [0x1b231000..0x1b231530] at weblogic.socket.PosixSocketMuxer.processSockets(PosixSocketMuxer.java:92) - waiting to lock <0x25c01198> (a java.lang.String) at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:32) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:178) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:151) |
|
posted @
2005-09-27 16:42 逍遥草 阅读(7037) |
评论 (0) |
编辑 收藏
在工作中碰到这样一个问题,weblogic正常启动后,connection可以自由获取,但是在运行一段时间后,也许几小时,也许几天,weblogic服务就宕掉了。结果就是无法获取connection,但是在weblogic的console上,connection pools-->Monitoring上显示的却是还有剩余。上网查到类似问题,但只有如下的回答,并没有真正说到问题所在啊。
statement是查询语句,connection是和数据库的连接.
释放顺序如下.
finally{
stmt.close();
conn.close();
}
对于系统中使用到比较耗费资源的东西,比如说:connection,jndi等等,往往是需要缓存,一次获得,重复使用的原则。
对于connection来说,它本身是一个接口,ojdbc14.jar或classes12.zip等等都实现了这个接口,实现的close方法大都是强制关闭。weblogic的连接池的实现不一样,它的close并不是真正的关闭而是返回给连接池。所以在程序的结尾处一定要记住返回给连接池。
代码如下
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
try{
//commit
}catch(Exception e){
//rollback;
throw e;
}finally{
if(conn!=null) conn.close();
if(rs!=null) rs.close();
if(stmt!=null) rs.close();
}
难道是statement没有释放,但是我已经释放了connection,这样不行?又或是我的connection pool size设置过小,但我已经改到200 了。不知道这个问题如何解决,头痛ing……
posted @
2005-09-27 10:19 逍遥草 阅读(778) |
评论 (2) |
编辑 收藏
第一句话:优秀是一种习惯
这句话是古希腊哲学家亚里士多德说的。如果说优秀是一种习惯,那么懒惰也是一种习惯。人出生的时候,除了脾气会因为天性而有所不同,其他的东西基本都是后天形成的,是家庭影响和教育的结果。所以,我们的一言一行都是日积月累养成的习惯。有的人形成了很好的习惯,有的人形成了很坏的习惯。所以我们从现在起就要把优秀变成一种习惯,使我们的优秀行为习以为常,变成我们的第二天性。让我们习惯性地去创造性思考,习惯性地去认真做事情,习惯性地对别人友好,习惯性地欣赏大自然。
第二句话:生命是一种过程
事情的结果尽管重要,但是做事情的过程更加重要,因为结果好了我们会更加快乐,但过程使我们的生命充实。人的生命最后的结果一定是死亡,我们不能因此说我们的生命没有意义。世界上很少有永恒。恋爱中的人们每天都在信誓旦旦地说我会爱你一辈子,这实际上是不真实的。最真实的说法是:"我今天,此时此刻正在真心地爱着你。"明天也许你会失恋,失恋后我们会体验到失恋的痛苦。这种体验也是丰富你生命的一个过程。
第三句话:两点之间最短的距离并不一定是直线
在人与人的关系以及做事情的过程中,我们很难直截了当就把事情做好。我们有时需要等待,有时需要合作,有时需要技巧。我们做事情会碰到很多困难和障碍,有时候我们并不一定要硬挺、硬冲,我们可以选择有困难绕过去,有障碍绕过去,也许这样做事情更加顺利。大家想一想,我们和别人说话还得想想哪句话更好听呢。尤其在中国这个比较复杂的社会中,大家要学会想办法谅解别人,要让人觉得你这个人很成熟,很不错,你才能把事情做成。
第四句话:只有知道如何停止的人才知道如何加速
我在滑雪的时候,最大的体会就是停不下来。我刚开始学滑雪时没有请教练,看着别人滑雪,觉得很容易,不就是从山顶滑到山下吗?于是我穿上滑雪板,哧溜一下就滑下去了,结果我从山顶滑到山下,实际上是滚到山下,摔了很多个跟斗。我根本就不知道怎么停止、怎么保持平衡。经过反复练习,我终于学会了在任何坡上停止、滑行、再停止。这个时候我就发现自己会滑雪了,就敢从山顶高速地往山坡下冲。因为我知道只要我想停,一转身就能停下来。只要你能停下来,你就不会撞上树、撞上石头、撞上人,你就不会被撞死。因此,只有知道如何停止的人,才知道如何高速前进。
第五句话:放弃是一种智慧,缺陷是一种恩惠
当你拥有六个苹果的时候,千万不要把它们都吃掉,因为你把六个苹果全都吃掉,你也只吃到了六个苹果,只吃到了一种味道,那就是苹果的味道。如果你把六个苹果中的五个拿出来给别人吃,尽管表面上你丢了五个苹果,但实际上你却得到了其他五个人的友情和好感。以后你还能得到更多,当别人有了别的水果的时候,也一定会和你分享,你会从这个人手里得到一个橘子,那个人手里得到一个梨,最后你可能就得到了六种不同的水果,六种不同的味道,六种不同的颜色,六个人的友谊。人一定要学会用你拥有的东西去换取对你来说更加重要和丰富的东西。所以说,放弃是一种智慧。做人最大的乐趣在于通过奋斗去获得我们想要的东西,有缺点意味着我们可以进一步完美,有匮乏之处意味着我们可以进一步努力。
posted @
2005-09-23 20:30 逍遥草 阅读(196) |
评论 (0) |
编辑 收藏