czmchen

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  17 随笔 :: 0 文章 :: 24 评论 :: 0 Trackbacks

2009年6月13日 #

web.xml加入
<taglib>
    <taglib-uri>/WEB-INF/c.tld</taglib-uri>
    <taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>

c.tld一般在jstl JAR里面可以找到!

在JSP中加入文件头
<%
@ taglib  uri="/WEB-INF/c.tld" prefix="c"%>
<%@ page isELIgnored="false" %>

接着就可以使用EL表达式了
posted @ 2010-04-19 17:33 陈周敏 阅读(570) | 评论 (0)编辑 收藏

SQL语句:
1 select * from tableName where tableName.id in (select max(tableName.id) from tableName group by tableName.name having count(tableName.id) >1 )


posted @ 2010-04-15 16:23 陈周敏 阅读(281) | 评论 (0)编辑 收藏

标记下,总结下经验


select清空option
1 document.getElementById("type").options.length = 0;
select创建option
1 
2 function addOption(objSelect,optionVal,optionText)      {
3                 var   _o = document.createElement("option"); 
4                  _o.text = optionText;
5                  _o.value = optionVal;
6                  objSelect.add(_o);
7  }
8 


posted @ 2010-04-06 17:52 陈周敏 阅读(216) | 评论 (0)编辑 收藏

由于开发的需要,要用到xfire,对于开发我比较关心的是安全和速度!所以就找了xfire中的ws-security,利用它的安全证书和key,安全足够了

先到网上下载最新版的xfire,一般都去官方网站下载,了解下详情!其官网为http://xfire.codehaus.org
现在最新版为1.2.6,把xfire-all-1.2.6.jar xfire-distribution-1.2.6.zip下载

准备前,先看看ws-securitye的步骤,在http://xfire.codehaus.org/WS-Security里面可以看到,它提示我们installed Unlimited Strength Jurisdiction Policy Files,我就在http://java.sun.com/j2se/1.5.0/download.jsp里面下载两个包,因为我安装的是jdk1.6最新版,在http://java.sun.com/j2se/1.5.0/download.jsp最下面的Other Downloads的Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 5.0,点击下载,下载下来后,按照里面的步骤,把这两个jar放到
Java/jre6/lib/security里面,修改java.security,把
security.provider.6=com.sun.security.sasl.Provider改为
security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
其效果为
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
#security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI



准备工作做好后,解压xfire-distribution-1.2.6.zip,然后你会看到xfire-1.2.6这个文件夹,进去,你会看到有个examples文件夹,再进去,你就发现很多demo啦,在这里就找到了ws-security的demo

启动Myeclipse,看到里面的.classpath和.project文件,这个是eclipse的项目!用myeclipse打开,你发现都不正确,这些错误我就不理!

新建一个Web Progect项目,项目名随你命名。设置下该项目,点击该项目,右键,properties,找到Java Compiler,修改项目的jdk为1.5以上(里面用到的有注入)!解压xfire-distribution-1.2.6.zip,进入ws-security文件夹下,进入src下,再进入main的文件夹,把里面的文件全部都拷贝到你新建的项目的src下。点中该项目,右键,新建Source Folder,命名为test。后退,找到test的文件夹,把里面的文件全部拷贝到项目test的文件夹下。后退,再把web-inf里面的web.xml拷贝到项目里面,替换。最后在项目中加入jar,在xfire-1.2.6根文件夹下面有个lib,把这些lib全部放到项目的web-inf下的lib文件夹中,把xfire-all-1.2.6.jar也加入到项目中。整个项目的结构为:



生成key:在ws-security根目录下有个keys的文件夹,双击进去,运行generateServerKey.bat,将默认的key生成。里面的参数让你们研究,很好用(上面我跳过不安装j2se1.4就是因为有这个)!生成后,将serverKey.rsa和serverStore.jks扔到META-INF\xfire下,有个相同的那就替换,clientStore.jks同理

修改服务器参数:在org.codehaus.xfire.client下的BookClient.java,把变量SERVICE_NAMESPACE的值改为
http://localhost:端口号/上下文路径/BookService,下面的都同理。要修改到的文件META-INF\xfire下的services.xml。记得把http://xfire.codehaus.org修改为http://localhost:端口号/上下文路径/BookService。因为http://xfire.codehaus.org不开放那些接口


