- 浏览: 420768 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (114)
- C++ (1)
- JAVA (58)
- sql,oracle,mysql (7)
- struts (2)
- tomcat (6)
- JS CSS (6)
- 其他 (7)
- javascript (4)
- exception (1)
- error (1)
- hashmap (1)
- hashset (1)
- python (1)
- sql (2)
- oracle (4)
- mysql (2)
- weblogic (3)
- session (2)
- http-only-cookie (1)
- httponly (1)
- cookie (1)
- ide (0)
- intellij (1)
- eclipse (2)
- idea (1)
- connection (2)
- maven (4)
- m2eclipse (2)
- m2e (2)
- InetAddress (1)
- DNS (1)
- web (1)
- goals (1)
- copy-dependencies (1)
- unpack (1)
- hash (1)
- 分布式 (1)
- gc (4)
- volatile (1)
- rsa (1)
- 加密 (1)
- 签名 (1)
- socket (1)
- tcp (1)
最新评论
-
xuxiaoyinliu:
谢谢,不错哦
有关cookie的httponly属性相关 -
雁行:
svn根本就不需要这么罗嗦的实现。
版本比较,直接出增量文件, ...
ant+cvs实现增量部署 -
ludatong110:
这个东西在IE里面会很明显的,我就碰到过IE中因为这个HTML ...
有关jqGrid应用里的字体大小不能控制的问题 -
labchy:
非常感谢 解决了问题
有关jqGrid应用里的字体大小不能控制的问题 -
tengyue5i5j:
Crusader 写道竟然有这么多人投良好。。。
楼主的思路有 ...
java实现一个栈,并提供取该栈中最大数的方法,复杂度O(1)
1:先是配置文件:
<?xml version="1.0" encoding="gb2312"?> <!-- the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored. --> <something-else-entirely> <proxool> <alias>example</alias> <driver-url> jdbc:oracle:thin:@*.*.*.*:1521:**** </driver-url> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <driver-properties> <property name="user" value="*****" /> <property name="password" value="*****" /> </driver-properties> <!--最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 --> <maximum-connection-count>20</maximum-connection-count> <!--最小连接数(默认2个,包含活动的和空闲的)--> <minimum-connection-count>4</minimum-connection-count> <!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒--> <house-keeping-sleep-time>30000</house-keeping-sleep-time> <!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--> <!-- maximum-new-connections不被推荐使用了,所以用simultaneous-build-throttle来代替了 --> <simultaneous-build-throttle>15</simultaneous-build-throttle> <!--maximum-new-connections>10</maximum-new-connections--> <!--最少保持的空闲连接数(默认2个)--> <prototype-count>2</prototype-count> <!-- maximum-active-time缺省5minutes 172800000毫秒=48小时--> <maximum-active-time>172800000</maximum-active-time> <!-- maximum-connection-lifetime缺省4hours 180000000毫秒=50小时--> <maximum-connection-lifetime>180000000</maximum-connection-lifetime> <!--在使用之前测试--> <test-before-use>false</test-before-use> <!--用于保持连接的测试语句 --> <!-- house-keeping-test-sql> select sysdate from dual </house-keeping-test-sql --> <!-- 是否监控sql信息 --> <trace>true</trace> <!-- statistics>10s,1m</statistics --> <!-- statistics-log-level>DEBUG</statistics-log-level --> </proxool> </something-else-entirely>
注释:(以上的数据连接IP和用户名密码根据自己的实际情况填写)
配置文件里的两行
<!-- maximum-active-time缺省5minutes 172800000毫秒=48小时-->
<maximum-active-time>172800000</maximum-active-time>
<!-- maximum-connection-lifetime缺省4hours 180000000毫秒=50小时-->
<maximum-connection-lifetime>180000000</maximum-connection-lifetime>
第一个48小时的是设置连接活动的时间,即:你的sql或存储过程执行的时间,估算一下你的应用中的sql或存储过程最长的执行时间a,将这个值设为大于a就行了,这是项目中实际发现的问题经验,我有个sql执行时间超过了5分钟,而原来没有设置这个值,缺省为5分钟,所以我的应用刚起来没问题,跑一段时间,跑到这个sql时执行了一段时间后台就报:
java.sql.SQLException: Couldn't perform the operation prepareStatement: You can't perform any operations on this connection. It has been automatically closed by Proxool for some reason (see logs).
这个错误,后来去官方网页查看Properties发现,如果超过这个值,proxool就会自动kill掉这个连接。
第二个50个小时是设置连接的寿命,这个值理论上应该大于连接的活动时间限制,不然活动时间限制就没有意义了,所以设为了50个小时
2:连接类
package com.ai.dyjf.base; import java.io.FileWriter; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; import org.logicalcobwebs.proxool.ConnectionInfoIF; import org.logicalcobwebs.proxool.ConnectionPoolDefinitionIF; import org.logicalcobwebs.proxool.ProxoolException; import org.logicalcobwebs.proxool.ProxoolFacade; import org.logicalcobwebs.proxool.admin.SnapshotIF; import org.logicalcobwebs.proxool.configuration.JAXPConfigurator; import org.xml.sax.InputSource; import com.toolkit.my.db.DBAException; import com.toolkit.my.db.base.IDBConnectionPool; public class CCConnectionPoolUtil implements IDBConnectionPool{ private static int activeCount = 0;//当前连接数 static { try { JAXPConfigurator.configure(new InputSource(CCConnectionPoolUtil.class.getResourceAsStream("proxoolCC.xml")), false); } catch (ProxoolException e) { System.out .println("没有找到proxool的配置文件,请查看/src/com/ai/dyjf/base/proxoolCC.xml是否存在!"); e.printStackTrace(); } } /** * 测试用的获取数据库连接 * @return */ public Connection getConnectionFromPool() { Connection conn = null; // // 1:注册驱动类,这次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动 // try { // Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); // // 2:创建数据库连接,这个参数是一个字符串,是数据源的别名,在配置文件中配置的timalias,参数格式为:proxool.数据源的别名 // conn = DriverManager.getConnection("proxool.example"); // ConnectionPoolDefinitionIF cpd =ProxoolFacade.getConnectionPoolDefinition("example"); // SnapshotIF snapshotIF=ProxoolFacade.getSnapshot("example", true); // int curActiveCount = snapshotIF.getActiveConnectionCount();// 获得活动(正在使用的busy)连接数 // if (curActiveCount != activeCount)// 当活动连接数变化时输出信息 // { // System.out.println("activeCount:"+activeCount); // FileWriter fw=null; // SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // int availableCount = snapshotIF.getAvailableConnectionCount();// 获得可得到的(空闲的free)连接数 // int maxCount = snapshotIF.getMaximumConnectionCount();// 获得总连接数(最大的) // int offlineCount=snapshotIF.getOfflineConnectionCount();//获得不在线的连接数(释放的) // long refusedCount=snapshotIF.getRefusedCount();//How many connections have been refused since the pool started // long servedCount=snapshotIF.getServedCount();//How many connections have been served since the pool started // // // Date snapshotDate=snapshotIF.getSnapshotDate(); // ConnectionInfoIF[] connIF=snapshotIF.getConnectionInfos(); // try { // fw=new FileWriter("proxoolCC.log",true); // fw.write("\n\n----------------连接数信息------------------\n"); // fw.write("监控时间:"+sdf.format(snapshotDate)+"\n"); // fw.write("busy连接数:"+curActiveCount+"\n"); // fw.write("free连接数:"+availableCount+"\n"); // fw.write("max连接数:"+maxCount+"\n"); // fw.write("offlineCount连接数:"+offlineCount+"\n"); // fw.write("refusedCount连接数:"+refusedCount+"\n"); // fw.write("servedCount连接数:"+servedCount+"\n"); // fw.write("----------------连接信息-----------------\n"); // for(int i=0;i<connIF.length;i++){ // ConnectionInfoIF connInfo=connIF[i]; // fw.write("ConnectionId号:"+connInfo.getId()+"\n"); // fw.write("Connection初始化时间:"+sdf.format(new Date(connInfo.getBirthTime()))+"\n"); // fw.write("Connection年龄(mis):"+connInfo.getAge()+"\n"); // fw.write("Connection状态(active-2;available-1;null-0;offline-3):"+connInfo.getStatus()+"\n"); // fw.write("Connection最后一次活动开始时间:"+sdf.format(new Date(connInfo.getTimeLastStartActive()))+"\n"); // fw.write("Connection最后一次活动结束时间:"+sdf.format(new Date(connInfo.getTimeLastStopActive()))+"\n"); // fw.write("Connection最后一次活动占用时长(mis):"+(connInfo.getTimeLastStopActive()-connInfo.getTimeLastStartActive())+"\n"); // String[] sqlCallsStrs=connInfo.getSqlCalls(); // for(int j=0;i<sqlCallsStrs.length;j++){ // fw.write("---------该连接执行的sql语句----------"); // fw.write(sqlCallsStrs[j]); // fw.write("-----------------------------------"); // } // // } // activeCount = curActiveCount; // } catch (IOException e) { // e.printStackTrace(); // }finally{ // if(null!=fw){ // try {fw.close();} catch (IOException e) {e.printStackTrace();} // } // } //// System.out.println("----------------------------------"); //// System.out.println("监控时间:"+new SimpleDateFormat("yyyy-MM-dd HH24:mm:ss").format(snapshotDate)); //// System.out.println("busy连接数:"+curActiveCount); //// System.out.println("free连接数:"+availableCount); //// System.out.println("max连接数:"+maxCount); //// System.out.println("offlineCount连接数:"+offlineCount); //// System.out.println("refusedCount连接数:"+refusedCount); //// System.out.println("servedCount连接数:"+servedCount); //// System.out.println("trace:"+cpd.isTrace()); //// System.out.println("trace:"+cpd.getStatisticsLogLevel()); ////// System.out.println(curActiveCount + "(active) " + availableCount + "(available) " + maxCount + "(max)"); //// System.out.println("----------------------------------"); //// activeCount = curActiveCount; // } // // } catch (ClassNotFoundException e) { // e.printStackTrace(); // } catch (SQLException e) { // e.printStackTrace(); // } catch (ProxoolException e) { // e.printStackTrace(); // } return conn; } /** * 关闭数据库连接 * @param conn */ public void releaseConnection(Connection conn){ try { //关闭数据库连接 // Check to see we actually got a connection before we // attempt to close it. if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } public void close() throws DBAException { } /** * 真正业务调用的连接 */ public Connection fetchConnection() throws DBAException { Connection conn = null; // 1:注册驱动类,这次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动 try { Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); // 2:创建数据库连接,这个参数是一个字符串,是数据源的别名,在配置文件中配置的timalias,参数格式为:proxool.数据源的别名 conn = DriverManager.getConnection("proxool.example"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
注释:
上面getConnectionFromPool() 这个方法是自己测试连接的方法,自己可以根据实际情况查看连接池的状态
另:如果是java应用使用Proxool则需要自己写 单例连接池获取类 实现,并保证连 该获取类的生命周期不销毁,
比如可以写监听类(用死循环实现),或是用定时任务TimeTask实现定时类,在定时类里去连接。总之就是要保证这个java应用的main不会结束,要保证连接池类的生命周期不被销毁并保持单例.
下面是个简单的提示类:
public class SysUtil { private IDBConnectionPool dbConnectionPool; private IConfigReader configReader; private ILogger logger; private int maxLogLevel = 0; private boolean systemOut = false; private static SysUtil _inst = null; static public SysUtil instance(){ if(_inst == null){ _inst = new SysUtil(); } return _inst; } private SysUtil(){ init(); } private void init(){ try{ configReader = new PropertiesConfig("config.txt"); // dbConnectionPool = new NoConnectionPool(configReader.getValue("DBDirver"),configReader.getValue("DBUrl") // ,configReader.getValue("DBUser"),configReader.getValue("DBPass")); // 修改了通过连接池的实现 dbConnectionPool=new CCConnectionPoolUtil(); logger = new DBTableLogger(dbConnectionPool); ((ChainLogger)logger).setNextLogger(new Log4jLogger("log4j.properties","")); // 这里传true才能正确解释,传false感觉没道理 ((ChainLogger)logger).setOnlyOnError(true); maxLogLevel = Integer.parseInt(configReader.getValue("MaxLogLevel")); systemOut = configReader.getValue("SYSTEMOUT").toUpperCase()=="TRUE"?true:false; }catch(ConfigException ce){ ce.printStackTrace(); throw new RuntimeException("SysUtil初始化失败!"+ce.getMessage(),ce); } } public String getConfigValue(String key) throws ConfigException{ return configReader.getValue(key); } public Connection fetchConnection() throws DBAException{ return dbConnectionPool.fetchConnection(); } public void releaseConnection(Connection connection) throws DBAException{ dbConnectionPool.releaseConnection(connection); } }
只看上面类的部分代码,这个类就是用来从 CCConnectionPoolUtil 类里去连接的单例工具类
然后你可以在你的TimerTask里用这个工具类来取数据库连接实现逻辑,或这是你的不会结束的main里调用这个工具类来取数据库连接. 例如main里调用task的start,或是mian里用for(;;){这里分线程去做业务逻辑;}
如果是在web应用中使用Proxool则网上有很多怎么和web.xml或是spring配置结合的例子,这里就不在概述了!
发表评论
-
(转)国外Java技术网站
2013-05-16 09:35 1482java开发者必去的国外网站 http://www.onj ... -
my97 datepicker的'$db.cal'为空或不是对象问题解决参考
2011-08-11 15:26 2833前言: 原来项目只有 ... -
转载【RBAC权限模型的运用】
2011-05-13 22:57 1168RBAC 是英文(Role-Based Access ... -
iis6配置自我总结
2010-05-24 11:16 1988注意iis6需要先在网站下的web服务扩展下发布iisforw ... -
类似一周任务查询和航班计划的实现,可参考权限值的方法
2010-05-04 22:19 1167可以采用类似权限值的解决方案,如下: 采用2的n次幂组 ... -
如何减少网页的内存与CPU占用
2008-10-22 08:46 1542感谢:嗷嗷的这篇文章非 ...
相关推荐
这样,当应用程序需要数据库连接时,可以从Proxool的连接池中获取,使用完毕后再归还,有效地提高了系统的并发处理能力和资源利用率。 在提供的压缩包文件中,"proxool-0.9.1"可能是Proxool的源码或文档,用于深入...
Proxool作为数据库连接池,通过配置参数可以灵活地调整连接池的行为,以满足不同性能和稳定性需求。Spring框架中的DataSource配置使得Proxool的集成变得简单,而proxool-0.9.1.jar和proxool-cglib.jar是运行Proxool...
在Proxool的场景下,CGLIB则用于动态生成代理类,以便在数据库连接池中进行控制和跟踪。 **连接池配置** "用于连接池的配置"这一描述表明,这两个jar文件不仅包含了Proxool的实现,还可能涉及到配置文件或者API,...
标题中的"proxool-0.9.1.jar"和"proxool-cglib.jar"是两个重要的Java档案文件,它们是Proxool项目的组件。Proxool是一个开源的数据库连接池解决方案,它允许开发者在Java应用程序中高效地管理数据库连接。数据库连接...
在IT行业中,数据库连接池是优化数据库访问性能和资源管理的重要工具。Proxool是一个开源的、轻量级的Java数据库连接池实现,它提供了一种高效、灵活的方式来管理数据库连接。在某些场景下,为了保护敏感信息,如...
**Proxool 0.9.1:数据库连接池详解** `Proxool` 是一个开源的、基于Java的数据库连接池,它提供了一种高效、灵活的方式来管理和控制数据库连接。在0.9.1版本中,这个工具为开发者提供了更稳定的性能和优化的资源...
- **连接获取**: 当需要数据库连接时,SqlProxyFactory会从连接池中获取一个代理连接,如果池中没有空闲连接,它会根据配置创建新的数据库连接。 - **连接释放**: 使用完毕后,应用程序调用代理连接的关闭方法,...
**Proxool0.9.1** 是一个轻量级的数据库连接池,它的主要任务是管理和复用数据库连接,以优化性能和资源利用率。数据库连接池在多用户环境下至关重要,因为它避免了频繁创建和销毁数据库连接的开销。Proxool提供了...
java中利用proxool方式创建数据库连接池
"Proxool-0.9.1-source"是Proxool的一个特定版本的源代码包,主要用于数据库连接池管理。Proxool是一个开源的、基于Java的数据库连接池实现,它提供了一种灵活且可扩展的方式来管理和优化数据库连接。在这个0.9.1...
在0.9.1版本中,虽然有一些配置上的变动,但它仍然是一个常用的数据库连接池解决方案,尤其对于那些希望避免频繁创建和关闭数据库连接的项目。 配置Proxool主要涉及编辑`proxool.xml`文件,这个文件包含了所有关于...
标题 "Hibernate3.5.1+Proxool0.9.1+Oracle10g2实现关键" 提供了一个关于整合三个技术的实践场景:Hibernate 3.5.1(一个流行的Java对象关系映射框架),Proxool 0.9.1(一个数据库连接池)以及Oracle 10g 2(一种...
当应用程序需要与数据库交互时,它会从连接池中获取一个已存在的连接,而不是每次都创建新的连接。使用完毕后,连接会归还给池,而不是直接关闭,从而避免了频繁建立和关闭连接带来的开销。这种机制显著提高了数据库...
标签"proxool jar"强调了这些文件是与Proxool相关的JAR文件,表明它们可以被添加到Java项目中,以利用Proxool的数据库连接池服务。 根据压缩包子文件的文件名称列表,只有一个条目"proxool-0.9.1",这可能是目录名...
4. **自动裁剪**:当连接池中的空闲连接超过设定值时,Proxool会自动裁剪多余的连接,节省资源。 5. **透明集成**:Proxool支持JDBC API,可以无缝地与使用JDBC的应用程序集成。 在实际使用中,`proxool.properties...
本文将深入探讨Proxool 0.9.1,这是一个轻量级的、高效的数据库连接池技术,以及如何将其与Hibernate集成进行配置,让你一学就会。 **什么是Proxool?** Proxool是Proxy + Pool的缩写,它是一个开源的JDBC连接池实现...
proxool-0.9.1(my).jar 包是我修改了proxool-0.9.1后的jar包,修改后可以完全支持spring配置,并添加了charSet配置属性,用于配置数据库链接的设置默认字符集,并且解决了proxool数据库连接池报如下错误的问题:...
首先,`proxool-0.9.1.jar`是Proxool数据库连接池的实现库,它是一个开源的、轻量级的Java连接池解决方案。Proxool允许开发者在应用中使用多个数据库连接,并通过池化技术来减少创建和销毁数据库连接的开销。这个...
4. 获取和释放连接:在需要访问数据库时,从连接池中获取连接;完成操作后,记得释放回连接池,而不是直接关闭。 5. 监控和诊断:定期检查Proxool的监控信息,确保连接池的健康运行。 总的来说,Proxool是一个强大...