`
laorer
  • 浏览: 435690 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转]使用Ant管理配置Weblogic

    博客分类:
  • j2EE
阅读更多
一把老骨头 发表于 2006-1-3 14:10:00
http://www.oioj.net/blog/user1/6822/archives/2006/207589.shtml

 

摘要:在一个使用weblogic管理项目中,可能有众多的配置。每个人需要建立domain,需要发布程序,配置Connection Pool,Data Source,JMS等程序中需要的资源,我们不得不为大家准备一个文档,每个人按照文档操作自己的Weblogic,这样不仅繁琐,也容易出错,通过建立这些简单的ant任务,每个人就可以省去这样的步骤。另外,在程序上机发布的时候,我们通常不得不为客户说明配置的过程,而使用这样的Ant任务,我们可以建立简单的安装程序,将程序自动安装配置好,并且生成启动脚本。

读者背景:本文需要读者了解Ant的一些基本知识,可以自己安装Ant,需要了解WEBLOGIC JMX的使用,也要会配置一些windows的批处理文件和环境变量,本文全部使用windows环境,在其它环境下只需作小部分的修改。

目录:
0,环境介绍
1,建立准备的环境与初始化的Ant任务
2,使用wlserver任务建立Domain
3,配置Connection Pool和一个DataSource
4,发布程序
5,把这些整合起来
6,最佳实践
7,一些问题
8,参考文档


首先要介绍Weblogic的一些Ant任务,关于Weblogic配置,有wlserver和wlconfig两项任务。wlserver用来配置domain和server,启动server,此后可以使用wlconfig配置自己生成domain。


0,环境介绍

操作系统:Windows XP sp1
Weblogic:weblogic8.1 server sp3
我的BEA安装在D:/bea,Weblogic在D:/bea/weblogic81
所以:
beahome=D:/bea
wlhome=D:/bea/weblogic81


1,建立准备的环境与初始化的Ant任务

1.1 准备可以运行的环境
根据weblogic的admin_ref文档中说明,使用wlserver和wlconfig,必须首先运行WL_HOMEserverbin下的setWLSEnv.cmd(UNIX下是setWLSEnv.sh),我开始以为并不必要的,但是经过验证发现wlserver可以指定classpathref参数,所以可以不必从系统环境变量中读取,但wlconfig却不可以使用classpathref参数,而只可以从环境变量中得到参数,所以在运行ant的命令之前确实需要用setWLSEnv.cmd处理一下环境变量,为此可以写了个最简单的脚本。

首先介绍一下目录结构:
│ build.properties
│ build.xml
│ projectcmd.bat
│ readme.txt

└─web
│ index.jsp
│ index.jsp.bak

└─WEB-INF
web.xml

build.properties存放一些需要更改的变量值,build.xml是Ant的build文件,web是我们需要发布的Web Application的目录,这里做的非常简单,只包括一个简单的jsp。为了能够从一个已经设定好环境变量的命令行窗口开始我们写下这个脚本,然后存放为projectcmd.bat,内容为:

start D:/bea/weblogic81/server/bin/setWLSEnv.cmd

这样的话,在Windows下直接点击projectcmd.bat就会弹出一个新窗口,然后我们得到一个准备好的命令行窗口,输出如下:

CLASSPATH=d:beaJDK141~1libtools.jar;d:beaWEBLOG~1serverlibweblogic_sp.j
ar;d:beaWEBLOG~1serverlibweblogic.jar;d:beaWEBLOG~1serverlibojdbc14.ja
r;D:tooljavamysqlmysql-connector-java-3.0.12-production-bin.jar

PATH=d:beaWEBLOG~1serverbin;d:beaJDK141~1jrebin;d:beaJDK141~1bin;C:W
INDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;D:BorlandJBuilder2005thir
dpartyantbin;d:beaWEBLOG~1serverbinoci920_8

Your environment has been set.
E:projectleon>

在这个窗口下就可以直接运行我们后面使用的Ant命令。


1.2 Ant的初始化任务

  1. <target name="init" description="建立需要的任务">  
  2. <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer"/>  
  3. <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig"/>  
  4.   
  5. <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy"/>  
  6. </target>  


这三个任务,就是我们整个文章中需要的weblogic任务。
在运行ant init后,如果没有错误,说明三个任务,已经建立起来,注意我们没有指定classpathref,因为环境变量中已经有了。

1.3设置build.properties的基本配置
修改开头的两项参数为自己的机器安装的参数

beahome=D:/bea
wlhome=D:/bea/weblogic81

 

2,使用wlserver任务建立Domain和Server

为建立自己的运行环境,首先必须建立自己的Domain及相应的Server,wlserver任务为我们提供机会可以自动化这个过程。

xml 代码
  1. <target name="new-server" depends="init" description="初始化Domain和Server">  
  2. <delete dir="${server.dir}"/>  
  3. <mkdir dir="${server.dir}"/>  
  4. <wlserver host="${server.host}"    
  5. port="${server.port}"    
  6. username="${server.username}"    
  7. password="${server.password}"    
  8. dir="${server.dir}"  
  9. action="start"  
  10. beahome="${beahome}"  
  11. weblogichome="${wlhome}"  
  12. generateConfig="true"  
  13. servername="${server.name}"  
  14. domainname="${domain.name}"  
  15. />  
  16. </target>  
  17.   

里面所有的变量定义在build.properties

domain.name=antdomain

server.host=localhost
server.port=7001
server.username=weblogic
server.password=weblogic
server.name=antserver

server.dir=./myserver

这些参数的意思显而易见,server.dir是将要建立的domain的目录,这里有一些语义上矛盾,我们注意些就可以了。username和password是将来要建立的admin server的管理员用户与密码,这里没有使用加密的方式,是因为简单的原因,后面再说加密的方式。

generateConfig="true"这样表示我们是建立一个新的domain。

action="start"表示是开始server。

还有一个参数是productionmodeenabled,也就是是否为生产模式,可以设为true或是false,默认识开发模式。

在以上参数下运行,在根目录生成myserver目录
├─antserver
│ ├─.internal
│ ├─.wlnotdelete
│ │ └─extract
│ │ ├─antserver_console_console
│ │ │ ├─jarfiles
│ │ │ └─public
│ │ ├─antserver_uddiexplorer_uddiexplorer
│ │ │ ├─jarfiles
│ │ │ └─public
│ │ ├─antserver_uddi_uddi
│ │ │ ├─jarfiles
│ │ │ │ └─WEB-INF
│ │ │ │ └─lib
│ │ │ └─public
│ │ ├─antserver_wl_management_internal1_wl_management_internal1
│ │ │ ├─jarfiles
│ │ │ └─public
│ │ └─antserver_wl_management_internal2_wl_management_internal2
│ │ ├─jarfiles
│ │ └─public
│ └─ldap
│ ├─backup
│ ├─conf
│ ├─ldapfiles
│ ├─log
│ └─replicadata
├─applications
│ └─.wlnotdelete
└─configArchive

这个目录非常像通过Configuration Wizard生成的domain目录,要简单一些,但对于开发已经足够了。我们可以使用myserver目录下生成的startantdomain.cmd来启动我们生成的domain,我们后面的一些操作也需要这个server启动中运行,有些操作则需要关掉这个server。

一个小问题,在我的环境下会出现以下这个错误:

[wlserver] java.io.IOException: CreateProcess: chmod +x startantdomain.sh error=2

这是个小Bug,这条语句必须在UNIX环境下才能运行,用来赋予startantdomain.sh执行权,在Windows环境下当然是错误,希望Bea在下个版本运行这个命令前判断一下系统环境。


3,配置Connection Pool和一个DataSource

3.1 基本配置

domain和server已经配置好了,我们需要配置一个Connection Pool和一个DataSource,所以我们建立一个新的任务--doconfig。

xml 代码
  1. <target name="doconfig" depends="init">    
  2. <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">  
  3. <query domain="${domain.name}" type="Server" name="${server.name}" property="fullservername"/>    
  4. </wlconfig>  
  5.   
  6.   
  7. <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">  
  8. <create type="JDBCConnectionPool" name="${database.poolname}">  
  9. <set attribute="CapacityIncrement" value="1"/>  
  10. <set attribute="DriverName" value="/blog/${database.driver.name}"/>  
  11. <set attribute="InitialCapacity" value="1"/>  
  12. <set attribute="MaxCapacity" value="10"/>  
  13. <set attribute="Password" value="/blog/${database.password}"/>  
  14. <set attribute="Properties" value="user=root"/>  
  15. <set attribute="RefreshMinutes" value="0"/>  
  16. <set attribute="ShrinkPeriodMinutes" value="15"/>  
  17. <set attribute="ShrinkingEnabled" value="true"/>  
  18. <set attribute="TestConnectionsOnRelease" value="false"/>  
  19. <set attribute="TestConnectionsOnReserve" value="false"/>  
  20. <set attribute="URL" value="/blog/${database.driver.url}"/>  
  21. <set attribute="Targets" value="${fullservername}"/>  
  22. </create>    
  23. <create type="JDBCTxDataSource" name="${datasource.name}">  
  24. <set attribute="JNDIName" value="/blog/${datasource.jndiname}"/>  
  25. <set attribute="PoolName" value="/blog/${database.poolname}"/>  
  26. <set attribute="Targets" value="${fullservername}"/>  
  27. </create>    
  28. </wlconfig>  
  29. <echo message="${fullservername}"/>  
  30. </target>  
  31.   

对应的build.properties如下

database.poolname=pool
database.driver.name=com.mysql.jdbc.Driver
database.driver.url=jdbc:mysql://localhost:3306/opencms
database.username=root
database.password=

datasource.jndiname=leondatasource
datasource.name=leondatasource

通过运行Ant doconfig的后,就可以在程序中根据datasource.jndiname来访问datasource了。

但我们要注意一些问题,运行ant doconfig的时候,我们必须保证我们目标的Server已经启动,就是运行myserver下的startantdomain.cmd启动的server。对于wlconfig命令的参数,url没有什么问题,将配置读过来就行了(用户与密码可以不写,后面说明),wlconfig任务不支持classpathref参数,所以我们不得不在开始的时候使用setWLSEnv.cmd。

我们这里要使用mysql的JDBC类库,我们可以在环境变量加入这么一条:

CLASSPATH=D:tooljavamysqlmysql-connector-java-3.0.12-production-bin.jar

也可以将类似的语句加到setWLSEnv.cmd,但这样还需要修改生成的启动脚本加入对应的CLASSPATH。这给我们的工作带来了些麻烦,希望以后BEA能够改进wlconfig任务。我们也要建立好database.driver.url注明的数据库,因为配置Connection Pool需要检测数据库的连通性。

 

wlconfig有许多子任务,有create,delete,set,get,query,可以访问或是修改Domain的信息。

这里还有个小技巧就是为什么要使用query子任务,这是因为下面两个create子任务的参数Targets需要一个完全的server名字。我们使用:

xml 代码
  1. <echo message="${fullservername}"/>  



打印信息如下:

antdomain:Name=antserver,Type=Server

只有使用这个参数,我们才能确保我们的Connection Pool和一个DataSource能够绑定到我们的server上。

当运行结束后,如果没有错误,说明已经成功了,这时候到console下察看就会看到生成的Connection Pool和一个DataSource。


3.2 让配置可以重复执行
不过上面这部分也有些问题,因为只能执行一次,在执行第二次时就会出现错误,所以我们必须删除旧的,然后重新配置。这时需要使用Ant的逻辑判断能力。

更改后的build.xml相应部分如下:

xml 代码
  1.   
  2. <target name="doconfig" depends="init">    
  3. <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">  
  4. <query domain="${domain.name}" type="Server" name="${server.name}" property="fullservername"/>  
  5.   
  6.   
  7. <query domain="${domain.name}" type="JDBCConnectionPool" name="${database.poolname}" property="pool"/>  
  8. <query domain="${domain.name}" type="JDBCTxDataSource" name="${datasource.name}" property="datasource"/>    
  9. </wlconfig>  
  10.   
  11. <antcall target="cleardatasource"/>  
  12. <antcall target="clearpool"/>    
  13.   
  14. <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">  
  15. <create type="JDBCConnectionPool" name="${database.poolname}">  
  16. <set attribute="CapacityIncrement" value="1"/>  
  17. <set attribute="DriverName" value="/blog/${database.driver.name}"/>  
  18. <set attribute="InitialCapacity" value="1"/>  
  19. <set attribute="MaxCapacity" value="10"/>  
  20. <set attribute="Password" value="/blog/${database.password}"/>  
  21. <set attribute="Properties" value="user=root"/>  
  22. <set attribute="RefreshMinutes" value="0"/>  
  23. <set attribute="ShrinkPeriodMinutes" value="15"/>  
  24. <set attribute="ShrinkingEnabled" value="true"/>  
  25. <set attribute="TestConnectionsOnRelease" value="false"/>  
  26. <set attribute="TestConnectionsOnReserve" value="false"/>  
  27. <set attribute="URL" value="/blog/${database.driver.url}"/>  
  28. <set attribute="Targets" value="${fullservername}"/>  
  29. </create>    
  30. <create type="JDBCTxDataSource" name="${datasource.name}">  
  31. <set attribute="JNDIName" value="/blog/${datasource.jndiname}"/>  
  32. <set attribute="PoolName" value="/blog/${database.poolname}"/>  
  33. <set attribute="Targets" value="${fullservername}"/>  
  34. </create>    
  35. </wlconfig>  
  36. <echo message="${fullservername}"/>  
  37. </target>  
  38.   
  39.   
  40. <target name="clearpool" if="pool">  
  41. <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">  
  42. <delete mbean="${pool}"/>  
  43. </wlconfig>  
  44. </target>  
  45. <target name="cleardatasource" if="datasource">  
  46. <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">  
  47. <delete mbean="${datasource}"/>  
  48. </wlconfig>  
  49. </target>  
  50.   

我们增加了两个target,两个query和两个antcall。
我们首先使用query监测是否这两个对象已经建立,如果已经建立,则我们的pool或是datasource就可以被赋上值,否则这两项就会为空值,然后我们运行antcall来运行cleardatasource和clearpool任务,而这两个任务要执行,都有各自的条件,就是if后面的部分,只有条件被赋值也就是存在着两个对象时才执行清除工作。

4,发布程序

现在已经配置好了需要的资源,我们可以直接发布我们的Web Application了。
我们建立一个新的target:

<target name="deploy">
<wldeploy action="deploy"
source="${webapp.source}"
name="${webapp.name}"
user="${server.username}"
password="${server.password}"
verbose="true"
adminurl="t3://${server.host}:${server.port}"
debug="true"
targets="${server.name}"/>
</target>

相应的build.properties

webapp.name=ant
webapp.source=web

所有的参数一目了然,webapp.source表示希望发布的目录或者是WAR或其他包,运行后我们就可以使用浏览器访问相应的url。这时候发布的程序是nostatge方式,也就是直接使用我们指定的目录,当然我们也可以使用参数nostage=false,将发布的程序拷贝到对应的stage。

action还有redeploy,undeploy,redeploy,stop,start,我们这里并不需要,这里不作介绍,但我们可以轻易的加入到我们的build文件中,但在开发情况下,并不十分需要,有兴趣的话可以自己尝试使用。

5,把这些整合起来

我们希望开发者在得到这个工作目录后能够最快的开始工作,我们可以修改new-server任务。

xml 代码
  1. <target name="new-server" depends="init" description="初始化Domain和Server">  
  2. <delete dir="${server.dir}"/>  
  3. <mkdir dir="${server.dir}"/>  
  4. <wlserver host="${server.host}"    
  5. port="${server.port}"    
  6. username="${server.username}"    
  7. password="${server.password}"    
  8. dir="${server.dir}"  
  9. action="start"  
  10. beahome="${beahome}"  
  11. weblogi
分享到:
评论
2 楼 wubo19842008 2008-11-25  
在启动domain 的时候 报如下错误:
java.io.IOException: Cannot bind to URL [weblogic.management.mbeanservers.runtime]: javax.naming.NamingException: PROVIDER_URL not set

请问是什么错误?
1 楼 laorer 2007-09-17  
5,把这些整合起来

我们希望开发者在得到这个工作目录后能够最快的开始工作,我们可以修改new-server任务。
<target name="new-server" depends="init" description="初始化Domain和Server">
<delete dir="${server.dir}"/>
<mkdir dir="${server.dir}"/>
<wlserver host="${server.host}" 
port="${server.port}" 
username="${server.username}" 
password="${server.password}" 
dir="${server.dir}"
action="start"
beahome="${beahome}"
weblogichome="${wlhome}"
generateConfig="true"
servername="${server.name}"
domainname="${domain.name}"
/>
<antcall target="doconfig"/>
<antcall target="deploy"/>
</target>

我们添加了两个antcall,让server在建立好后,把环境和程序也发布完成,这样我们在得到我们的工作目录后,只需要配置一下,beahome和weblogichome,然后配置一下jdbc,然后运行ant new-server,我们的工作环境已经建立好了,可以马上开始自己的工作。

6,最佳实践

6.1 开发模式

在使用这样的Ant配置后,我们的开发就是这样开始的:

1)软件配置人员做好项目的基本内容,分配好目录,配置build.properties文件中的公用部分。
2)软件配置人员把项目提交到CVS或是其他版本控制工具。
3)开发程序员从版本控制工具得到项目文件。
4)程序员修改build.properties,然后运行ant new-server,就可以开始程序的开发了。

6.2 产品模式

在项目发布到产品环境下我们的工作目标有所改变,通常我们有许多的性能参数需要调整,繁琐的修改会很麻烦,也不适合长久的保存。

1)实施人员配置好build.properties文件中的资源和性能参数。
2)然后在需要实施的机器上运行执行
3)产品直接可以使用了

在集群环境下,以上繁琐的配置会显的更重要。

7,总结和一些问题

wlserver和wldeploy任务是不需要指定username和password的,但这需要相应的domain目录下有boot.properties文件,所以我们实际使用的时候,在生成domain和server后,为了保密,我们就可以把build.perperties中的username和password去掉,这样别人就无法知道密码。

希望Bea能够加强这几个任务,现在还有些不方便的地方,尤其是关于CLASSPATH部分,我们还不太容易做到完全的自动化。

附带的源代码在配置好beahome和wlshome就可以用了,但关于数据库的部分请自己调整,否则这部分可能失败。


8,参考文档

1)weblogic admin_ref文档:包括wlserver和wlconfig的介绍说明。
2)weblogic deployment文档:包括wldeploy的说明。
3)weblogic JMX文档:从这里查询所有的MBean名称,类型。
4)Manning - Java Development with Ant:查询Ant任务以及一些其他特性。
5)Administration Console Online Help:关于boot.properties的使用。

下载源代码:leon.zip

关于作者:

sdj21(dev2dev ID),软件工程师,email:sdj21@sina.com,sundaijun@126.com

相关推荐

    ant-weblogic.jar.zip

    这个JAR文件允许开发者在Ant脚本中执行对WebLogic的各种操作,如启动、停止、部署、卸载应用等,极大地简化了WebLogic环境下的应用生命周期管理。 当我们解压这个zip文件,会发现两个主要的组成部分:ant-weblogic....

    ant-weblogic-1.6.jar.zip

    本文将深入探讨它们之间的结合,特别是通过`ant-weblogic-1.6.jar.zip`这个压缩包,了解如何利用Ant来管理WebLogic的部署和生命周期操作。 `ant-weblogic-1.6.jar`是专门为Ant设计的扩展库,它提供了与WebLogic ...

    ant-weblogic-1.6.2.jar.zip

    使用`ant-weblogic-1.6.2.jar.zip`时,开发者需要在Ant构建脚本中配置WebLogic的相关属性,如服务器地址、端口、用户名和密码等。一旦配置完成,就可以利用Ant的任务来执行各种操作,例如: 1. 部署应用程序:`...

    weblogic下ant部署的demo

    在这个Demo中,`build.xml`可能包含了配置WebLogic连接信息、指定应用程序的源路径、打包配置、部署任务等元素。 5. **build.properties**:这是一个属性文件,通常包含构建过程中使用的变量,如服务器URL、用户名...

    ant-weblogic-1.6.4.jar.zip

    本文将围绕"ant-weblogic-1.6.4.jar.zip"这一主题,深入探讨其在Ant与WebLogic集成中的作用以及如何使用。 首先,"ant-weblogic-1.6.4.jar"是专门为Ant设计的一个任务库,它提供了对WebLogic Server的直接支持。这...

    ant-weblogic-1.6.3.jar.zip

    总结来说,"ant-weblogic-1.6.3.jar.zip"是一个用于简化Ant与WebLogic集成的工具,它扩展了Ant的功能,使得开发者能够更加高效地管理和部署Java应用到WebLogic Server。理解和掌握这个插件的使用,对于提高Java EE...

    ant-weblogic-1.6.5.jar.zip

    使用ant-weblogic-1.6.5.jar时,开发者需要在Ant构建脚本(build.xml)中引入这个插件,并配置相关的目标任务。例如,可以定义一个部署应用的任务,指定WebLogic服务器的位置、目标域、应用程序的WAR或EAR文件路径等...

    weblogic-ant相关

    通过上述分析可以看出,使用Ant来部署WebLogic Server应用时,需要明确指定服务器的启动参数、路径以及操作类型。这种方式不仅能够提高部署效率,还能确保部署过程的一致性和可靠性。开发者可以根据具体需求调整这些...

    weblogic管理指南

    配置WebLogic Server涉及设置服务器实例的属性,如内存分配、线程池大小、网络连接等。集群配置则允许多个服务器实例共享应用和服务,提供高可用性和负载均衡。管理员可以通过定义集群内的服务器组来实现故障切换和...

    WebLogic Server 管理任务自动化

    除了WLST,还有其他技术可以用于自动配置WebLogic Server域: - **WLST脱机版**:它允许在没有连接到运行的WebLogic Server的情况下新建或更新域,其功能与Configuration Wizard相当。 - **WebLogic Server Ant任务...

    weblogic

    综上所述,WebLogic 7的使用与配置涉及到多个方面,从基础的安装配置到高级的部署管理,都需要一定的技术知识和实践经验。通过上述指南,可以更深入地理解WebLogic服务器的工作原理及其在企业级应用开发和部署中的...

    Weblogic配置视频

    5. **部署应用**:WebLogic支持多种方式部署应用,如使用Admin Console、`WLST`(WebLogic Scripting Tool)或者Ant脚本。部署时需要指定应用的WAR、EAR或JAR文件,设置部署的上下文根、启动参数等。 6. **安全管理**...

    weblogic自学全套教程

    WebLogic支持多种部署方式,如使用控制台、命令行或者Ant脚本。将WAR、EAR或EJB JAR文件上传到部署区域,设置相关部署属性后,可以进行部署。部署完成后,可以在控制台查看应用状态和性能指标。 四、WebLogic集群...

    AIX下的Weblogic安装

    配置WebLogic的安全设置,包括SSL、用户认证和授权、角色和权限分配。这可以通过管理控制台或者XML配置文件实现。 10. **故障排查**: 在AIX环境下,遇到问题时,查看WebLogic的日志文件(如`&lt;domain_home&gt;/logs/...

    WebLogic的配置及其使用方法0922

    7. **网络配置**:WebLogic使用监听器(Listeners)接收客户端请求。配置监听器包括设置端口、协议(HTTP/HTTPS/TCP)以及SSL证书。还可以配置数据源、JMS队列和主题,以实现与数据库和消息传递系统的连接。 8. **...

    WebLogic的安装与使用

    #### 五、配置WebLogic的数据源 1. **拷贝数据库驱动**: - 将 MySQL 数据库驱动(如 `mysql-connector-java-3.1.13-bin.jar`)拷贝到 `WL_HOME/server/lib` 目录下。 - 修改 `setDomainEnv.cmd` 文件中的 `PRE_...

    weblogic使用手册中文版

    总的来说,WebLogic使用手册中文版提供了全面的指导,无论你是初次接触还是有经验的开发者,都能从中受益,更好地管理和利用这个强大的Java EE应用服务器。通过深入学习和实践,你可以有效地提升WebLogic Server的...

Global site tag (gtag.js) - Google Analytics