修改完毕后,把项目部署到tomcat,启动服务器后,org.codehaus.xfire.client下运行BookClientEnc.java
。运行后会报下面的错误
Running client : Encryption Client
Looking 
for isbn : 0123456789 .Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xml/utils/URI$MalformedURIException
    at org.apache.ws.security.message.WSSecEncrypt.doEncryption(WSSecEncrypt.java:
407)
    at org.apache.ws.security.message.WSSecEncrypt.doEncryption(WSSecEncrypt.java:
399)
    at org.apache.ws.security.message.WSSecEncrypt.encryptForInternalRef(WSSecEncrypt.java:
306)
    at org.apache.ws.security.message.WSSecEncrypt.build(WSSecEncrypt.java:
264)
    at org.apache.ws.security.action.EncryptionAction.execute(EncryptionAction.java:
62)
    at org.apache.ws.security.handler.WSHandler.doSenderAction(WSHandler.java:
192)
    at org.codehaus.xfire.security.wss4j.WSS4JOutHandler.invoke(WSS4JOutHandler.java:
158)
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:
131)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:
79)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:
114)
    at org.codehaus.xfire.client.Client.invoke(Client.java:
336)
    at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:
77)
    at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:
57)
    at $Proxy0.findBook(Unknown Source)
    at org.codehaus.xfire.client.BookClient.executeClient(BookClient.java:
63)
    at org.codehaus.xfire.client.BookClientEnc.main(BookClientEnc.java:
23)
Caused by: java.lang.ClassNotFoundException: org.apache.xml.utils.URI$MalformedURIException
    at java.net.URLClassLoader$
1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
     
16 more

这是因为你还没把xalan.jar加入去,到http://www.apache.org/dyn/closer.cgi/xml/xalan-j 下载最新版
,现在最新去到2_7_1,找到xalan-j_2_7_1-bin.zip,把其下载后,添加xalan.jar到项目

再运行,如果出现下面的结果,那就正常啦
Running client : Encryption Client
Looking for isbn : 0123456789 ....Using XFire : Dan Diephouse


我的做好的示例文件在http://www.blogjava.net/Files/czmchen/ws-security.rar可以下载,下载后要做的事情就是把jar按上面的方法加进去,因为jar太大了,上传不上!还有要改下tomcat的端口为8001,再部署项目

posted @ 2010-01-15 09:51 陈周敏 阅读(1566) | 评论 (0)编辑 收藏

进入weblogic后台配置数据库连接池。因为我的项目数据库是ORACLE,那就以Oracle的配置作为示例:

我的示例weblogic是8.x,其他版本都同理,找到参数后即可

进入后台后,单击左边的mydomain—>Services—>JDBC—>Connection Pools
新建我就不说了,在我的文章里面有weblogic的数据源连接create

9.x的要解锁,那就先解锁。点击你想设置的数据源的名称进去。进去后点击上面的菜单Connections

看到参数设置了吧。

Initial Capacity:100   (初始化容器的连接数)
Maximum Capacity:1000  (容器中最大的连接数1000,如果超过/还没到1000就会报超出最大连接的错误,原因你的Oracle安装数据库的时候其池没设置大小,现在你也可以设置。设置方法:找到Oracle的init.ora文件这个文件一般在oracle/admin/数据库SID/pfile里面。找到large_pool_size这一句,把这一句删除,那就不受限制了。注意:没受限制的情况下不要调这个参数太大了,35000就OK了,太大的时候数据库会承受不起)
Capacity Increment:15   (一次增加多少个connection)
Statement Cache Size:50 (缓存大小)

按下下面的Advanced Options "Show",设置详细的配置
下面是JNDI的自动回收设置,比较重要,调几个重要的参数,其他的默认
Test Frequency:3600(测试频率,这个会消耗资源。这个看你的项目需要,一般代码写得比较好的可以设置长点时间
把下面三个都打上勾。通过测试,发现连接没关的就会被回收(详细说明可以看下面的参数说明)
Test Reserved Connections
Test Created Connections
Test Released Connections

Inactive Connection Timeout:60(无效连接超时!这个会在指定的时间内,回收无效连接)

网上有些人说设置这些参数后一定的时间会出现java.lang.OutOfMemoryError的错误
解决的方法就是调大JVM的内存,在启动时对jvm设置内存限度
通过修改commom\bin\commEnv.cmd文件来增加内存分配
修改的部分如下:
:bea
if "%PRODUCTION_MODE%" == "true" goto bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms768m -Xmx1024m
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto continue
:bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms768m -Xmx1024m//这些看你内存定1G的就设置=-Xms256m -Xmx512m
goto continue

:sun
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
set JAVA_VM=-client
set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto continue
:sun_prod_mode
set JAVA_VM=-server
set MEM_ARGS=-Xms768m -Xmx1024m -XX:MaxPermSize=256m//这个就解决了java.lang.OutOfMemoryError的错误
goto continue
将这里的内存分配修改后见效。

连接属性参数说明:

  * Initial Capacity:创建连接池时所创建的数据库连接的数目。
  * Maximum Capacity: 连接池中连接的最大数目。
  * Capacity Increment: 连接池容量在最大容量限制范围内的增量。
  * LoginDelay: 在创建每个物理数据库连接之前要延迟的秒数。
  * Allow Shrinking: 将该项设置为true时,如果没有使用额外的连接,则允许连接池把容量减小到InitialCapacity。
  * Shrink Frequency: 在减小连接池容量之前要等待的秒数。如果将Shrink Frequency设置为true,那么也必须将Allow Shrinking设置为true。
  * Test Frequency: 数据库连接测试之间间隔的秒数。在每个Refresh Period时间间隔之后,如果设置了TestTableName,就会使用TestTableName测试未使用的数据库连接。
  * Test Reserved Connections: 如果选择了这个选项,服务器会在把连接提供给客户端之前对其进行测试。
  * Test Created Connections: 如果选择了这个选项,就会在创建一个JDBC连接之后和在把它添加到JDBC连接池中的可用连接列表之前,对该JDBC连接进行测试。
  * Test Released Connections: 如果选择了这个选项,服务器就会在把连接返回给连接池之前对其进行测试。
  * Test Table Name: 用于JDBC连接测试的数据库表名。如果指定了Test Frequency,并且选择了Test Reserved Connections、Test Created Connections或Test Released Connections,则Table Name是必需的

连接属性参数说明来源于网上,大家从你项目角度设置
最后别忘记点最下面的APPLY按钮
posted @ 2010-01-08 17:22 陈周敏 阅读(2363) | 评论 (0)编辑 收藏

最近开发用的Weblogic的JNDI数据源连接,可是JNDI没有自动回收连接的功能!
项目不知道哪里代码写的时候没有关闭连接,造成有些连接是死连接
这样很容易造成数据库崩溃或者没连接

我的思路就是想把这个项目的用户都关闭,回收资源
我的PL/SQL中运行命令
SELECT s.Sid, s.Serial#,p.spid, s.USERNAME,s.OSUser,
s.Program  
FROM  V$Process p,V$session s WHERE p.addr=s.paddr(+ORDER BY s.Sid

有人用

alter system kill session 'sid,serial#' ;这个命令来杀死,可是资源不立刻回收


运行下面的语句就可以回收资源
查出连接用户后,在CMD中输入orakill 数据库名 SPID(EXP:orakill orcl XXX)


posted @ 2010-01-06 08:37 陈周敏 阅读(7298) | 评论 (0)编辑 收藏

记录dom的学习经验。下次忘记的时候直接来拿

<select id="typevalue" onChange="modifyType();">

<option value="1" id="0">11</option>

<option value="2" id="1">22</option>

<option value="3" id="2">33</option>

<option value="4" id="3">44</option>

<option value="5" id="4">55</option>

<option value="6" id="5">66</option>

<option value="7" id="10">77</option>

</select>



获取选中的option的text值
var typevalue = document.getElementById("typevalue");
var typevalueText = typevalue.options[typevalue.selectedIndex].text;

获取选中的option的ID值
var typevalue = document.getElementById("typevalue");
var typevalueId = typevalue.options[typevalue.selectedIndex].id;

posted @ 2009-12-17 15:01 陈周敏 阅读(865) | 评论 (0)编辑 收藏

1. Apache-DBCP

Ø BasicDataSource 相关的参数说明

  • dataSource: 要连接的 datasource (通常我们不会定义在 server.xml)
  • defaultAutoCommit: 对于事务是否 autoCommit, 默认值为 true
  • defaultReadOnly: 对于数据库是否只能读取, 默认值为 false
  • driverClassName:连接数据库所用的 JDBC Driver Class,
  • maxActive: 可以从对象池中取出的对象最大个数,为0则表示没有限制,默认为8
  • maxIdle: 最大等待连接中的数量,设 0 为没有限制 (对象池中对象最大个数)
  • minIdle:对象池中对象最小个数
  • maxWait: 最大等待秒数, 单位为 ms, 超过时间会丟出错误信息
  • password: 登陆数据库所用的密码
  • url: 连接数据库的 URL
  • username: 登陆数据库所用的帐号
  • validationQuery: 验证连接是否成功, SQL SELECT 指令至少要返回一行
  • removeAbandoned: 是否自我中断, 默认是 false
  • removeAbandonedTimeout: 几秒后会自我中断, removeAbandoned 必须为 true
  • logAbandoned: 是否记录中断事件, 默认为 false
  • minEvictableIdleTimeMillis:大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证;默认30分钟
  • timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程,默认-1
  • testOnBorrow:取得对象时是否进行验证,检查对象是否有效,默认为false
  • testOnReturn:返回对象时是否进行验证,检查对象是否有效,默认为false
  • testWhileIdle:空闲时是否进行验证,检查对象是否有效,默认为false

Ø 在使用DBCP的时候,如果使用默认值,则数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际上就会是无效的数据库连接。因此为了防止获得的数据库连接失效,在使用的时候最好保证:

  • username: 登陆数据库所用的帐号
  • validationQuerySELECT COUNT(*) FROM DUAL
  • testOnBorrowtestOnReturntestWhileIdle:最好都设为true
  • minEvictableIdleTimeMillis:大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证
  • timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程

Ø PS:在构造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也会使用GenericObjectPool] 时,会生成一个内嵌类Evictor,实现自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每过timeBetweenEvictionRunsMillis毫秒Evictor会调用evict()方法,检查对象的闲置时间是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟),是则销毁此对象,否则就激活并校验对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。在调用returnObject方法把对象放回对象池,首先检查该对象是否有效,然后调用PoolableObjectFactorypassivateObject方法使对象处于非活动状态。再检查对象池中对象个数是否小于maxIdle,是则可以把此对象放回对象池,否则销毁此对象

Ø 上述特性的可设置性已在代码中验证,具体性能是否能实现有待实际验证

2. C3P0

Ø C3P0的官方example中使用的数据源为ComboPooledDataSource,网上一篇文章详细介绍了C3P0连接池配置中各项含义[这些配置项的含义在下载解压c3p0的压缩包之后目录的doc\index.html中的Configuration部分也有详细的介绍,这里偷下懒:P],现摘录如下:

<c3p0-config>
<default-config>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement">3</property>

<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts">30</property>

<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
<property name="acquireRetryDelay">1000</property>

<!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
<property name="autoCommitOnClose">false</property>

<!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么
属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试
使用。Default: null-->
<property name="automaticTestTable">Test</property>

<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
<property name="breakAfterAcquireFailure">false</property>

<!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
<property name="checkoutTimeout">100</property>

<!--通过实现ConnectionTesterQueryConnectionTester的类来测试连接。类名需制定全路径。
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
<property name="connectionTesterClassName"></property>

<!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可
Default: null-->
<property name="factoryClassLocation">null</property>

<!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.
(文档原文)作者强烈建议不使用的一个属性-->
<property name="forceIgnoreUnresolvedTransactions">false</property>

<!--60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod">60</property>

<!--初始化时获取三个连接,取值应在minPoolSizemaxPoolSize之间。Default: 3 -->
<property name="initialPoolSize">3</property>

<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">60</property>

<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">15</property>

<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
如果maxStatementsmaxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
<property name="maxStatements">100</property>

<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection"></property>

<!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能
通过多线程实现多个操作同时被执行。Default: 3-->
<property name="numHelperThreads">3</property>

<!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0
的数据源时。Default: null-->
<property name="overrideDefaultUser">root</property>

<!--overrideDefaultUser参数对应使用的一个参数。Default: null-->
<property name="overrideDefaultPassword">password</property>

<!--密码。Default: null-->
<property name="password"></property>

<!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:
测试的表必须在初始数据源的时候就存在。Default: null-->
<property name="preferredTestQuery">select id from test where id=1</property>

<!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->
<property name="propertyCycle">300</property>

<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriodautomaticTestTable
等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout">false</property>

<!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
<property name="testConnectionOnCheckin">true</property>

<!--用户名。Default: null-->
<property name="user">root</property>

<!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数
允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始
广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到
支持,但今后可能的版本可能不支持动态反射代理。Default: false-->
<property name="usesTraditionalReflectiveProxies">false</property>

<property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">25</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">0</property>
    <user-overrides user="swaldman">
    </user-overrides>
</default-config>
<named-config name="dumbTestConfig">
    <property name="maxStatements">200</property>
    <user-overrides user="poop">
      <property name="maxStatements">300</property>
    </user-overrides>
   </named-config>
</c3p0-config>

Ø 上述特性的可设置性已在代码中验证,具体性能是否能实现有待实际验证

Ø 从配置项的内容来看,C3P0DBCP都有比较详细的有关连接检测保证的配置,我们可以看到C3P0可以控制数据源内加载的PreparedStatements数量,并且可以设置帮助线程的数量来提升JDBC操作的速度这些是DBCP未提供的;另外从网络上的评价来看,DBCP出现Bug的频率要大于C3P0,不过这一点有待于我们自己实际的检测。

3. Proxool

Ø Proxool的使用和dbcp以及c3p0稍有不同,我们需要并且只需要在使用基本的java.sql.DriverManager之前加载org.logicalcobwebs.proxool.ProxoolDriver驱动类,并且按照proxool定义的url格式 ["proxool." + alias + ":" + driverClass + ":" + driverUrl ,其中alias是为连接池自定义的别名] 来获得connection;具体的可以参看proxool doc下的UserGuide,或本文所附的示例代码。下面对连接池的特性配置作详细说明 [这个是自己翻译的,不一定准确,有问题时请参看doc下的Properties ~]

n fatal-sql-exception

以逗号隔开的异常列表,当设置了此项之后,每当出现SQLException时都将与列表中异常项作比较,如果匹配则认为出现fatal异常,这将导致connection被丢弃,并且不论出现任何情况该异常将被重抛一次以通知用户发生的情况。默认值为null

n fatal-sql-exception-wrapper-class

如果配置了fatal-sql-exception,则默认的操作是丢 弃引起SQLException的原因而只是抛出原始异常。使用fatal-sql-exception-wrapper-class这个特性可以将 SQLException包装到继承SQLException或RunTimeException的任何异常类里。Proxool提供了两个类供使用 FatalSQLException和FatalRunTimeException;使用这两个类的话就将该选项设置为 'org.logicalcobwebs.proxool.FatalSQLException'或者 'org.logicalcobwebs.proxool.FatalRuntimeException'。默认值为null

n house-keeping-sleep-time

proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁,默认值为30

n house-keeping-test-sql

如果侦察线程发现闲置连接,则会使用这个SQL语句来对这些连接进行检查;这项设置的语句应该能够被很快的执行,例如查询当前时间 [info.setProperty("proxool.house-keeping-test-sql", "select CURRENT_DATE");] 。如果不设置则该选项被忽略

n injectable-connection-interfaceinjectable-statement-interfaceinjectable-prepared-statement-interfaceinjectable-callable-statement-interface

n jmx

如果此项设为true,则连接池将被以名称"Proxool:type=Pool, name=<alias>"注册为JMS Server的MBean。默认值为false

n jmx-agent-id

当且仅当jmx选项设为true时使用,为以逗号分隔的连接持注册到的JMS代理名称列表;如果不设置则所有注册的JMX Server都将被使用

n maximum-active-time

线程最大存活时间,超过此时间的线程将被守护线程kill掉,默认值为5分钟

n maximum-connection-count

到数据库的最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由simultaneous-build-throttle决定;默认值为15

n maximum-connection-lifetime

连接最大存活时间,毫秒为单位,默认值为4小时

n minimum-connection-count

不管是否被使用都保持开放的最小连接数,默认值为5

n overload-without-refusal-lifetime

用来判断连接池状态,如果在此选项设置时间内(毫秒为单位)拒绝了连接,则认为过负载。默认值为60

n prototype-count

最少保持的空闲连接数,注意与minimum-connection-count区分。默认值为0

n simultaneous-build-throttle

最大的等待请求数,默认值为10

n test-before-use

如果设为true则connection在使用前将以house-keeping-test-sql设置的语句测试,如果测试不通过则该connection被丢弃并会重新分配一个connection。默认为false

n test-after-use

如果设为true则connection在关闭(放回连接池)前将以house-keeping-test-sql设置的语句测试,如果测试不通过connection将被丢弃。默认值为false

Ø 与其它连接池特性的设置方法不同,Proxool不提供相应的set方法,所有特性都要以诸如info.setProperty("proxool.jmx", "false");方式设定

Ø 上述特性的可设置性已在代码中验证,具体性能是否能实现有待实际验证

posted @ 2009-11-11 09:06 陈周敏 阅读(1029) | 评论 (0)编辑 收藏

Tomcat是一个小巧玲珑的好物,呵呵。一般开发少不了它。
Tomcat现在支持很多技术,下面我把我的TOMCAT上配置的数据源经验和大家分享

配置前的准备工作:先将你的连接数据库的JAR COPY到服务器的LIB文件夹下,供服务器调用(如现在用的是TOMCAT,那就将该JAR COPY到TOMCAT下的LIB文件夹)

打开项目的META-INF文件夹下的context.xml的文件(没有的新建一个context.xml文件)
修改其中的配置,详细的配置信息以下:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/TomcatDataSources" docBase="TomcatDataSources"
    debug="5" reloadable="true" crossContext="true">
        <Resource name="jdbc/czmds" auth="Container"
        type="javax.sql.DataSource" maxActive="100" maxIdle="30"
        maxWait="10000" username="root" password=""
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost/czm?characterEncoding=utf-8"/>  
</Context>

说明:context中的属性path为你的项目的上下文路径
      Resource中的属性name为该数据源的别名,这个自己喜欢定义



然后在web.xml下加上下面的配置
<resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/czmds</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>

说明:res-ref-name为你的数据源设定的别名

最后一步:测试连接是否成功,记得在JSP页面或Servlet上测试

提示:数据源获取连接的代码以下:
javax.naming.Context ctx = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource) ctx
                    .lookup("java:/comp/env/jdbc/czmds");
java.sql.Connection conn = ds.getConnection();  
说明:lookup是查找数据源的别名,这个就直接在java:/comp/env/后加别名,以上


说到最后,一定要记得关连接

posted @ 2009-11-10 16:22 陈周敏 阅读(1857) | 评论 (1)编辑 收藏

连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能


所以一个项目访问数据库比较频繁的时候,就要用到连接池,一般连接池本人都觉得proxool比较好(这个网上的都是这样说,呵呵),我以前一直都用C3P0连接池,发觉速度还不错,不过不大稳定!
不说那么多,浅谈下我的proxool的经验

准备前的工作:
到proxool官网http://proxool.sourceforge.net/上下载JAR包和文档
然后解压,把里面的proxool-0.9.1.jar和proxool-cglib.jar放到你的服务器的lib下面(好像我用的是TOMCAT,就放到TOMCAT的lib里面,供TOMCAT调用)

先在WEB-INF下建立以个proxool.xml的文件
详细的配置以下:

<?xml version="1.0" encoding="UTF-8"?>
<!--
    Document   : proxool.xml
    Created on : 2009年11月9日, 下午3:15
    Author     : Administrator
    Description:
        Purpose of the document follows.
-->
<something-else-entirely>
    <proxool>
        <alias>mypool</alias>

        <driver-url>jdbc:mysql://localhost/czm?characterEncoding=utf-8</driver-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>

        <driver-properties>
            <property name="user" value="root"/>
            <property name="password" value=""/>
        </driver-properties>

        <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->
        <house-keeping-sleep-time>300000</house-keeping-sleep-time>

        <!--最大的等待请求数,即因没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
        <proxool.simultaneous-build-throttle>200</proxool.simultaneous-build-throttle>

        <!-- maximum-new-connections>50</maximum-new-connections-->

         <!-- 最少保持的空闲连接数-->
        <prototype-count>5</prototype-count>
        <!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定-->
        <maximum-connection-count>100</maximum-connection-count>

         <!-- 最小连接数-->
        <minimum-connection-count>25</minimum-connection-count>      

        <maximum-active-time>300000</maximum-active-time>
        <maximum-connection-lifetime>3600000</maximum-connection-lifetime>


        <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>

    </proxool>
</something-else-entirely>



接着在web.xml下做个插件
详细配置以下:

<servlet>
        <servlet-name>ServletConfigurator</servlet-name>
        <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
        <init-param>
            <param-name>xmlFile</param-name>
            <param-value>WEB-INF/proxool.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Admin</servlet-name>
        <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Admin</servlet-name>
        <url-pattern>/proxool</url-pattern><!--这个设置是你的项目的上下文路径-->
    </servlet-mapping>

web.xml配置完后,剩下的就是写个测试连接类
新建一个jsp页面,页面内容以下:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <%
        java.sql.Connection conn = java.sql.DriverManager.getConnection("proxool.myself");
        System.out.println("conn:" + conn);
        out.print("conn:" + conn);
        conn.close();
        %>
    </body>
</html>


OK.运行该页面看看是否成功?
以前我就是在类中测试,发觉它连接不上,报
java.sql.SQLException: No suitable driver found for proxool.myself
的错误。
所以一定要用JSP或servlet来测试,因为它调用到服务器


posted @ 2009-11-10 15:47 陈周敏 阅读(2975) | 评论 (1)编辑 收藏

我对异常抛出的情况作啦一个总结,下面的是我在做项目的时候,处理抛出来的经典异常。

严重: action: null
java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
        at org.apache.struts.util.RequestUtils.applicationClass(RequestUtils.java:124)
        at org.apache.struts.util.RequestUtils.applicationInstance(RequestUtils.java:172)
        at org.apache.struts.util.RequestUtils.applicationInstance(RequestUtils.java:147)
        at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:842)
        at org.apache.struts.action.ActionServlet.init(ActionServlet.java:359)
        at javax.servlet.GenericServlet.init(GenericServlet.java:212)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1172)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:992)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4371)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:627)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:511)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1231)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
        at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1471)
        at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:824)
        at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:350)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
2009-6-13 19:47:25 org.apache.catalina.core.ApplicationContext log


这个异常我看不少人都遇到吧,看着这个异常,你觉得是不是很郁闷,刚开始看到这个action: null就想:“是Struts里出啦问题,肯定是参数不对应ActionForm造成的吧!”然后就拼命地在页面和ActionForm来作对照,对来对去都是一样啊!怎么还是有错呢?刚刚开始我也是这样想的,可是做啦一大堆的无用功后,就发现我这种想法是错的!每次部署后还是这个错,你再细心地看下面的那个错误“java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn”,这个org.springframework.web.struts.ContextLoaderPlugIn这个东西是不是很熟悉呢?仔细找下看,发现你的Struts-config.xml里面是不是也有这样一段话:
    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
        <set-property property="contextConfigLocation"
   value="/WEB-INF/applicationContext.xml"/>
    </plug-in>
问题就出在这里啦!不过有些人找到问题所在后,也不会认为这里有问题,就算这里有问题,最多就是Spring的配置文件不对应!然后就去修改一下配置文件,可是还是于是无补!

我经过一段时间的思考后,就想啦一下,这个既然是Spring的配置文件,那一定和它的插件有关,是不是Spring和Struts整合不好呢?然后就查了一下库文件,发现Spring库文件导入的是很少!上网查下资料,发现对于这个问题的很少有答案,有人提出的可是找不到问题所在!我就去啦Spring的官网下载它的库文件和一些相应的资料来,在找资料的过程中,我也下载啦一个叫spring-struts.jar的库文件,这个文件看起来好象是Spring整合Struts的库文件!有啦这几个东西,我就开始开工测试
我就先按我的猜想,先导入spring-struts.jar这文件,部署后,发现没错误,运行也没错!果然证实我的想法没错
然后我还把下载来的Spring官网的最新的库文件,发现找不到spring-struts.jar这个库文件。然后我一个个测试后,原来这个库文件是集成在spring-web.jar里面啦!
我把spring-struts.jar去掉后,导入Spring官方的最新的相关库文件后(不能全部导,全部导入也会有错误,用到的才能导!),程序也没发生任何错误

以下的是我用到的库文件,本人测试过没问题
http://www.blogjava.net/Files/czmchen/ssh中Spring的库文件.rar
http://www.blogjava.net/Files/czmchen/spring-struts.jar.zip
posted @ 2009-06-13 20:20 陈周敏 阅读(1549) | 评论 (6)编辑 收藏